From 12e051379fb536a24f47354943d647c362c49a94 Mon Sep 17 00:00:00 2001 From: Sean Hsu Date: Thu, 15 Jan 2026 12:56:19 -0500 Subject: [PATCH 01/21] docs: add sample JER messages for J2735 --- j2735codec/core/202409/samples/jer/bsm.json | 40 ++ j2735codec/core/202409/samples/jer/eva.json | 52 ++ j2735codec/core/202409/samples/jer/map.json | 668 +++++++++++++++++++ j2735codec/core/202409/samples/jer/psm.json | 20 + j2735codec/core/202409/samples/jer/sdsm.json | 62 ++ j2735codec/core/202409/samples/jer/spat.json | 77 +++ j2735codec/core/202409/samples/jer/tim.json | 101 +++ 7 files changed, 1020 insertions(+) create mode 100644 j2735codec/core/202409/samples/jer/bsm.json create mode 100644 j2735codec/core/202409/samples/jer/eva.json create mode 100644 j2735codec/core/202409/samples/jer/map.json create mode 100644 j2735codec/core/202409/samples/jer/psm.json create mode 100644 j2735codec/core/202409/samples/jer/sdsm.json create mode 100644 j2735codec/core/202409/samples/jer/spat.json create mode 100644 j2735codec/core/202409/samples/jer/tim.json diff --git a/j2735codec/core/202409/samples/jer/bsm.json b/j2735codec/core/202409/samples/jer/bsm.json new file mode 100644 index 0000000..5b4bc44 --- /dev/null +++ b/j2735codec/core/202409/samples/jer/bsm.json @@ -0,0 +1,40 @@ +{ + "messageId": 20, + "value": { + "coreData": { + "msgCnt": 1, + "id": "0A0B0C0D", + "secMark": 12345, + "lat": 389123456, + "long": -771234567, + "elev": 300, + "accuracy": { + "semiMajor": 50, + "semiMinor": 50, + "orientation": 0 + }, + "transmission": "forwardGears", + "speed": 150, + "heading": 9000, + "angle": 0, + "accelSet": { + "long": 0, + "lat": 0, + "vert": -127, + "yaw": 0 + }, + "brakes": { + "wheelBrakes": "00", + "traction": "on", + "abs": "unavailable", + "scs": "unavailable", + "brakeBoost": "unavailable", + "auxBrakes": "unavailable" + }, + "size": { + "width": 180, + "length": 420 + } + } + } +} \ No newline at end of file diff --git a/j2735codec/core/202409/samples/jer/eva.json b/j2735codec/core/202409/samples/jer/eva.json new file mode 100644 index 0000000..55b9810 --- /dev/null +++ b/j2735codec/core/202409/samples/jer/eva.json @@ -0,0 +1,52 @@ +{ + "messageId": 22, + "value": { + "rsaMsg": { + "msgCnt": 5, + "timeStamp": 54500, + "typeEvent": 16132, + "description": [ + 16130, + 16131 + ], + "position": { + "utcTime": { + "year": 2025, + "month": 6, + "day": 18, + "hour": 21, + "minute": 50, + "second": 54000, + "offset": -240 + }, + "long": -739856500, + "lat": 407580000, + "elevation": 1234, + "heading": 18000, + "speed": { + "transmisson": "forwardGears", + "speed": 1341 + }, + "posAccuracy": { + "semiMajor": 10, + "semiMinor": 10, + "orientation": 32767 + }, + "timeConfidence": "time-000-001", + "posConfidence": { + "pos": "a1m", + "elevation": "elev-001-00" + }, + "speedConfidence": { + "heading": "prec0-1deg", + "speed": "prec0-1ms", + "throttle": "prec1percent" + } + }, + "priority": "E0", + "heading": "8181", + "extent": "useFor500meters", + "furtherInfoID": "FF01" + } + } +} \ No newline at end of file diff --git a/j2735codec/core/202409/samples/jer/map.json b/j2735codec/core/202409/samples/jer/map.json new file mode 100644 index 0000000..64db513 --- /dev/null +++ b/j2735codec/core/202409/samples/jer/map.json @@ -0,0 +1,668 @@ +{ + "messageId": 18, + "value": { + "msgIssueRevision": 0, + "intersections": [ + { + "name": "Garland Ave. & Robinson St.", + "id": { + "id": 51507 + }, + "revision": 1, + "refPoint": { + "lat": 285457290, + "long": -813819380 + }, + "laneWidth": 350, + "laneSet": [ + { + "laneID": 1, + "laneAttributes": { + "directionalUse": "40", + "sharedWith": "0000", + "laneType": { + "vehicle": { + "value": "00", + "length": 8 + } + } + }, + "maneuvers": "0000", + "nodeList": { + "nodes": [ + { + "delta": { + "node-XY3": { + "x": -473, + "y": 1540 + } + } + }, + { + "delta": { + "node-XY3": { + "x": -66, + "y": 2046 + } + } + } + ] + } + }, + { + "laneID": 2, + "laneAttributes": { + "directionalUse": "40", + "sharedWith": "0000", + "laneType": { + "vehicle": { + "value": "00", + "length": 8 + } + } + }, + "maneuvers": "0000", + "nodeList": { + "nodes": [ + { + "delta": { + "node-XY3": { + "x": -132, + "y": 1551 + } + } + }, + { + "delta": { + "node-XY3": { + "x": -66, + "y": 2046 + } + } + } + ] + } + }, + { + "laneID": 3, + "laneAttributes": { + "directionalUse": "40", + "sharedWith": "0000", + "laneType": { + "vehicle": { + "value": "00", + "length": 8 + } + } + }, + "maneuvers": "0000", + "nodeList": { + "nodes": [ + { + "delta": { + "node-XY3": { + "x": 222, + "y": 1537 + } + } + }, + { + "delta": { + "node-XY3": { + "x": -66, + "y": 2046 + } + } + } + ] + } + }, + { + "laneID": 4, + "laneAttributes": { + "directionalUse": "80", + "sharedWith": "0000", + "laneType": { + "vehicle": { + "value": "00", + "length": 8 + } + } + }, + "maneuvers": "0000", + "nodeList": { + "nodes": [ + { + "delta": { + "node-XY3": { + "x": 1952, + "y": 115 + } + } + }, + { + "delta": { + "node-XY4": { + "x": 2911, + "y": -26 + } + } + } + ] + }, + "connectsTo": [ + { + "connectingLane": { + "lane": 16 + }, + "signalGroup": 4 + }, + { + "connectingLane": { + "lane": 3 + }, + "signalGroup": 4 + } + ] + }, + { + "laneID": 5, + "laneAttributes": { + "directionalUse": "80", + "sharedWith": "0000", + "laneType": { + "vehicle": { + "value": "00", + "length": 8 + } + } + }, + "maneuvers": "0000", + "nodeList": { + "nodes": [ + { + "delta": { + "node-XY3": { + "x": 1965, + "y": -201 + } + } + }, + { + "delta": { + "node-XY4": { + "x": 2990, + "y": -14 + } + } + } + ] + }, + "connectsTo": [ + { + "connectingLane": { + "lane": 15 + }, + "signalGroup": 4 + } + ] + }, + { + "laneID": 6, + "laneAttributes": { + "directionalUse": "40", + "sharedWith": "0000", + "laneType": { + "vehicle": { + "value": "00", + "length": 8 + } + } + }, + "maneuvers": "0000", + "nodeList": { + "nodes": [ + { + "delta": { + "node-XY3": { + "x": 1991, + "y": -500 + } + } + }, + { + "delta": { + "node-XY3": { + "x": 1901, + "y": 0 + } + } + } + ] + } + }, + { + "laneID": 7, + "laneAttributes": { + "directionalUse": "40", + "sharedWith": "0000", + "laneType": { + "vehicle": { + "value": "00", + "length": 8 + } + } + }, + "maneuvers": "0000", + "nodeList": { + "nodes": [ + { + "delta": { + "node-XY3": { + "x": 2005, + "y": -830 + } + } + }, + { + "delta": { + "node-XY3": { + "x": 1874, + "y": 0 + } + } + } + ] + } + }, + { + "laneID": 8, + "laneAttributes": { + "directionalUse": "80", + "sharedWith": "0000", + "laneType": { + "vehicle": { + "value": "00", + "length": 8 + } + } + }, + "maneuvers": "0000", + "nodeList": { + "nodes": [ + { + "delta": { + "node-XY4": { + "x": 863, + "y": -2089 + } + } + }, + { + "delta": { + "node-XY5": { + "x": 393, + "y": -4171 + } + } + } + ] + }, + "connectsTo": [ + { + "connectingLane": { + "lane": 7 + }, + "signalGroup": 6 + } + ] + }, + { + "laneID": 9, + "laneAttributes": { + "directionalUse": "80", + "sharedWith": "0000", + "laneType": { + "vehicle": { + "value": "00", + "length": 8 + } + } + }, + "maneuvers": "0000", + "nodeList": { + "nodes": [ + { + "delta": { + "node-XY4": { + "x": 443, + "y": -2116 + } + } + }, + { + "delta": { + "node-XY4": { + "x": 183, + "y": -2335 + } + } + }, + { + "delta": { + "node-XY5": { + "x": 524, + "y": -5101 + } + } + } + ] + }, + "connectsTo": [ + { + "connectingLane": { + "lane": 3 + }, + "signalGroup": 6 + } + ] + }, + { + "laneID": 10, + "laneAttributes": { + "directionalUse": "80", + "sharedWith": "0000", + "laneType": { + "vehicle": { + "value": "00", + "length": 8 + } + } + }, + "maneuvers": "0000", + "nodeList": { + "nodes": [ + { + "delta": { + "node-XY4": { + "x": 116, + "y": -2117 + } + } + }, + { + "delta": { + "node-XY4": { + "x": 182, + "y": -2335 + } + } + }, + { + "delta": { + "node-XY5": { + "x": 525, + "y": -5102 + } + } + } + ] + }, + "connectsTo": [ + { + "connectingLane": { + "lane": 2 + }, + "signalGroup": 6 + } + ] + }, + { + "laneID": 11, + "laneAttributes": { + "directionalUse": "80", + "sharedWith": "0000", + "laneType": { + "vehicle": { + "value": "00", + "length": 8 + } + } + }, + "maneuvers": "0000", + "nodeList": { + "nodes": [ + { + "delta": { + "node-XY4": { + "x": -238, + "y": -2119 + } + } + }, + { + "delta": { + "node-XY4": { + "x": 182, + "y": -2335 + } + } + }, + { + "delta": { + "node-XY5": { + "x": 525, + "y": -5101 + } + } + } + ] + }, + "connectsTo": [ + { + "connectingLane": { + "lane": 1 + }, + "signalGroup": 6 + } + ] + }, + { + "laneID": 14, + "laneAttributes": { + "directionalUse": "80", + "sharedWith": "0000", + "laneType": { + "vehicle": { + "value": "00", + "length": 8 + } + } + }, + "maneuvers": "0000", + "nodeList": { + "nodes": [ + { + "delta": { + "node-XY3": { + "x": -1379, + "y": -346 + } + } + }, + { + "delta": { + "node-XY5": { + "x": -5819, + "y": 77 + } + } + } + ] + }, + "connectsTo": [ + { + "connectingLane": { + "lane": 1 + }, + "signalGroup": 3 + } + ] + }, + { + "laneID": 13, + "laneAttributes": { + "directionalUse": "80", + "sharedWith": "0000", + "laneType": { + "vehicle": { + "value": "00", + "length": 8 + } + } + }, + "maneuvers": "0000", + "nodeList": { + "nodes": [ + { + "delta": { + "node-XY3": { + "x": -1379, + "y": -648 + } + } + }, + { + "delta": { + "node-XY5": { + "x": -5819, + "y": 77 + } + } + } + ] + }, + "connectsTo": [ + { + "connectingLane": { + "lane": 6 + }, + "signalGroup": 8 + } + ] + }, + { + "laneID": 12, + "laneAttributes": { + "directionalUse": "80", + "sharedWith": "0000", + "laneType": { + "vehicle": { + "value": "00", + "length": 8 + } + } + }, + "maneuvers": "0000", + "nodeList": { + "nodes": [ + { + "delta": { + "node-XY3": { + "x": -1392, + "y": -939 + } + } + }, + { + "delta": { + "node-XY5": { + "x": -5819, + "y": 77 + } + } + } + ] + }, + "connectsTo": [ + { + "connectingLane": { + "lane": 7 + }, + "signalGroup": 8 + } + ] + }, + { + "laneID": 15, + "laneAttributes": { + "directionalUse": "40", + "sharedWith": "0000", + "laneType": { + "vehicle": { + "value": "00", + "length": 8 + } + } + }, + "maneuvers": "0000", + "nodeList": { + "nodes": [ + { + "delta": { + "node-XY3": { + "x": -1291, + "y": 33 + } + } + }, + { + "delta": { + "node-XY3": { + "x": -1891, + "y": 72 + } + } + } + ] + } + }, + { + "laneID": 16, + "laneAttributes": { + "directionalUse": "40", + "sharedWith": "0000", + "laneType": { + "vehicle": { + "value": "00", + "length": 8 + } + } + }, + "maneuvers": "0000", + "nodeList": { + "nodes": [ + { + "delta": { + "node-XY3": { + "x": -1242, + "y": 389 + } + } + }, + { + "delta": { + "node-XY3": { + "x": -1927, + "y": 55 + } + } + } + ] + } + } + ] + } + ] + } +} \ No newline at end of file diff --git a/j2735codec/core/202409/samples/jer/psm.json b/j2735codec/core/202409/samples/jer/psm.json new file mode 100644 index 0000000..da0db74 --- /dev/null +++ b/j2735codec/core/202409/samples/jer/psm.json @@ -0,0 +1,20 @@ +{ + "messageId": 32, + "value": { + "basicType": "aPEDESTRIAN", + "secMark": 59902, + "msgCnt": 92, + "id": "010000FA", + "position": { + "lat": 340897588, + "long": -1183761711 + }, + "accuracy": { + "semiMajor": 255, + "semiMinor": 255, + "orientation": 65535 + }, + "speed": 3, + "heading": 24920 + } +} \ No newline at end of file diff --git a/j2735codec/core/202409/samples/jer/sdsm.json b/j2735codec/core/202409/samples/jer/sdsm.json new file mode 100644 index 0000000..121f22e --- /dev/null +++ b/j2735codec/core/202409/samples/jer/sdsm.json @@ -0,0 +1,62 @@ +{ + "messageId": 41, + "value": { + "msgCnt": 123, + "sourceID": "DEADBEEF", + "equipmentType": "obu", + "sDSMTimeStamp": { + "year": 2025, + "month": 7, + "day": 25, + "hour": 20, + "minute": 30, + "second": 40, + "offset": 0 + }, + "refPos": { + "lat": 400000000, + "long": -740000000, + "elevation": 100 + }, + "refPosXYConf": { + "semiMajor": 1, + "semiMinor": 1, + "orientation": 0 + }, + "refPosElConf": "elev-100-00", + "objects": [ + { + "detObjCommon": { + "objType": "vru", + "objTypeCfd": 2, + "objectID": 123, + "measurementTime": 24, + "timeConfidence": "time-100-000", + "pos": { + "offsetX": 1, + "offsetY": 2, + "offsetZ": 5 + }, + "posConfidence": { + "pos": "a500m", + "elevation": "elev-500-00" + }, + "speed": 20, + "speedConfidence": "prec100ms", + "heading": 45, + "headingConf": "prec10deg" + }, + "detObjOptData": { + "detVRU": { + "basicType": "aPEDESTRIAN", + "propulsion": { + "human": "skateboard" + }, + "attachment": "stroller", + "radius": 1 + } + } + } + ] + } +} \ No newline at end of file diff --git a/j2735codec/core/202409/samples/jer/spat.json b/j2735codec/core/202409/samples/jer/spat.json new file mode 100644 index 0000000..2550262 --- /dev/null +++ b/j2735codec/core/202409/samples/jer/spat.json @@ -0,0 +1,77 @@ +{ + "messageId": 19, + "value": { + "intersections": [ + { + "id": { + "id": 46642 + }, + "revision": 0, + "status": "0000", + "timeStamp": 54500, + "states": [ + { + "signalGroup": 2, + "state-time-speed": [ + { + "eventState": "stop-And-Remain", + "timing": { + "minEndTime": 17639, + "maxEndTime": 17766 + } + } + ] + }, + { + "signalGroup": 3, + "state-time-speed": [ + { + "eventState": "stop-And-Remain", + "timing": { + "minEndTime": 18547, + "maxEndTime": 18547 + } + } + ] + }, + { + "signalGroup": 4, + "state-time-speed": [ + { + "eventState": "protected-Movement-Allowed", + "timing": { + "minEndTime": 17581, + "maxEndTime": 17708 + } + } + ] + }, + { + "signalGroup": 6, + "state-time-speed": [ + { + "eventState": "stop-And-Remain", + "timing": { + "minEndTime": 17639, + "maxEndTime": 17766 + } + } + ] + }, + { + "signalGroup": 8, + "state-time-speed": [ + { + "eventState": "protected-Movement-Allowed", + "timing": { + "minEndTime": 17581, + "maxEndTime": 17708 + } + } + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/j2735codec/core/202409/samples/jer/tim.json b/j2735codec/core/202409/samples/jer/tim.json new file mode 100644 index 0000000..9c80fba --- /dev/null +++ b/j2735codec/core/202409/samples/jer/tim.json @@ -0,0 +1,101 @@ +{ + "messageId": 31, + "value": { + "msgCnt": 2, + "timeStamp": 183717, + "packetID": "340850DE403C715CE9", + "urlB": "null", + "dataFrames": [ + { + "doNotUse1": 0, + "frameType": "advisory", + "msgId": { + "roadSignID": { + "position": { + "lat": 340551196, + "long": -842760493 + }, + "viewAngle": "FFFF", + "mutcdCode": "warning" + } + }, + "startYear": 2025, + "startTime": 183717, + "durationTime": 28800, + "priority": 5, + "doNotUse2": 0, + "regions": [ + { + "description": { + "path": { + "offset": { + "ll": { + "nodes": [ + { + "delta": { + "node-LatLon": { + "lon": -841985514, + "lat": 342069324 + } + } + }, + { + "delta": { + "node-LatLon": { + "lon": -841976939, + "lat": 342015808 + } + } + }, + { + "delta": { + "node-LatLon": { + "lon": -841960762, + "lat": 342009199 + } + } + }, + { + "delta": { + "node-LatLon": { + "lon": -841969727, + "lat": 342070452 + } + } + }, + { + "delta": { + "node-LatLon": { + "lon": -841985514, + "lat": 342069324 + } + } + } + ] + } + } + } + } + } + ], + "doNotUse3": 0, + "doNotUse4": 0, + "content": { + "advisory": [ + { + "item": { + "itis": 3343 + } + }, + { + "item": { + "itis": 13583 + } + } + ] + }, + "url": "null" + } + ] + } +} \ No newline at end of file From 7c22e2495f11b45354c6536aef9a4819b7a2fcb8 Mon Sep 17 00:00:00 2001 From: Sean Hsu Date: Thu, 15 Jan 2026 13:09:03 -0500 Subject: [PATCH 02/21] build: add .gitignore file --- .gitignore | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..304d427 --- /dev/null +++ b/.gitignore @@ -0,0 +1,87 @@ +# ============================================================================= +# Verizon ETX Starter Kit - Master Gitignore +# ============================================================================= + +# --- System & Editor Files --- +.DS_Store +Thumbs.db +*.swp +*.swo +.vscode/* +!.vscode/extensions.json +.idea/ +.vs/ +*.sln +*.vcxproj +*.user + +# --- General Build Artifacts --- +# Catches all C++, Python, and Node build directories +build/ +build_*/ +_build/ +out/ +dist/ +bin/ +*.tsbuildinfo + +# --- C++ / CMake / WASM Tooling --- +CMakeCache.txt +CMakeFiles/ +CMakeScripts/ +cmake_install.cmake +install_manifest.txt +CMakeUserPresets.json +vcpkg_installed/ +.cmake/ +cmake-build-*/ + +# Compiled Binaries +*.o +*.obj +*.so +*.a +*.lib +*.dll +*.exe +*.dylib +*.wasm +*.js.mem + +# --- Python (Onboarding & Bindings) --- +.venv/ +__pycache__/ +*.py[cod] +*$py.class +*.egg-info/ +.hatch/ +.pytest_cache/ +.mypy_cache/ +.ruff_cache/ +.coverage +htmlcov/ + +# --- Node.js (Onboarding & Bindings) --- +node_modules/ +.npm/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.eslintcache + +# --- Project Specific Patterns --- +# Explicitly ignoring generated WASM and metadata in specific subfolders +**/wasm/j2735.wasm +**/wasm/j2735.js +**/metadata/pdu.py +**/metadata/encoding.py + +# --- Environment & Secrets --- +# Never commit ETX credentials or local environment configs +.env +.env.local +.env.*.local +logs/ +*.log + +# ============================================================================= \ No newline at end of file From 258aea142ec1f645338e72a3e9a4e421e54adf8a Mon Sep 17 00:00:00 2001 From: Sean Hsu Date: Thu, 15 Jan 2026 14:28:04 -0500 Subject: [PATCH 03/21] refactor: rename 202409 core folder to j2735_202409 --- j2735codec/core/{202409 => j2735_202409}/include/ANY.h | 0 .../core/{202409 => j2735_202409}/include/AbsolutePosition2d.h | 0 .../core/{202409 => j2735_202409}/include/AbsolutePosition3d.h | 0 .../include/AccelSteerYawRateConfidence.h | 0 .../core/{202409 => j2735_202409}/include/AccelTimeConstant.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Acceleration.h | 0 .../{202409 => j2735_202409}/include/AccelerationConfidence.h | 0 .../core/{202409 => j2735_202409}/include/AccelerationSet4Way.h | 0 .../{202409 => j2735_202409}/include/AcceleratorPedalPosition.h | 0 .../core/{202409 => j2735_202409}/include/AccidentsAndIncidents.h | 0 j2735codec/core/{202409 => j2735_202409}/include/AccountStatus.h | 0 j2735codec/core/{202409 => j2735_202409}/include/AckPolicy.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Activity.h | 0 .../{202409 => j2735_202409}/include/ActualNumberOfPassengers.h | 0 .../core/{202409 => j2735_202409}/include/ActuatedInterval.h | 0 j2735codec/core/{202409 => j2735_202409}/include/AddGrpB_Angle.h | 0 .../core/{202409 => j2735_202409}/include/AddGrpB_Elevation.h | 0 .../core/{202409 => j2735_202409}/include/AddGrpB_MsgCount.h | 0 .../core/{202409 => j2735_202409}/include/AddGrpB_TimeMark.h | 0 .../core/{202409 => j2735_202409}/include/AddGrpC_Altitude.h | 0 .../include/AdviceInstructionsMandatory.h | 0 .../include/AdviceInstructionsRecommendations.h | 0 j2735codec/core/{202409 => j2735_202409}/include/AdvisorySpeed.h | 0 .../core/{202409 => j2735_202409}/include/AdvisorySpeedList.h | 0 .../core/{202409 => j2735_202409}/include/AdvisorySpeedType.h | 0 .../include/AggregatedSingleTariffClassSession.h | 0 .../core/{202409 => j2735_202409}/include/AllowedManeuvers.h | 0 j2735codec/core/{202409 => j2735_202409}/include/AlternateRoute.h | 0 .../core/{202409 => j2735_202409}/include/AltitudeConfidence.h | 0 j2735codec/core/{202409 => j2735_202409}/include/AltitudeValue.h | 0 .../core/{202409 => j2735_202409}/include/AmbientAirPressure.h | 0 .../core/{202409 => j2735_202409}/include/AmbientAirTemperature.h | 0 .../core/{202409 => j2735_202409}/include/AngularVelocity.h | 0 .../{202409 => j2735_202409}/include/AngularVelocityConfidence.h | 0 .../core/{202409 => j2735_202409}/include/AnimalPropelledType.h | 0 j2735codec/core/{202409 => j2735_202409}/include/AnimalType.h | 0 .../core/{202409 => j2735_202409}/include/AntennaOffsetSet.h | 0 .../core/{202409 => j2735_202409}/include/AntiLockBrakeStatus.h | 0 .../core/{202409 => j2735_202409}/include/ApplicableHeading.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ApproachID.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ApproachOrLane.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Area.h | 0 .../{202409 => j2735_202409}/include/AreaOrSegmentChargingInfo.h | 0 j2735codec/core/{202409 => j2735_202409}/include/AreaType.h | 0 j2735codec/core/{202409 => j2735_202409}/include/AsphaltOrTar.h | 0 .../core/{202409 => j2735_202409}/include/AsphaltOrTarType.h | 0 j2735codec/core/{202409 => j2735_202409}/include/AssetStatus.h | 0 .../include/AtmosPressureMeasurementStdDev.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Attachment.h | 0 .../core/{202409 => j2735_202409}/include/AttachmentRadius.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Attitude.h | 0 .../core/{202409 => j2735_202409}/include/AttitudeConfidence.h | 0 j2735codec/core/{202409 => j2735_202409}/include/AudioLink.h | 0 .../core/{202409 => j2735_202409}/include/AuxiliaryBrakeStatus.h | 0 j2735codec/core/{202409 => j2735_202409}/include/AxesMovement.h | 0 j2735codec/core/{202409 => j2735_202409}/include/AxleLocation.h | 0 j2735codec/core/{202409 => j2735_202409}/include/AxleWeight.h | 0 .../core/{202409 => j2735_202409}/include/AxleWeightLimit.h | 0 .../core/{202409 => j2735_202409}/include/AxleWeightLimits.h | 0 j2735codec/core/{202409 => j2735_202409}/include/AxleWeightList.h | 0 j2735codec/core/{202409 => j2735_202409}/include/AxleWeightSet.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Axles.h | 0 j2735codec/core/{202409 => j2735_202409}/include/AxlesCharges.h | 0 .../core/{202409 => j2735_202409}/include/AxlesChargesTable.h | 0 .../core/{202409 => j2735_202409}/include/AxlesWeightLimits.h | 0 j2735codec/core/{202409 => j2735_202409}/include/BIT_STRING.h | 0 j2735codec/core/{202409 => j2735_202409}/include/BOOLEAN.h | 0 j2735codec/core/{202409 => j2735_202409}/include/BSMcoreData.h | 0 j2735codec/core/{202409 => j2735_202409}/include/BankAngle.h | 0 .../core/{202409 => j2735_202409}/include/BasicSafetyMessage.h | 0 .../include/BasicSafetyMessage_PartII-Id.h | 0 .../core/{202409 => j2735_202409}/include/BasicVehicleClass.h | 0 .../core/{202409 => j2735_202409}/include/BasicVehicleRole.h | 0 .../core/{202409 => j2735_202409}/include/BrakeAppliedPressure.h | 0 .../core/{202409 => j2735_202409}/include/BrakeAppliedStatus.h | 0 .../core/{202409 => j2735_202409}/include/BrakeBoostApplied.h | 0 .../core/{202409 => j2735_202409}/include/BrakePedalPosition.h | 0 .../core/{202409 => j2735_202409}/include/BrakeSystemStatus.h | 0 j2735codec/core/{202409 => j2735_202409}/include/BroadRegion.h | 0 .../core/{202409 => j2735_202409}/include/BroadRegionArea.h | 0 j2735codec/core/{202409 => j2735_202409}/include/BumperHeight.h | 0 j2735codec/core/{202409 => j2735_202409}/include/BumperHeights.h | 0 j2735codec/core/{202409 => j2735_202409}/include/CCMFaultMode.h | 0 .../core/{202409 => j2735_202409}/include/CCMPartIIcontent.h | 0 .../core/{202409 => j2735_202409}/include/CO2EmissionValue.h | 0 j2735codec/core/{202409 => j2735_202409}/include/CargoWeight.h | 0 .../include/CfgAveragedAndSummaryTriggers.h | 0 .../core/{202409 => j2735_202409}/include/CfgAveragedTriggers.h | 0 .../core/{202409 => j2735_202409}/include/CfgCommSysPerfEvents.h | 0 .../core/{202409 => j2735_202409}/include/CfgEmerAndTransitInfo.h | 0 .../core/{202409 => j2735_202409}/include/CfgEventRecurrence.h | 0 j2735codec/core/{202409 => j2735_202409}/include/CfgEvents.h | 0 j2735codec/core/{202409 => j2735_202409}/include/CfgHysteresis.h | 0 .../include/CfgInstantaneousEventTriggers.h | 0 j2735codec/core/{202409 => j2735_202409}/include/CfgInterval.h | 0 .../core/{202409 => j2735_202409}/include/CfgIntervalEvents.h | 0 .../core/{202409 => j2735_202409}/include/CfgKinematicEvents.h | 0 .../core/{202409 => j2735_202409}/include/CfgLowSpeedCriteria.h | 0 .../core/{202409 => j2735_202409}/include/CfgMsgDictionary.h | 0 .../core/{202409 => j2735_202409}/include/CfgMsgRecepIndicators.h | 0 .../core/{202409 => j2735_202409}/include/CfgRoadSignInfo.h | 0 .../core/{202409 => j2735_202409}/include/CfgRoadSignTypes.h | 0 .../core/{202409 => j2735_202409}/include/CfgRoadwayEvents.h | 0 .../core/{202409 => j2735_202409}/include/CfgStoppedCriteria.h | 0 .../core/{202409 => j2735_202409}/include/CfgSummaryTriggers.h | 0 .../{202409 => j2735_202409}/include/CfgTrafficSigEncounters.h | 0 .../core/{202409 => j2735_202409}/include/CfgTransitVehicleData.h | 0 .../core/{202409 => j2735_202409}/include/CfgVehicleClass.h | 0 .../core/{202409 => j2735_202409}/include/CfgVehicleEvents.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ChargeObjectId.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ChargerInfo.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ChargesTable.h | 0 .../core/{202409 => j2735_202409}/include/ChargingAreaOrSegment.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ChargingConfig.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ChargingFees.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ChargingUnits.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Cinders.h | 0 j2735codec/core/{202409 => j2735_202409}/include/CindersType.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Circle.h | 0 .../{202409 => j2735_202409}/include/ClassificationConfidence.h | 0 .../{202409 => j2735_202409}/include/ClosedNetworkChargesTable.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Closures.h | 0 j2735codec/core/{202409 => j2735_202409}/include/CoarseHeading.h | 0 j2735codec/core/{202409 => j2735_202409}/include/CodeWord.h | 0 .../core/{202409 => j2735_202409}/include/CoefficientOfFriction.h | 0 .../core/{202409 => j2735_202409}/include/CommonContainer.h | 0 .../core/{202409 => j2735_202409}/include/CommonSafetyRequest.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Common_Angle.h | 0 .../core/{202409 => j2735_202409}/include/Common_Duration.h | 0 .../core/{202409 => j2735_202409}/include/Common_Elevation.h | 0 .../core/{202409 => j2735_202409}/include/Common_Latitude.h | 0 .../core/{202409 => j2735_202409}/include/Common_Longitude.h | 0 .../core/{202409 => j2735_202409}/include/Common_MeanVariation.h | 0 .../core/{202409 => j2735_202409}/include/Common_MsgCount.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ComputedLane.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Confidence.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ConfidenceSet.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ConfigBoundary.h | 0 .../core/{202409 => j2735_202409}/include/ConfigDescriptor.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ConfigId.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ConfigInfo.h | 0 .../{202409 => j2735_202409}/include/ConfigTemporalBoundary.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ConfigTriggers.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ConnectingLane.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Connection.h | 0 .../include/ConnectionManeuverAssist-addGrpC.h | 0 .../{202409 => j2735_202409}/include/ConnectionManeuverAssist.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ConnectsToList.h | 0 .../{202409 => j2735_202409}/include/ConsecutiveTrafficLight.h | 0 .../core/{202409 => j2735_202409}/include/ContentContainer.h | 0 .../core/{202409 => j2735_202409}/include/ContractAuthenticator.h | 0 .../core/{202409 => j2735_202409}/include/ContractSerialNumber.h | 0 .../core/{202409 => j2735_202409}/include/ContractValidity.h | 0 .../{202409 => j2735_202409}/include/CooperativeControlMessage.h | 0 .../include/CooperativeControlMessage_ManeuverID.h | 0 .../include/CooperativeControlMessage_PartII-Id.h | 0 .../include/CooperativeControlMessage_PitchRate.h | 0 .../include/CooperativeControlMessage_RollRate.h | 0 j2735codec/core/{202409 => j2735_202409}/include/CopValue.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Count.h | 0 j2735codec/core/{202409 => j2735_202409}/include/CountryCode.h | 0 j2735codec/core/{202409 => j2735_202409}/include/CrossLinking.h | 0 .../core/{202409 => j2735_202409}/include/CurrentStateData.h | 0 j2735codec/core/{202409 => j2735_202409}/include/CurveContainer.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DDate.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DDateTime.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DDay.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DFullTime.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DHour.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DMinute.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DMonth.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DMonthDay.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DOffset.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DSRCmsgID.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DSecond.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DTime.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DYear.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DYearMonth.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DataParameters.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DataSourceInfo.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DateAndTime.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DateCompact.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Day.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DayOfWeek.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DegreesLat.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DegreesLong.h | 0 .../{202409 => j2735_202409}/include/DelayStatusCancellation.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DeltaAngle.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DeltaTime.h | 0 .../{202409 => j2735_202409}/include/DescriptionOfRoadSurface.h | 0 .../{202409 => j2735_202409}/include/DescriptiveCharacteristics.h | 0 .../core/{202409 => j2735_202409}/include/DescriptiveName.h | 0 .../core/{202409 => j2735_202409}/include/DetectedChargeObject.h | 0 .../{202409 => j2735_202409}/include/DetectedObjectCommonData.h | 0 .../core/{202409 => j2735_202409}/include/DetectedObjectData.h | 0 .../core/{202409 => j2735_202409}/include/DetectedObjectList.h | 0 .../{202409 => j2735_202409}/include/DetectedObjectOptionalData.h | 0 .../core/{202409 => j2735_202409}/include/DetectedObstacleData.h | 0 .../core/{202409 => j2735_202409}/include/DetectedVRUData.h | 0 .../core/{202409 => j2735_202409}/include/DetectedVehicleData.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DetectionMode.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DeviceStatus.h | 0 .../include/DewPointTempMeasurementStdDev.h | 0 .../core/{202409 => j2735_202409}/include/DieselEmissionValues.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DirectionOfUse.h | 0 .../core/{202409 => j2735_202409}/include/DisabledVehicle.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Disasters.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Distance.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DistanceUnit.h | 0 j2735codec/core/{202409 => j2735_202409}/include/DistanceUnits.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Disturbances.h | 0 .../{202409 => j2735_202409}/include/DriveAxleLiftAirPressure.h | 0 .../core/{202409 => j2735_202409}/include/DriveAxleLocation.h | 0 .../core/{202409 => j2735_202409}/include/DriveAxleLubePressure.h | 0 .../core/{202409 => j2735_202409}/include/DriveAxleTemperature.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Driven.h | 0 .../core/{202409 => j2735_202409}/include/DrivenLineOffsetLg.h | 0 .../core/{202409 => j2735_202409}/include/DrivenLineOffsetSm.h | 0 .../core/{202409 => j2735_202409}/include/DriverCharacteristics.h | 0 .../core/{202409 => j2735_202409}/include/DrivingWheelAngle.h | 0 .../core/{202409 => j2735_202409}/include/DynamicInfoContainer.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ENUMERATED.h | 0 j2735codec/core/{202409 => j2735_202409}/include/EXTERNAL.h | 0 j2735codec/core/{202409 => j2735_202409}/include/EfcContextMark.h | 0 .../{202409 => j2735_202409}/include/EfcDataDictionary_Altitude.h | 0 .../{202409 => j2735_202409}/include/EfcDataDictionary_Duration.h | 0 .../{202409 => j2735_202409}/include/EfcDataDictionary_Latitude.h | 0 .../include/EfcDataDictionary_Longitude.h | 0 j2735codec/core/{202409 => j2735_202409}/include/EfcTime.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ElevOffset.h | 0 .../core/{202409 => j2735_202409}/include/ElevationConfidence.h | 0 .../core/{202409 => j2735_202409}/include/EmergencyDetails.h | 0 .../core/{202409 => j2735_202409}/include/EmergencyVehicleAlert.h | 0 j2735codec/core/{202409 => j2735_202409}/include/EmissionType.h | 0 j2735codec/core/{202409 => j2735_202409}/include/EmissionUnit.h | 0 .../core/{202409 => j2735_202409}/include/EnabledLaneList.h | 0 .../core/{202409 => j2735_202409}/include/EncryptedTumData.h | 0 .../core/{202409 => j2735_202409}/include/EngineCharacteristics.h | 0 j2735codec/core/{202409 => j2735_202409}/include/EngineDetails.h | 0 .../core/{202409 => j2735_202409}/include/EntryChargesTable.h | 0 .../include/EnvironmentalCharacteristics.h | 0 j2735codec/core/{202409 => j2735_202409}/include/EquipmentIccId.h | 0 j2735codec/core/{202409 => j2735_202409}/include/EquipmentObuId.h | 0 .../core/{202409 => j2735_202409}/include/EquipmentStatus.h | 0 j2735codec/core/{202409 => j2735_202409}/include/EquipmentType.h | 0 .../core/{202409 => j2735_202409}/include/EssMobileFriction.h | 0 j2735codec/core/{202409 => j2735_202409}/include/EssPrecipRate.h | 0 .../core/{202409 => j2735_202409}/include/EssPrecipSituation.h | 0 j2735codec/core/{202409 => j2735_202409}/include/EssPrecipYesNo.h | 0 .../core/{202409 => j2735_202409}/include/EssSolarRadiation.h | 0 j2735codec/core/{202409 => j2735_202409}/include/EuroValue.h | 0 .../core/{202409 => j2735_202409}/include/EventDescription.h | 0 .../core/{202409 => j2735_202409}/include/EventIdentifier.h | 0 j2735codec/core/{202409 => j2735_202409}/include/EventInfo.h | 0 .../core/{202409 => j2735_202409}/include/EventRecurrence.h | 0 .../core/{202409 => j2735_202409}/include/ExhaustEmissionValues.h | 0 .../core/{202409 => j2735_202409}/include/ExitChargesTable.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ExitInfo.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ExitService.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Extent.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ExteriorLights.h | 0 j2735codec/core/{202409 => j2735_202409}/include/FeeReport.h | 0 .../core/{202409 => j2735_202409}/include/FrictionInformation.h | 0 j2735codec/core/{202409 => j2735_202409}/include/FrontCutIn.h | 0 j2735codec/core/{202409 => j2735_202409}/include/FuelType.h | 0 .../core/{202409 => j2735_202409}/include/FullPositionVector.h | 0 .../core/{202409 => j2735_202409}/include/FullRoadAuthorityID.h | 0 j2735codec/core/{202409 => j2735_202409}/include/FurtherInfoID.h | 0 .../core/{202409 => j2735_202409}/include/FutureCharacteristics.h | 0 j2735codec/core/{202409 => j2735_202409}/include/GNSSstatus.h | 0 .../core/{202409 => j2735_202409}/include/GeneralizedTime.h | 0 j2735codec/core/{202409 => j2735_202409}/include/GenericLane.h | 0 j2735codec/core/{202409 => j2735_202409}/include/GenericSignage.h | 0 .../core/{202409 => j2735_202409}/include/GeographicalPath.h | 0 .../core/{202409 => j2735_202409}/include/GeometricProjection.h | 0 j2735codec/core/{202409 => j2735_202409}/include/GraphicString.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Grass.h | 0 j2735codec/core/{202409 => j2735_202409}/include/GrassType.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Gravel.h | 0 j2735codec/core/{202409 => j2735_202409}/include/GravelType.h | 0 j2735codec/core/{202409 => j2735_202409}/include/GrossDistance.h | 0 j2735codec/core/{202409 => j2735_202409}/include/GrossSpeed.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Header.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Heading.h | 0 .../core/{202409 => j2735_202409}/include/HeadingConfidence.h | 0 j2735codec/core/{202409 => j2735_202409}/include/HeadingDeg.h | 0 j2735codec/core/{202409 => j2735_202409}/include/HeadingSlice.h | 0 .../{202409 => j2735_202409}/include/HeavyTruckCCMExtensions.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Holiday.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Hour.h | 0 .../core/{202409 => j2735_202409}/include/HumanPropelledType.h | 0 j2735codec/core/{202409 => j2735_202409}/include/IA5String.h | 0 j2735codec/core/{202409 => j2735_202409}/include/INTEGER.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ITISEventType.h | 0 .../core/{202409 => j2735_202409}/include/ITIS_GenericLocations.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ITIS_ITIScodes.h | 0 .../core/{202409 => j2735_202409}/include/ITIS_ITIScodesAndText.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ITIS_ITIStext.h | 0 .../include/ITIS_IncidentResponseEquipment.h | 0 .../include/ITIS_ResponderGroupAffected.h | 0 .../{202409 => j2735_202409}/include/ITIS_VehicleGroupAffected.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ITISgroups.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ITIStextPhrase.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Ice.h | 0 j2735codec/core/{202409 => j2735_202409}/include/IceType.h | 0 .../{202409 => j2735_202409}/include/IncidentResponseStatus.h | 0 .../core/{202409 => j2735_202409}/include/IncidentsContainer.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Int1Signed.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Int1Unsigned.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Int2Signed.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Int2Unsigned.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Int3Unsigned.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Int4Signed.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Int4Unsigned.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Int8Signed.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Int8Unsigned.h | 0 .../{202409 => j2735_202409}/include/IntersectionAccessPoint.h | 0 .../core/{202409 => j2735_202409}/include/IntersectionCollision.h | 0 .../core/{202409 => j2735_202409}/include/IntersectionGeometry.h | 0 .../{202409 => j2735_202409}/include/IntersectionGeometryList.h | 0 j2735codec/core/{202409 => j2735_202409}/include/IntersectionID.h | 0 .../{202409 => j2735_202409}/include/IntersectionReferenceID.h | 0 .../{202409 => j2735_202409}/include/IntersectionState-addGrpC.h | 0 .../core/{202409 => j2735_202409}/include/IntersectionState.h | 0 .../core/{202409 => j2735_202409}/include/IntersectionStateList.h | 0 .../{202409 => j2735_202409}/include/IntersectionStatusObject.h | 0 j2735codec/core/{202409 => j2735_202409}/include/IsDolly.h | 0 .../core/{202409 => j2735_202409}/include/Iso3833VehicleType.h | 0 .../core/{202409 => j2735_202409}/include/IssuerIdentifier.h | 0 .../core/{202409 => j2735_202409}/include/ItemizedChargerData.h | 0 .../core/{202409 => j2735_202409}/include/ItemizedPaymentReport.h | 0 j2735codec/core/{202409 => j2735_202409}/include/J1939data.h | 0 .../{202409 => j2735_202409}/include/J2540ITIS_GenericLocations.h | 0 .../core/{202409 => j2735_202409}/include/J2540ITIS_ITIScodes.h | 0 .../{202409 => j2735_202409}/include/J2540ITIS_ITIScodesAndText.h | 0 .../core/{202409 => j2735_202409}/include/J2540ITIS_ITIStext.h | 0 .../include/J2540ITIS_IncidentResponseEquipment.h | 0 .../include/J2540ITIS_ResponderGroupAffected.h | 0 .../include/J2540ITIS_VehicleGroupAffected.h | 0 .../{202409 => j2735_202409}/include/LaneAttributes-Barrier.h | 0 .../core/{202409 => j2735_202409}/include/LaneAttributes-Bike.h | 0 .../{202409 => j2735_202409}/include/LaneAttributes-Crosswalk.h | 0 .../{202409 => j2735_202409}/include/LaneAttributes-Parking.h | 0 .../{202409 => j2735_202409}/include/LaneAttributes-Sidewalk.h | 0 .../{202409 => j2735_202409}/include/LaneAttributes-Striping.h | 0 .../include/LaneAttributes-TrackedVehicle.h | 0 .../{202409 => j2735_202409}/include/LaneAttributes-Vehicle.h | 0 j2735codec/core/{202409 => j2735_202409}/include/LaneAttributes.h | 0 .../core/{202409 => j2735_202409}/include/LaneChargesTable.h | 0 j2735codec/core/{202409 => j2735_202409}/include/LaneClosed.h | 0 .../core/{202409 => j2735_202409}/include/LaneClosureContainer.h | 0 .../core/{202409 => j2735_202409}/include/LaneConnectionID.h | 0 .../{202409 => j2735_202409}/include/LaneDataAttribute-addGrpB.h | 0 .../core/{202409 => j2735_202409}/include/LaneDataAttribute.h | 0 .../core/{202409 => j2735_202409}/include/LaneDataAttributeList.h | 0 j2735codec/core/{202409 => j2735_202409}/include/LaneDirection.h | 0 j2735codec/core/{202409 => j2735_202409}/include/LaneID.h | 0 j2735codec/core/{202409 => j2735_202409}/include/LaneInfo.h | 0 j2735codec/core/{202409 => j2735_202409}/include/LaneList.h | 0 j2735codec/core/{202409 => j2735_202409}/include/LaneOffset.h | 0 j2735codec/core/{202409 => j2735_202409}/include/LaneRoadway.h | 0 j2735codec/core/{202409 => j2735_202409}/include/LaneSharing.h | 0 .../core/{202409 => j2735_202409}/include/LaneTypeAttributes.h | 0 j2735codec/core/{202409 => j2735_202409}/include/LaneWidth.h | 0 j2735codec/core/{202409 => j2735_202409}/include/LargeNumbers.h | 0 .../core/{202409 => j2735_202409}/include/LastTollPointInfo.h | 0 .../core/{202409 => j2735_202409}/include/LastTollPointInfos.h | 0 j2735codec/core/{202409 => j2735_202409}/include/LatOffset.h | 0 j2735codec/core/{202409 => j2735_202409}/include/LatitudeDMS.h | 0 j2735codec/core/{202409 => j2735_202409}/include/LatitudeDMS2.h | 0 j2735codec/core/{202409 => j2735_202409}/include/LayerID.h | 0 j2735codec/core/{202409 => j2735_202409}/include/LayerType.h | 0 .../{202409 => j2735_202409}/include/LightVehicleCCMExtensions.h | 0 j2735codec/core/{202409 => j2735_202409}/include/LightbarInUse.h | 0 .../core/{202409 => j2735_202409}/include/LocAndTimeStamp.h | 0 .../core/{202409 => j2735_202409}/include/LocAndTimeStamps.h | 0 .../core/{202409 => j2735_202409}/include/LocalVehicleClassId.h | 0 .../core/{202409 => j2735_202409}/include/Location-quality.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Location-tech.h | 0 .../core/{202409 => j2735_202409}/include/LocationClassId.h | 0 j2735codec/core/{202409 => j2735_202409}/include/LongOffset.h | 0 j2735codec/core/{202409 => j2735_202409}/include/LongitudeDMS.h | 0 j2735codec/core/{202409 => j2735_202409}/include/LongitudeDMS2.h | 0 .../{202409 => j2735_202409}/include/LongitudinalControlState.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Lpn.h | 0 j2735codec/core/{202409 => j2735_202409}/include/MSCMType.h | 0 j2735codec/core/{202409 => j2735_202409}/include/MUTCDCode.h | 0 j2735codec/core/{202409 => j2735_202409}/include/MUTCDLocations.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Maneuver.h | 0 .../core/{202409 => j2735_202409}/include/ManeuverAssistList.h | 0 .../{202409 => j2735_202409}/include/ManeuverExecutionStatus.h | 0 .../include/ManeuverSharingAndCoordinatingMessage.h | 0 .../include/ManeuverSharingAndCoordinatingMessage_ManeuverID.h | 0 .../ManeuverSharingAndCoordinatingMessage_ObjectDistance.h | 0 .../ManeuverSharingAndCoordinatingMessage_PositionOffsetXYZ.h | 0 .../core/{202409 => j2735_202409}/include/MapData-addGrpC.h | 0 j2735codec/core/{202409 => j2735_202409}/include/MapData.h | 0 .../{202409 => j2735_202409}/include/MaxAvailableAcceleration.h | 0 .../{202409 => j2735_202409}/include/MaxAvailableDeceleration.h | 0 .../core/{202409 => j2735_202409}/include/MaxTimetoChange.h | 0 .../core/{202409 => j2735_202409}/include/MeasurementTimeOffset.h | 0 .../core/{202409 => j2735_202409}/include/MergeDivergeNodeAngle.h | 0 j2735codec/core/{202409 => j2735_202409}/include/MessageBLOB.h | 0 j2735codec/core/{202409 => j2735_202409}/include/MessageFrame.h | 0 .../core/{202409 => j2735_202409}/include/MinTimetoChange.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Minute.h | 0 .../core/{202409 => j2735_202409}/include/MinuteOfTheYear.h | 0 j2735codec/core/{202409 => j2735_202409}/include/MinutesAngle.h | 0 .../core/{202409 => j2735_202409}/include/MinutesDuration.h | 0 .../core/{202409 => j2735_202409}/include/MobileSituation.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Month.h | 0 .../{202409 => j2735_202409}/include/MotorizedPropelledType.h | 0 .../core/{202409 => j2735_202409}/include/MovementEvent-addGrpB.h | 0 j2735codec/core/{202409 => j2735_202409}/include/MovementEvent.h | 0 .../core/{202409 => j2735_202409}/include/MovementEventList.h | 0 j2735codec/core/{202409 => j2735_202409}/include/MovementList.h | 0 .../core/{202409 => j2735_202409}/include/MovementPhaseState.h | 0 j2735codec/core/{202409 => j2735_202409}/include/MovementState.h | 0 j2735codec/core/{202409 => j2735_202409}/include/MsgCRC.h | 0 .../core/{202409 => j2735_202409}/include/MultiVehicleResponse.h | 0 j2735codec/core/{202409 => j2735_202409}/include/NMEA-MsgType.h | 0 j2735codec/core/{202409 => j2735_202409}/include/NMEA-Payload.h | 0 j2735codec/core/{202409 => j2735_202409}/include/NMEA-Revision.h | 0 .../core/{202409 => j2735_202409}/include/NMEAcorrections.h | 0 .../{202409 => j2735_202409}/include/NTCIPEssAirTemperature.h | 0 .../{202409 => j2735_202409}/include/NTCIPEssCloudSituationV4.h | 0 .../core/{202409 => j2735_202409}/include/NTCIPEssDewpointTemp.h | 0 .../include/NTCIPEssPaveTreatProductForm.h | 0 .../include/NTCIPEssPaveTreatProductType.h | 0 .../include/NTCIPEssPaveTreatmentAmount.h | 0 .../{202409 => j2735_202409}/include/NTCIPEssPaveTreatmentWidth.h | 0 .../include/NTCIPEssPavementTreatmentLatitude.h | 0 .../include/NTCIPEssPavementTreatmentLocation.h | 0 .../include/NTCIPEssPavementTreatmentLongitude.h | 0 .../{202409 => j2735_202409}/include/NTCIPEssPercentProductMix.h | 0 .../include/NTCIPEssPressureSensorAtmosphericPressure.h | 0 .../include/NTCIPEssSurfaceIceOrWaterDepth.h | 0 .../{202409 => j2735_202409}/include/NTCIPEssSurfaceTemperature.h | 0 .../include/NTCIPEssTemperatureSensorHeight.h | 0 .../include/NTCIPEssTotalRadiationPeriod.h | 0 .../{202409 => j2735_202409}/include/NTCIPEssTotalRadiationV4.h | 0 .../core/{202409 => j2735_202409}/include/NTCIPEssVisibility.h | 0 .../include/NTCIPEssVisibilitySituation.h | 0 .../include/NTCIPHumiditySensorRelativeHumidity.h | 0 .../include/NTCIPPavementSensorSurfaceCondition.h | 0 .../include/NTCIPPrecipitationSensorPrecipSituation.h | 0 .../include/NTCIPWindSensorAvgDirection.h | 0 .../{202409 => j2735_202409}/include/NTCIPWindSensorAvgSpeed.h | 0 .../include/NTCIPWindSensorGustDirection.h | 0 .../{202409 => j2735_202409}/include/NTCIPWindSensorGustSpeed.h | 0 .../include/NTCIPWindSensorSpotDirection.h | 0 .../{202409 => j2735_202409}/include/NTCIPWindSensorSpotSpeed.h | 0 j2735codec/core/{202409 => j2735_202409}/include/NULL.h | 0 j2735codec/core/{202409 => j2735_202409}/include/NamedObjects.h | 0 .../core/{202409 => j2735_202409}/include/NativeEnumerated.h | 0 j2735codec/core/{202409 => j2735_202409}/include/NativeInteger.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Node-LL-24B.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Node-LL-28B.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Node-LL-32B.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Node-LL-36B.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Node-LL-44B.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Node-LL-48B.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Node-LLdms-48b.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Node-LLdms-80b.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Node-LLmD-64b.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Node-XY-20b.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Node-XY-22b.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Node-XY-24b.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Node-XY-26b.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Node-XY-28b.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Node-XY-32b.h | 0 .../core/{202409 => j2735_202409}/include/NodeAttributeLL.h | 0 .../core/{202409 => j2735_202409}/include/NodeAttributeLLList.h | 0 .../core/{202409 => j2735_202409}/include/NodeAttributeSetLL.h | 0 .../core/{202409 => j2735_202409}/include/NodeAttributeSetXY.h | 0 .../core/{202409 => j2735_202409}/include/NodeAttributeXY.h | 0 .../core/{202409 => j2735_202409}/include/NodeAttributeXYList.h | 0 j2735codec/core/{202409 => j2735_202409}/include/NodeLL.h | 0 j2735codec/core/{202409 => j2735_202409}/include/NodeListLL.h | 0 j2735codec/core/{202409 => j2735_202409}/include/NodeListXY.h | 0 .../core/{202409 => j2735_202409}/include/NodeOffsetPointLL.h | 0 .../{202409 => j2735_202409}/include/NodeOffsetPointXY-addGrpB.h | 0 .../core/{202409 => j2735_202409}/include/NodeOffsetPointXY.h | 0 j2735codec/core/{202409 => j2735_202409}/include/NodePointLLE.h | 0 j2735codec/core/{202409 => j2735_202409}/include/NodeSetLL.h | 0 j2735codec/core/{202409 => j2735_202409}/include/NodeSetXY.h | 0 j2735codec/core/{202409 => j2735_202409}/include/NodeXY.h | 0 .../core/{202409 => j2735_202409}/include/NtcipAirTemperature.h | 0 .../{202409 => j2735_202409}/include/NtcipAtmosphericPressure.h | 0 .../core/{202409 => j2735_202409}/include/NtcipCloudSituation.h | 0 j2735codec/core/{202409 => j2735_202409}/include/NtcipDewPoint.h | 0 j2735codec/core/{202409 => j2735_202409}/include/NtcipEssData.h | 0 j2735codec/core/{202409 => j2735_202409}/include/NtcipPavement.h | 0 .../{202409 => j2735_202409}/include/NtcipPavementTreatment.h | 0 .../core/{202409 => j2735_202409}/include/NtcipPrecipitation.h | 0 .../core/{202409 => j2735_202409}/include/NtcipRelativeHumidity.h | 0 .../core/{202409 => j2735_202409}/include/NtcipSolarRadiation.h | 0 .../core/{202409 => j2735_202409}/include/NtcipVisibility.h | 0 .../{202409 => j2735_202409}/include/NtcipVisibilitySituation.h | 0 j2735codec/core/{202409 => j2735_202409}/include/NtcipWind.h | 0 j2735codec/core/{202409 => j2735_202409}/include/NumberOfAxles.h | 0 .../include/NumberOfParticipantsInCluster.h | 0 .../core/{202409 => j2735_202409}/include/OBJECT_IDENTIFIER.h | 0 j2735codec/core/{202409 => j2735_202409}/include/OCTET_STRING.h | 0 j2735codec/core/{202409 => j2735_202409}/include/OPEN_TYPE.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ObeId.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ObjectCount.h | 0 .../core/{202409 => j2735_202409}/include/ObjectDescriptor.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ObjectID.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ObjectType.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Objects.h | 0 .../core/{202409 => j2735_202409}/include/ObstacleDetection.h | 0 .../core/{202409 => j2735_202409}/include/ObstacleDirection.h | 0 .../core/{202409 => j2735_202409}/include/ObstacleDistance.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ObstacleSize.h | 0 .../{202409 => j2735_202409}/include/ObstacleSizeConfidence.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Obstruction.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Obstructions.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Offset-B09.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Offset-B10.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Offset-B11.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Offset-B12.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Offset-B13.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Offset-B14.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Offset-B16.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Offset3D.h | 0 j2735codec/core/{202409 => j2735_202409}/include/OffsetLL-B12.h | 0 j2735codec/core/{202409 => j2735_202409}/include/OffsetLL-B14.h | 0 j2735codec/core/{202409 => j2735_202409}/include/OffsetLL-B16.h | 0 j2735codec/core/{202409 => j2735_202409}/include/OffsetLL-B18.h | 0 j2735codec/core/{202409 => j2735_202409}/include/OffsetLL-B22.h | 0 j2735codec/core/{202409 => j2735_202409}/include/OffsetLL-B24.h | 0 j2735codec/core/{202409 => j2735_202409}/include/OffsetSystem.h | 0 .../core/{202409 => j2735_202409}/include/OperatorDefined.h | 0 .../core/{202409 => j2735_202409}/include/OverlayLaneList.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Parked.h | 0 .../core/{202409 => j2735_202409}/include/ParkingInformation.h | 0 j2735codec/core/{202409 => j2735_202409}/include/PartIIcontent.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Particulate.h | 0 .../core/{202409 => j2735_202409}/include/PassengerCapacity.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Path.h | 0 j2735codec/core/{202409 => j2735_202409}/include/PathHistory.h | 0 .../core/{202409 => j2735_202409}/include/PathHistoryPoint.h | 0 .../core/{202409 => j2735_202409}/include/PathHistoryPointList.h | 0 j2735codec/core/{202409 => j2735_202409}/include/PathList.h | 0 j2735codec/core/{202409 => j2735_202409}/include/PathPoints.h | 0 j2735codec/core/{202409 => j2735_202409}/include/PathPrediction.h | 0 .../core/{202409 => j2735_202409}/include/PavementConditions.h | 0 j2735codec/core/{202409 => j2735_202409}/include/PayUnit.h | 0 j2735codec/core/{202409 => j2735_202409}/include/PayloadData.h | 0 j2735codec/core/{202409 => j2735_202409}/include/PaymentFee.h | 0 j2735codec/core/{202409 => j2735_202409}/include/PaymentMeans.h | 0 .../core/{202409 => j2735_202409}/include/PaymentMeansBalance.h | 0 .../core/{202409 => j2735_202409}/include/PaymentSecurityData.h | 0 .../{202409 => j2735_202409}/include/PedestrianBicycleDetect.h | 0 j2735codec/core/{202409 => j2735_202409}/include/PedestrianCall.h | 0 .../core/{202409 => j2735_202409}/include/PerAxleWeightCharges.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Period.h | 0 .../{202409 => j2735_202409}/include/PermissiveNonProtected.h | 0 .../core/{202409 => j2735_202409}/include/PersonalAccountNumber.h | 0 .../core/{202409 => j2735_202409}/include/PersonalAssistive.h | 0 .../core/{202409 => j2735_202409}/include/PersonalClusterRadius.h | 0 .../{202409 => j2735_202409}/include/PersonalCrossingInProgress.h | 0 .../{202409 => j2735_202409}/include/PersonalCrossingRequest.h | 0 .../{202409 => j2735_202409}/include/PersonalDeviceUsageState.h | 0 .../{202409 => j2735_202409}/include/PersonalDeviceUserType.h | 0 .../core/{202409 => j2735_202409}/include/PersonalSafetyMessage.h | 0 .../{202409 => j2735_202409}/include/PersonalSafetyMessage2.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Pitch.h | 0 j2735codec/core/{202409 => j2735_202409}/include/PitchDetected.h | 0 .../core/{202409 => j2735_202409}/include/PitchRateConfidence.h | 0 .../core/{202409 => j2735_202409}/include/PivotPointDescription.h | 0 .../core/{202409 => j2735_202409}/include/PivotingAllowed.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Point.h | 0 j2735codec/core/{202409 => j2735_202409}/include/PortlandCement.h | 0 .../core/{202409 => j2735_202409}/include/PortlandCementType.h | 0 .../core/{202409 => j2735_202409}/include/Position3D-addGrpB.h | 0 .../core/{202409 => j2735_202409}/include/Position3D-addGrpC.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Position3D.h | 0 .../core/{202409 => j2735_202409}/include/PositionConfidence.h | 0 .../core/{202409 => j2735_202409}/include/PositionConfidenceSet.h | 0 .../core/{202409 => j2735_202409}/include/PositionalAccuracy.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Precipitation.h | 0 .../core/{202409 => j2735_202409}/include/PreemptPriorityList.h | 0 .../{202409 => j2735_202409}/include/PrimaryRegionChargingInfo.h | 0 .../core/{202409 => j2735_202409}/include/PrimaryRegionState.h | 0 .../{202409 => j2735_202409}/include/PrioritizationResponse.h | 0 .../{202409 => j2735_202409}/include/PrioritizationResponseList.h | 0 .../include/PrioritizationResponseStatus.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Priority.h | 0 .../core/{202409 => j2735_202409}/include/PriorityRequestType.h | 0 .../core/{202409 => j2735_202409}/include/PrivilegedEventFlags.h | 0 .../core/{202409 => j2735_202409}/include/PrivilegedEvents.h | 0 .../core/{202409 => j2735_202409}/include/ProbeDataConfig.h | 0 .../{202409 => j2735_202409}/include/ProbeDataConfigMessage.h | 0 .../core/{202409 => j2735_202409}/include/ProbeDataManagement.h | 0 .../{202409 => j2735_202409}/include/ProbeDataReportMessage.h | 0 .../include/ProbeDataReport_MeanVariation.h | 0 .../core/{202409 => j2735_202409}/include/ProbeSegmentNumber.h | 0 .../core/{202409 => j2735_202409}/include/ProbeVehicleData.h | 0 .../core/{202409 => j2735_202409}/include/PropelledInformation.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Provider.h | 0 .../include/PublicSafetyAndRoadWorkerActivity.h | 0 .../include/PublicSafetyDirectingTrafficSubType.h | 0 .../include/PublicSafetyEventResponderWorkerType.h | 0 j2735codec/core/{202409 => j2735_202409}/include/PurseBalance.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Qualifiers.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RELATIVE-OID.h | 0 .../core/{202409 => j2735_202409}/include/RSMLanePosition.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RSMPolygon.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RTCM-Revision.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RTCMPackage.h | 0 .../core/{202409 => j2735_202409}/include/RTCMcorrections.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RTCMheader.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RTCMmessage.h | 0 .../core/{202409 => j2735_202409}/include/RTCMmessageList.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Radius-B12.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Radius.h | 0 .../core/{202409 => j2735_202409}/include/RadiusOfCurvature.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RainSensor.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ReasonCode.h | 0 .../core/{202409 => j2735_202409}/include/ReceiptAuthenticator.h | 0 .../core/{202409 => j2735_202409}/include/ReceiptContract.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ReceiptData.h | 0 .../core/{202409 => j2735_202409}/include/ReceiptDistance.h | 0 .../core/{202409 => j2735_202409}/include/ReceiptFinancialPart.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ReceiptIccId.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ReceiptObuId.h | 0 .../core/{202409 => j2735_202409}/include/ReceiptServicePart.h | 0 .../{202409 => j2735_202409}/include/ReceiptServiceSerialNumber.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ReceiptText.h | 0 .../include/RecreationalObjectsAndActivities.h | 0 .../{202409 => j2735_202409}/include/ReducedSpeedZoneContainer.h | 0 .../core/{202409 => j2735_202409}/include/ReferencePointType.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RegionId.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RegionInfo.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RegionList.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RegionOffsets.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RegionPointSet.h | 0 .../core/{202409 => j2735_202409}/include/RegionUncertainty.h | 0 .../core/{202409 => j2735_202409}/include/RegionalExtension.h | 0 .../{202409 => j2735_202409}/include/RegulatoryAndWarningSigns.h | 0 .../core/{202409 => j2735_202409}/include/RegulatorySpeedLimit.h | 0 .../core/{202409 => j2735_202409}/include/RelativePosition3d.h | 0 .../{202409 => j2735_202409}/include/RelativeRoadAuthorityID.h | 0 .../core/{202409 => j2735_202409}/include/ReportCharacteristics.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RequestID.h | 0 .../{202409 => j2735_202409}/include/RequestImportanceLevel.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RequestSubRole.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RequestedItem.h | 0 .../core/{202409 => j2735_202409}/include/RequestedItemList.h | 0 .../core/{202409 => j2735_202409}/include/RequestorDescription.h | 0 .../{202409 => j2735_202409}/include/RequestorPositionVector.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RequestorType.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ReservedBit.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ResponseFlag.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ResponseType.h | 0 .../core/{202409 => j2735_202409}/include/RestrictionAppliesTo.h | 0 .../core/{202409 => j2735_202409}/include/RestrictionClass.h | 0 .../{202409 => j2735_202409}/include/RestrictionClassAssignment.h | 0 .../core/{202409 => j2735_202409}/include/RestrictionClassID.h | 0 .../core/{202409 => j2735_202409}/include/RestrictionClassList.h | 0 .../include/RestrictionUserType-addGrpC.h | 0 .../core/{202409 => j2735_202409}/include/RestrictionUserType.h | 0 .../{202409 => j2735_202409}/include/RestrictionUserTypeList.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ResultFin.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ResultOp.h | 0 .../core/{202409 => j2735_202409}/include/RoadAuthorityID.h | 0 .../{202409 => j2735_202409}/include/RoadGeometryAndAttributes.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RoadGrade.h | 0 .../core/{202409 => j2735_202409}/include/RoadLaneSetList.h | 0 .../core/{202409 => j2735_202409}/include/RoadRegulatorID.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RoadRoughness.h | 0 .../core/{202409 => j2735_202409}/include/RoadSafetyMessage.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RoadSegment.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RoadSegmentID.h | 0 .../core/{202409 => j2735_202409}/include/RoadSegmentList.h | 0 .../{202409 => j2735_202409}/include/RoadSegmentReferenceID.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RoadSideAlert.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RoadSignID.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RoadSnapShot.h | 0 .../core/{202409 => j2735_202409}/include/RoadSurfaceCondition.h | 0 .../include/RoadUserChargingConfigMessage.h | 0 .../include/RoadUserChargingReportMessage.h | 0 .../core/{202409 => j2735_202409}/include/RoadWeatherDownload.h | 0 .../core/{202409 => j2735_202409}/include/RoadWeatherMessage.h | 0 .../core/{202409 => j2735_202409}/include/RoadWeatherUpload.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RoadsideAssets.h | 0 .../core/{202409 => j2735_202409}/include/RoadwayCrownAngle.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Roadwork.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Rock.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RockType.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Roll.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RollDetected.h | 0 .../core/{202409 => j2735_202409}/include/RollRateConfidence.h | 0 .../include/RptAveragedAndSummaryRecord.h | 0 .../core/{202409 => j2735_202409}/include/RptAveragedRecord.h | 0 .../{202409 => j2735_202409}/include/RptAvgAndSummaryRecordData.h | 0 .../core/{202409 => j2735_202409}/include/RptCommSysPerfEvents.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RptDevType.h | 0 .../{202409 => j2735_202409}/include/RptDriverAlertsAndWarnings.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RptEmissions.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RptEvents.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RptHysteresis.h | 0 .../core/{202409 => j2735_202409}/include/RptHysteresisRecord.h | 0 .../{202409 => j2735_202409}/include/RptInstantaneousRecord.h | 0 .../{202409 => j2735_202409}/include/RptInstantaneousRecordData.h | 0 .../{202409 => j2735_202409}/include/RptInstantaneousRecords.h | 0 .../core/{202409 => j2735_202409}/include/RptIntervalEvents.h | 0 .../core/{202409 => j2735_202409}/include/RptKinematicEvents.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RptLocOfStops.h | 0 .../core/{202409 => j2735_202409}/include/RptRoadRoughness.h | 0 .../core/{202409 => j2735_202409}/include/RptRoadwayEvents.h | 0 .../core/{202409 => j2735_202409}/include/RptSummaryRecord.h | 0 .../core/{202409 => j2735_202409}/include/RptTrafficMetrics.h | 0 .../{202409 => j2735_202409}/include/RptTrafficSigEncounters.h | 0 .../core/{202409 => j2735_202409}/include/RptTransitVehData.h | 0 .../core/{202409 => j2735_202409}/include/RptVehicleClass.h | 0 .../core/{202409 => j2735_202409}/include/RptVehicleEvents.h | 0 .../core/{202409 => j2735_202409}/include/RptVehicleReport.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RptVelocity.h | 0 j2735codec/core/{202409 => j2735_202409}/include/RptWiperStatus.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SPAT.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SPAT_TimeMark.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SSPindex.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Sample.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Scale-B12.h | 0 .../core/{202409 => j2735_202409}/include/SchoolBusJ2945Slash1C.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Second.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SecondOfTime.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SecondsAngle.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Segment.h | 0 .../core/{202409 => j2735_202409}/include/SegmentAttributeLL.h | 0 .../{202409 => j2735_202409}/include/SegmentAttributeLLList.h | 0 .../core/{202409 => j2735_202409}/include/SegmentAttributeXY.h | 0 .../{202409 => j2735_202409}/include/SegmentAttributeXYList.h | 0 .../core/{202409 => j2735_202409}/include/SemiMajorAxisAccuracy.h | 0 .../{202409 => j2735_202409}/include/SemiMajorAxisOrientation.h | 0 .../core/{202409 => j2735_202409}/include/SemiMinorAxisAccuracy.h | 0 .../{202409 => j2735_202409}/include/SensorDataSharingMessage.h | 0 .../include/SensorDataSharingMessage_ObjectDistance.h | 0 .../include/SensorDataSharingMessage_PitchRate.h | 0 .../include/SensorDataSharingMessage_PositionOffsetXYZ.h | 0 .../include/SensorDataSharingMessage_RollRate.h | 0 .../core/{202409 => j2735_202409}/include/SeparationDistance.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SessionClass.h | 0 .../core/{202409 => j2735_202409}/include/SessionLocation.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ShapePointSet.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ShortString.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SignPriority.h | 0 .../include/SignalControlAndPrioritizationRequest.h | 0 .../include/SignalControlAndPrioritizationStatus.h | 0 .../core/{202409 => j2735_202409}/include/SignalControlZone.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SignalGroupID.h | 0 .../core/{202409 => j2735_202409}/include/SignalHeadLocation.h | 0 .../{202409 => j2735_202409}/include/SignalHeadLocationList.h | 0 .../core/{202409 => j2735_202409}/include/SignalReqScheme.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SignalRequest.h | 0 .../core/{202409 => j2735_202409}/include/SignalRequestList.h | 0 .../core/{202409 => j2735_202409}/include/SignalRequestMessage.h | 0 .../core/{202409 => j2735_202409}/include/SignalRequestPackage.h | 0 .../core/{202409 => j2735_202409}/include/SignalRequesterInfo.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SignalStatus.h | 0 .../core/{202409 => j2735_202409}/include/SignalStatusList.h | 0 .../core/{202409 => j2735_202409}/include/SignalStatusMessage.h | 0 .../core/{202409 => j2735_202409}/include/SignalStatusPackage.h | 0 .../{202409 => j2735_202409}/include/SignalStatusPackageList.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SignedValue.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SirenInUse.h | 0 .../core/{202409 => j2735_202409}/include/SituationalContainer.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SizeValue.h | 0 .../core/{202409 => j2735_202409}/include/SizeValueConfidence.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SmallNumbers.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Snapshot.h | 0 .../core/{202409 => j2735_202409}/include/SnapshotDistance.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SnapshotTime.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Snow.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SnowType.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SoundLevel.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SpecialCharges.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SpecialEvents.h | 0 .../{202409 => j2735_202409}/include/SpecialVehicleExtensions.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Speed.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SpeedAdvice.h | 0 .../core/{202409 => j2735_202409}/include/SpeedConfidence.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SpeedLimit.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SpeedLimitList.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SpeedLimitType.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SpeedProfile.h | 0 .../{202409 => j2735_202409}/include/SpeedProfileMeasurement.h | 0 .../include/SpeedProfileMeasurementList.h | 0 .../include/SpeedandHeadingandThrottleConfidence.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SportingEvents.h | 0 .../{202409 => j2735_202409}/include/StabilityControlStatus.h | 0 .../core/{202409 => j2735_202409}/include/StatesAndTerritories.h | 0 j2735codec/core/{202409 => j2735_202409}/include/StationID.h | 0 j2735codec/core/{202409 => j2735_202409}/include/StationType.h | 0 j2735codec/core/{202409 => j2735_202409}/include/StdDev.h | 0 .../{202409 => j2735_202409}/include/SteeringAxleLubePressure.h | 0 .../{202409 => j2735_202409}/include/SteeringAxleTemperature.h | 0 .../core/{202409 => j2735_202409}/include/SteeringWheelAngle.h | 0 .../include/SteeringWheelAngleConfidence.h | 0 .../include/SteeringWheelAngleRateOfChange.h | 0 j2735codec/core/{202409 => j2735_202409}/include/StreetSuffixes.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Structures.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SubManeuver.h | 0 .../core/{202409 => j2735_202409}/include/SubManeuverList.h | 0 .../core/{202409 => j2735_202409}/include/SubRegionChargingInfo.h | 0 .../core/{202409 => j2735_202409}/include/SuggestionAdvice.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SummerTime.h | 0 j2735codec/core/{202409 => j2735_202409}/include/SunSensor.h | 0 .../include/SupplementalVehicleExtensions.h | 0 .../include/SurfaceTempMeasurementStdDev.h | 0 .../{202409 => j2735_202409}/include/SurroundingVehicleInfo.h | 0 .../core/{202409 => j2735_202409}/include/SystemInformation.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TRRLength.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TRRLocation.h | 0 .../core/{202409 => j2735_202409}/include/TRRLocationType1.h | 0 .../core/{202409 => j2735_202409}/include/TRRLocationType2.h | 0 .../core/{202409 => j2735_202409}/include/TRRLocationType3.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TRRType.h | 0 .../core/{202409 => j2735_202409}/include/TargetRoadResource.h | 0 .../{202409 => j2735_202409}/include/TariffClassDescription.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TariffClassId.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Temperature.h | 0 .../include/TemperatureMeasurementStdDev.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TemporaryID.h | 0 .../core/{202409 => j2735_202409}/include/TemporaryIDList.h | 0 .../core/{202409 => j2735_202409}/include/TemporaryIDPointer.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TenthSecond.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TermDistance.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TermTime.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TestMessage00.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TestMessage01.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TestMessage02.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TestMessage03.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TestMessage04.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TestMessage05.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TestMessage06.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TestMessage07.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TestMessage08.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TestMessage09.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TestMessage10.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TestMessage11.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TestMessage12.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TestMessage13.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TestMessage14.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TestMessage15.h | 0 .../core/{202409 => j2735_202409}/include/ThrottleConfidence.h | 0 .../core/{202409 => j2735_202409}/include/ThrottlePosition.h | 0 .../core/{202409 => j2735_202409}/include/TimeChangeDetails.h | 0 .../core/{202409 => j2735_202409}/include/TimeChargesTable.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TimeClassId.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TimeCompact.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TimeConfidence.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TimeConstant.h | 0 .../core/{202409 => j2735_202409}/include/TimeInSecond-B16.h | 0 .../core/{202409 => j2735_202409}/include/TimeInSecond-B8.h | 0 .../{202409 => j2735_202409}/include/TimeIntervalConfidence.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TimeOffset.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TimePeriod.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TimeRemaining.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TimeUnit.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TireData.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TireDataList.h | 0 .../core/{202409 => j2735_202409}/include/TireLeakageRate.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TireLocation.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TirePressure.h | 0 .../include/TirePressureThresholdDetection.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TireTemp.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Tolerance.h | 0 .../core/{202409 => j2735_202409}/include/TollAdvertisementInfo.h | 0 .../{202409 => j2735_202409}/include/TollAdvertisementMessage.h | 0 .../core/{202409 => j2735_202409}/include/TollChargerInfo.h | 0 .../core/{202409 => j2735_202409}/include/TollChargesTable.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TollPointID.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TollPointMap.h | 0 .../{202409 => j2735_202409}/include/TollServiceProviderData.h | 0 .../core/{202409 => j2735_202409}/include/TollUsageAckMessage.h | 0 .../core/{202409 => j2735_202409}/include/TollUsageMessage.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TollUserData.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TollVehicleId.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Torque.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TotalMass.h | 0 .../core/{202409 => j2735_202409}/include/TotalWeightCharges.h | 0 .../core/{202409 => j2735_202409}/include/TractionControlStatus.h | 0 .../core/{202409 => j2735_202409}/include/TrafficConditions.h | 0 .../include/TrafficLightControllerStatus.h | 0 .../{202409 => j2735_202409}/include/TrafficLightDirectionCode.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TrafficLightID.h | 0 .../{202409 => j2735_202409}/include/TrafficLightIntervalType.h | 0 .../include/TrafficLightOperationStatus.h | 0 .../core/{202409 => j2735_202409}/include/TrafficLightStatus.h | 0 .../{202409 => j2735_202409}/include/TrafficLightStatusList.h | 0 .../{202409 => j2735_202409}/include/TrafficLightStatusMessage.h | 0 .../core/{202409 => j2735_202409}/include/TrafficLightType.h | 0 .../core/{202409 => j2735_202409}/include/TrafficLightingStatus.h | 0 .../include/TrafficSignalPhaseAndTiming.h | 0 .../{202409 => j2735_202409}/include/TrailerCharacteristics.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TrailerData.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TrailerDetails.h | 0 .../core/{202409 => j2735_202409}/include/TrailerHistoryPoint.h | 0 .../{202409 => j2735_202409}/include/TrailerHistoryPointList.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TrailerMass.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TrailerType.h | 0 .../include/TrailerUnitDescJ2945Slash1B.h | 0 .../{202409 => j2735_202409}/include/TrailerUnitDescription.h | 0 .../{202409 => j2735_202409}/include/TrailerUnitDescriptionList.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TrailerWeight.h | 0 .../core/{202409 => j2735_202409}/include/TrailersJ2945Slash1B.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TransitMode.h | 0 .../core/{202409 => j2735_202409}/include/TransitOperations.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TransitStatus.h | 0 .../{202409 => j2735_202409}/include/TransitVehicleOccupancy.h | 0 .../core/{202409 => j2735_202409}/include/TransitVehicleStatus.h | 0 .../core/{202409 => j2735_202409}/include/TransmissionAndSpeed.h | 0 .../core/{202409 => j2735_202409}/include/TransmissionState.h | 0 .../core/{202409 => j2735_202409}/include/TravelerDataFrame.h | 0 .../core/{202409 => j2735_202409}/include/TravelerDataFrameList.h | 0 .../include/TravelerDataFrameNewPartIIIContent.h | 0 .../core/{202409 => j2735_202409}/include/TravelerGroupAffected.h | 0 .../core/{202409 => j2735_202409}/include/TravelerInfoType.h | 0 .../core/{202409 => j2735_202409}/include/TravelerInformation.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TripInfo.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TumAck.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TumAckHash.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TumData.h | 0 j2735codec/core/{202409 => j2735_202409}/include/TumHash.h | 0 .../core/{202409 => j2735_202409}/include/TumInstructions.h | 0 .../core/{202409 => j2735_202409}/include/TyreConfiguration.h | 0 j2735codec/core/{202409 => j2735_202409}/include/URL-Base.h | 0 j2735codec/core/{202409 => j2735_202409}/include/URL-Link.h | 0 j2735codec/core/{202409 => j2735_202409}/include/URL-Short.h | 0 j2735codec/core/{202409 => j2735_202409}/include/UniqueMSGID.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Units.h | 0 j2735codec/core/{202409 => j2735_202409}/include/UnusualDriving.h | 0 j2735codec/core/{202409 => j2735_202409}/include/UsageReport.h | 0 j2735codec/core/{202409 => j2735_202409}/include/UserClassId.h | 0 j2735codec/core/{202409 => j2735_202409}/include/UserData.h | 0 j2735codec/core/{202409 => j2735_202409}/include/UserFeeInfo.h | 0 j2735codec/core/{202409 => j2735_202409}/include/UserId.h | 0 .../core/{202409 => j2735_202409}/include/UserSizeAndBehaviour.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VINstring.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ValidManeuvers.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ValidRegion.h | 0 .../core/{202409 => j2735_202409}/include/ValidityOfContract.h | 0 .../core/{202409 => j2735_202409}/include/VariationStdDev.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VehTypeCharges.h | 0 .../core/{202409 => j2735_202409}/include/VehTypeChargesTable.h | 0 .../core/{202409 => j2735_202409}/include/VehicleAuthenticator.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VehicleAxles.h | 0 .../{202409 => j2735_202409}/include/VehicleAxlesAndWeightInfo.h | 0 .../core/{202409 => j2735_202409}/include/VehicleAxlesNumber.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VehicleClass.h | 0 .../core/{202409 => j2735_202409}/include/VehicleClassification.h | 0 .../include/VehicleCurrentMaxTrainWeight.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VehicleData.h | 0 .../core/{202409 => j2735_202409}/include/VehicleDescription.h | 0 .../core/{202409 => j2735_202409}/include/VehicleDimensions.h | 0 .../core/{202409 => j2735_202409}/include/VehicleEventFlags.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VehicleHeight.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VehicleID.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VehicleIdent.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VehicleLength.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VehicleMass.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VehicleReport.h | 0 .../{202409 => j2735_202409}/include/VehicleSafetyExtensions.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VehicleSize.h | 0 .../core/{202409 => j2735_202409}/include/VehicleSizeConfidence.h | 0 .../include/VehicleSpecificCharacteristics.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VehicleStatus.h | 0 .../{202409 => j2735_202409}/include/VehicleStatusDeviceTypeTag.h | 0 .../core/{202409 => j2735_202409}/include/VehicleStatusRequest.h | 0 .../{202409 => j2735_202409}/include/VehicleStatusRequestList.h | 0 .../core/{202409 => j2735_202409}/include/VehicleToLanePosition.h | 0 .../{202409 => j2735_202409}/include/VehicleToLanePositionList.h | 0 .../core/{202409 => j2735_202409}/include/VehicleTotalDistance.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VehicleType.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VehicleTypes.h | 0 .../core/{202409 => j2735_202409}/include/VehicleWeightLaden.h | 0 .../core/{202409 => j2735_202409}/include/VehicleWeightLimits.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VehicleWidth.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Velocity.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VertOffset-B07.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VertOffset-B08.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VertOffset-B09.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VertOffset-B10.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VertOffset-B11.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VertOffset-B12.h | 0 .../core/{202409 => j2735_202409}/include/VerticalAcceleration.h | 0 .../include/VerticalAccelerationThreshold.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VerticalOffset.h | 0 .../{202409 => j2735_202409}/include/VisibilityAndAirQuality.h | 0 j2735codec/core/{202409 => j2735_202409}/include/VisualLink.h | 0 j2735codec/core/{202409 => j2735_202409}/include/WDMSFleetData.h | 0 j2735codec/core/{202409 => j2735_202409}/include/WaitOnStopline.h | 0 j2735codec/core/{202409 => j2735_202409}/include/WarningAdvice.h | 0 .../core/{202409 => j2735_202409}/include/WeatherConditions.h | 0 j2735codec/core/{202409 => j2735_202409}/include/WeatherProbe.h | 0 j2735codec/core/{202409 => j2735_202409}/include/WeatherReport.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Weekday.h | 0 j2735codec/core/{202409 => j2735_202409}/include/WeightCharges.h | 0 .../core/{202409 => j2735_202409}/include/WeightChargesTable.h | 0 .../core/{202409 => j2735_202409}/include/WheelEndElectFault.h | 0 .../core/{202409 => j2735_202409}/include/WheelSensorStatus.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Winds.h | 0 .../core/{202409 => j2735_202409}/include/WinterDrivingIndex.h | 0 .../{202409 => j2735_202409}/include/WinterDrivingRestrictions.h | 0 j2735codec/core/{202409 => j2735_202409}/include/WiperRate.h | 0 j2735codec/core/{202409 => j2735_202409}/include/WiperSet.h | 0 j2735codec/core/{202409 => j2735_202409}/include/WiperStatus.h | 0 j2735codec/core/{202409 => j2735_202409}/include/WorkZone.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Yaw.h | 0 j2735codec/core/{202409 => j2735_202409}/include/YawDetected.h | 0 j2735codec/core/{202409 => j2735_202409}/include/YawRate.h | 0 .../core/{202409 => j2735_202409}/include/YawRateConfidence.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Year.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ZoneLength.h | 0 j2735codec/core/{202409 => j2735_202409}/include/Zoom.h | 0 j2735codec/core/{202409 => j2735_202409}/include/aper_decoder.h | 0 j2735codec/core/{202409 => j2735_202409}/include/aper_encoder.h | 0 j2735codec/core/{202409 => j2735_202409}/include/aper_opentype.h | 0 j2735codec/core/{202409 => j2735_202409}/include/aper_support.h | 0 .../core/{202409 => j2735_202409}/include/asn_SEQUENCE_OF.h | 0 j2735codec/core/{202409 => j2735_202409}/include/asn_SET_OF.h | 0 .../core/{202409 => j2735_202409}/include/asn_application.h | 0 j2735codec/core/{202409 => j2735_202409}/include/asn_bit_data.h | 0 j2735codec/core/{202409 => j2735_202409}/include/asn_codecs.h | 0 .../core/{202409 => j2735_202409}/include/asn_codecs_prim.h | 0 j2735codec/core/{202409 => j2735_202409}/include/asn_config.h | 0 j2735codec/core/{202409 => j2735_202409}/include/asn_constant.h | 0 j2735codec/core/{202409 => j2735_202409}/include/asn_internal.h | 0 j2735codec/core/{202409 => j2735_202409}/include/asn_ioc.h | 0 .../core/{202409 => j2735_202409}/include/asn_random_fill.h | 0 j2735codec/core/{202409 => j2735_202409}/include/asn_system.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ber_decoder.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ber_tlv_length.h | 0 j2735codec/core/{202409 => j2735_202409}/include/ber_tlv_tag.h | 0 j2735codec/core/{202409 => j2735_202409}/include/constr_CHOICE.h | 0 .../core/{202409 => j2735_202409}/include/constr_SEQUENCE.h | 0 .../core/{202409 => j2735_202409}/include/constr_SEQUENCE_OF.h | 0 j2735codec/core/{202409 => j2735_202409}/include/constr_SET_OF.h | 0 j2735codec/core/{202409 => j2735_202409}/include/constr_TYPE.h | 0 j2735codec/core/{202409 => j2735_202409}/include/constraints.h | 0 j2735codec/core/{202409 => j2735_202409}/include/der_encoder.h | 0 j2735codec/core/{202409 => j2735_202409}/include/jer_decoder.h | 0 j2735codec/core/{202409 => j2735_202409}/include/jer_encoder.h | 0 j2735codec/core/{202409 => j2735_202409}/include/jer_support.h | 0 j2735codec/core/{202409 => j2735_202409}/include/oer_decoder.h | 0 j2735codec/core/{202409 => j2735_202409}/include/oer_encoder.h | 0 j2735codec/core/{202409 => j2735_202409}/include/oer_support.h | 0 j2735codec/core/{202409 => j2735_202409}/include/pdu_collection.h | 0 j2735codec/core/{202409 => j2735_202409}/include/per_decoder.h | 0 j2735codec/core/{202409 => j2735_202409}/include/per_encoder.h | 0 j2735codec/core/{202409 => j2735_202409}/include/per_opentype.h | 0 j2735codec/core/{202409 => j2735_202409}/include/per_support.h | 0 j2735codec/core/{202409 => j2735_202409}/include/uper_decoder.h | 0 j2735codec/core/{202409 => j2735_202409}/include/uper_encoder.h | 0 j2735codec/core/{202409 => j2735_202409}/include/uper_opentype.h | 0 j2735codec/core/{202409 => j2735_202409}/include/uper_support.h | 0 j2735codec/core/{202409 => j2735_202409}/include/xer_decoder.h | 0 j2735codec/core/{202409 => j2735_202409}/include/xer_encoder.h | 0 j2735codec/core/{202409 => j2735_202409}/include/xer_support.h | 0 j2735codec/core/{202409 => j2735_202409}/samples/jer/bsm.json | 0 j2735codec/core/{202409 => j2735_202409}/samples/jer/eva.json | 0 j2735codec/core/{202409 => j2735_202409}/samples/jer/map.json | 0 j2735codec/core/{202409 => j2735_202409}/samples/jer/psm.json | 0 j2735codec/core/{202409 => j2735_202409}/samples/jer/sdsm.json | 0 j2735codec/core/{202409 => j2735_202409}/samples/jer/spat.json | 0 j2735codec/core/{202409 => j2735_202409}/samples/jer/tim.json | 0 j2735codec/core/{202409 => j2735_202409}/src/ANY.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ANY_aper.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ANY_ber.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ANY_jer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ANY_uper.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ANY_xer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AbsolutePosition2d.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AbsolutePosition3d.c | 0 .../{202409 => j2735_202409}/src/AccelSteerYawRateConfidence.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AccelTimeConstant.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Acceleration.c | 0 .../core/{202409 => j2735_202409}/src/AccelerationConfidence.c | 0 .../core/{202409 => j2735_202409}/src/AccelerationSet4Way.c | 0 .../core/{202409 => j2735_202409}/src/AcceleratorPedalPosition.c | 0 .../core/{202409 => j2735_202409}/src/AccidentsAndIncidents.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AccountStatus.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AckPolicy.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Activity.c | 0 .../core/{202409 => j2735_202409}/src/ActualNumberOfPassengers.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ActuatedInterval.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AddGrpB_Angle.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AddGrpB_Elevation.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AddGrpB_MsgCount.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AddGrpB_TimeMark.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AddGrpC_Altitude.c | 0 .../{202409 => j2735_202409}/src/AdviceInstructionsMandatory.c | 0 .../src/AdviceInstructionsRecommendations.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AdvisorySpeed.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AdvisorySpeedList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AdvisorySpeedType.c | 0 .../src/AggregatedSingleTariffClassSession.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AllowedManeuvers.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AlternateRoute.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AltitudeConfidence.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AltitudeValue.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AmbientAirPressure.c | 0 .../core/{202409 => j2735_202409}/src/AmbientAirTemperature.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AngularVelocity.c | 0 .../core/{202409 => j2735_202409}/src/AngularVelocityConfidence.c | 0 .../core/{202409 => j2735_202409}/src/AnimalPropelledType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AnimalType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AntennaOffsetSet.c | 0 .../core/{202409 => j2735_202409}/src/AntiLockBrakeStatus.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ApplicableHeading.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ApproachID.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ApproachOrLane.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Area.c | 0 .../core/{202409 => j2735_202409}/src/AreaOrSegmentChargingInfo.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AreaType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AsphaltOrTar.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AsphaltOrTarType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AssetStatus.c | 0 .../{202409 => j2735_202409}/src/AtmosPressureMeasurementStdDev.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Attachment.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AttachmentRadius.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Attitude.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AttitudeConfidence.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AudioLink.c | 0 .../core/{202409 => j2735_202409}/src/AuxiliaryBrakeStatus.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AxesMovement.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AxleLocation.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AxleWeight.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AxleWeightLimit.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AxleWeightLimits.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AxleWeightList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AxleWeightSet.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Axles.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AxlesCharges.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AxlesChargesTable.c | 0 j2735codec/core/{202409 => j2735_202409}/src/AxlesWeightLimits.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BIT_STRING.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BIT_STRING_jer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BIT_STRING_oer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BIT_STRING_print.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BIT_STRING_rfill.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BIT_STRING_uper.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BIT_STRING_xer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BOOLEAN.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BOOLEAN_aper.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BOOLEAN_ber.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BOOLEAN_jer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BOOLEAN_oer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BOOLEAN_print.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BOOLEAN_rfill.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BOOLEAN_uper.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BOOLEAN_xer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BSMcoreData.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BankAngle.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BasicSafetyMessage.c | 0 .../{202409 => j2735_202409}/src/BasicSafetyMessage_PartII-Id.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BasicVehicleClass.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BasicVehicleRole.c | 0 .../core/{202409 => j2735_202409}/src/BrakeAppliedPressure.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BrakeAppliedStatus.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BrakeBoostApplied.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BrakePedalPosition.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BrakeSystemStatus.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BroadRegion.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BroadRegionArea.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BumperHeight.c | 0 j2735codec/core/{202409 => j2735_202409}/src/BumperHeights.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CCMFaultMode.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CCMPartIIcontent.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CO2EmissionValue.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CargoWeight.c | 0 .../{202409 => j2735_202409}/src/CfgAveragedAndSummaryTriggers.c | 0 .../core/{202409 => j2735_202409}/src/CfgAveragedTriggers.c | 0 .../core/{202409 => j2735_202409}/src/CfgCommSysPerfEvents.c | 0 .../core/{202409 => j2735_202409}/src/CfgEmerAndTransitInfo.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CfgEventRecurrence.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CfgEvents.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CfgHysteresis.c | 0 .../{202409 => j2735_202409}/src/CfgInstantaneousEventTriggers.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CfgInterval.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CfgIntervalEvents.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CfgKinematicEvents.c | 0 .../core/{202409 => j2735_202409}/src/CfgLowSpeedCriteria.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CfgMsgDictionary.c | 0 .../core/{202409 => j2735_202409}/src/CfgMsgRecepIndicators.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CfgRoadSignInfo.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CfgRoadSignTypes.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CfgRoadwayEvents.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CfgStoppedCriteria.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CfgSummaryTriggers.c | 0 .../core/{202409 => j2735_202409}/src/CfgTrafficSigEncounters.c | 0 .../core/{202409 => j2735_202409}/src/CfgTransitVehicleData.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CfgVehicleClass.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CfgVehicleEvents.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ChargeObjectId.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ChargerInfo.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ChargesTable.c | 0 .../core/{202409 => j2735_202409}/src/ChargingAreaOrSegment.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ChargingConfig.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ChargingFees.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ChargingUnits.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Cinders.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CindersType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Circle.c | 0 .../core/{202409 => j2735_202409}/src/ClassificationConfidence.c | 0 .../core/{202409 => j2735_202409}/src/ClosedNetworkChargesTable.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Closures.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CoarseHeading.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CodeWord.c | 0 .../core/{202409 => j2735_202409}/src/CoefficientOfFriction.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CommonContainer.c | 0 .../core/{202409 => j2735_202409}/src/CommonSafetyRequest.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Common_Angle.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Common_Duration.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Common_Elevation.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Common_Latitude.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Common_Longitude.c | 0 .../core/{202409 => j2735_202409}/src/Common_MeanVariation.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Common_MsgCount.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ComputedLane.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Confidence.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ConfidenceSet.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ConfigBoundary.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ConfigDescriptor.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ConfigId.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ConfigInfo.c | 0 .../core/{202409 => j2735_202409}/src/ConfigTemporalBoundary.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ConfigTriggers.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ConnectingLane.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Connection.c | 0 .../src/ConnectionManeuverAssist-addGrpC.c | 0 .../core/{202409 => j2735_202409}/src/ConnectionManeuverAssist.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ConnectsToList.c | 0 .../core/{202409 => j2735_202409}/src/ConsecutiveTrafficLight.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ContentContainer.c | 0 .../core/{202409 => j2735_202409}/src/ContractAuthenticator.c | 0 .../core/{202409 => j2735_202409}/src/ContractSerialNumber.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ContractValidity.c | 0 .../core/{202409 => j2735_202409}/src/CooperativeControlMessage.c | 0 .../src/CooperativeControlMessage_ManeuverID.c | 0 .../src/CooperativeControlMessage_PartII-Id.c | 0 .../src/CooperativeControlMessage_PitchRate.c | 0 .../src/CooperativeControlMessage_RollRate.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CopValue.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Count.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CountryCode.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CrossLinking.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CurrentStateData.c | 0 j2735codec/core/{202409 => j2735_202409}/src/CurveContainer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DDate.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DDateTime.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DDay.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DFullTime.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DHour.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DMinute.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DMonth.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DMonthDay.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DOffset.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DSRCmsgID.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DSecond.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DTime.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DYear.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DYearMonth.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DataParameters.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DataSourceInfo.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DateAndTime.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DateCompact.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Day.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DayOfWeek.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DegreesLat.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DegreesLong.c | 0 .../core/{202409 => j2735_202409}/src/DelayStatusCancellation.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DeltaAngle.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DeltaTime.c | 0 .../core/{202409 => j2735_202409}/src/DescriptionOfRoadSurface.c | 0 .../{202409 => j2735_202409}/src/DescriptiveCharacteristics.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DescriptiveName.c | 0 .../core/{202409 => j2735_202409}/src/DetectedChargeObject.c | 0 .../core/{202409 => j2735_202409}/src/DetectedObjectCommonData.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DetectedObjectData.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DetectedObjectList.c | 0 .../{202409 => j2735_202409}/src/DetectedObjectOptionalData.c | 0 .../core/{202409 => j2735_202409}/src/DetectedObstacleData.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DetectedVRUData.c | 0 .../core/{202409 => j2735_202409}/src/DetectedVehicleData.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DetectionMode.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DeviceStatus.c | 0 .../{202409 => j2735_202409}/src/DewPointTempMeasurementStdDev.c | 0 .../core/{202409 => j2735_202409}/src/DieselEmissionValues.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DirectionOfUse.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DisabledVehicle.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Disasters.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Distance.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DistanceUnit.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DistanceUnits.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Disturbances.c | 0 .../core/{202409 => j2735_202409}/src/DriveAxleLiftAirPressure.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DriveAxleLocation.c | 0 .../core/{202409 => j2735_202409}/src/DriveAxleLubePressure.c | 0 .../core/{202409 => j2735_202409}/src/DriveAxleTemperature.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Driven.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DrivenLineOffsetLg.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DrivenLineOffsetSm.c | 0 .../core/{202409 => j2735_202409}/src/DriverCharacteristics.c | 0 j2735codec/core/{202409 => j2735_202409}/src/DrivingWheelAngle.c | 0 .../core/{202409 => j2735_202409}/src/DynamicInfoContainer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ENUMERATED.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ENUMERATED_aper.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ENUMERATED_jer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ENUMERATED_oer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ENUMERATED_uper.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EXTERNAL.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EfcContextMark.c | 0 .../{202409 => j2735_202409}/src/EfcDataDictionary_Altitude.c | 0 .../{202409 => j2735_202409}/src/EfcDataDictionary_Duration.c | 0 .../{202409 => j2735_202409}/src/EfcDataDictionary_Latitude.c | 0 .../{202409 => j2735_202409}/src/EfcDataDictionary_Longitude.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EfcTime.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ElevOffset.c | 0 .../core/{202409 => j2735_202409}/src/ElevationConfidence.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EmergencyDetails.c | 0 .../core/{202409 => j2735_202409}/src/EmergencyVehicleAlert.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EmissionType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EmissionUnit.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EnabledLaneList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EncryptedTumData.c | 0 .../core/{202409 => j2735_202409}/src/EngineCharacteristics.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EngineDetails.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EntryChargesTable.c | 0 .../{202409 => j2735_202409}/src/EnvironmentalCharacteristics.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EquipmentIccId.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EquipmentObuId.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EquipmentStatus.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EquipmentType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EssMobileFriction.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EssPrecipRate.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EssPrecipSituation.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EssPrecipYesNo.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EssSolarRadiation.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EuroValue.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EventDescription.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EventIdentifier.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EventInfo.c | 0 j2735codec/core/{202409 => j2735_202409}/src/EventRecurrence.c | 0 .../core/{202409 => j2735_202409}/src/ExhaustEmissionValues.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ExitChargesTable.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ExitInfo.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ExitService.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Extent.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ExteriorLights.c | 0 j2735codec/core/{202409 => j2735_202409}/src/FeeReport.c | 0 .../core/{202409 => j2735_202409}/src/FrictionInformation.c | 0 j2735codec/core/{202409 => j2735_202409}/src/FrontCutIn.c | 0 j2735codec/core/{202409 => j2735_202409}/src/FuelType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/FullPositionVector.c | 0 .../core/{202409 => j2735_202409}/src/FullRoadAuthorityID.c | 0 j2735codec/core/{202409 => j2735_202409}/src/FurtherInfoID.c | 0 .../core/{202409 => j2735_202409}/src/FutureCharacteristics.c | 0 j2735codec/core/{202409 => j2735_202409}/src/GNSSstatus.c | 0 j2735codec/core/{202409 => j2735_202409}/src/GeneralizedTime.c | 0 .../core/{202409 => j2735_202409}/src/GeneralizedTime_ber.c | 0 .../core/{202409 => j2735_202409}/src/GeneralizedTime_jer.c | 0 .../core/{202409 => j2735_202409}/src/GeneralizedTime_print.c | 0 .../core/{202409 => j2735_202409}/src/GeneralizedTime_rfill.c | 0 .../core/{202409 => j2735_202409}/src/GeneralizedTime_xer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/GenericLane.c | 0 j2735codec/core/{202409 => j2735_202409}/src/GenericSignage.c | 0 j2735codec/core/{202409 => j2735_202409}/src/GeographicalPath.c | 0 .../core/{202409 => j2735_202409}/src/GeometricProjection.c | 0 j2735codec/core/{202409 => j2735_202409}/src/GraphicString.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Grass.c | 0 j2735codec/core/{202409 => j2735_202409}/src/GrassType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Gravel.c | 0 j2735codec/core/{202409 => j2735_202409}/src/GravelType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/GrossDistance.c | 0 j2735codec/core/{202409 => j2735_202409}/src/GrossSpeed.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Header.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Heading.c | 0 j2735codec/core/{202409 => j2735_202409}/src/HeadingConfidence.c | 0 j2735codec/core/{202409 => j2735_202409}/src/HeadingDeg.c | 0 j2735codec/core/{202409 => j2735_202409}/src/HeadingSlice.c | 0 .../core/{202409 => j2735_202409}/src/HeavyTruckCCMExtensions.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Holiday.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Hour.c | 0 j2735codec/core/{202409 => j2735_202409}/src/HumanPropelledType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/IA5String.c | 0 j2735codec/core/{202409 => j2735_202409}/src/INTEGER.c | 0 j2735codec/core/{202409 => j2735_202409}/src/INTEGER_aper.c | 0 j2735codec/core/{202409 => j2735_202409}/src/INTEGER_ber.c | 0 j2735codec/core/{202409 => j2735_202409}/src/INTEGER_jer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/INTEGER_oer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/INTEGER_print.c | 0 j2735codec/core/{202409 => j2735_202409}/src/INTEGER_rfill.c | 0 j2735codec/core/{202409 => j2735_202409}/src/INTEGER_uper.c | 0 j2735codec/core/{202409 => j2735_202409}/src/INTEGER_xer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ITISEventType.c | 0 .../core/{202409 => j2735_202409}/src/ITIS_GenericLocations.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ITIS_ITIScodes.c | 0 .../core/{202409 => j2735_202409}/src/ITIS_ITIScodesAndText.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ITIS_ITIStext.c | 0 .../{202409 => j2735_202409}/src/ITIS_IncidentResponseEquipment.c | 0 .../{202409 => j2735_202409}/src/ITIS_ResponderGroupAffected.c | 0 .../core/{202409 => j2735_202409}/src/ITIS_VehicleGroupAffected.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ITISgroups.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ITIStextPhrase.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Ice.c | 0 j2735codec/core/{202409 => j2735_202409}/src/IceType.c | 0 .../core/{202409 => j2735_202409}/src/IncidentResponseStatus.c | 0 j2735codec/core/{202409 => j2735_202409}/src/IncidentsContainer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Int1Signed.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Int1Unsigned.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Int2Signed.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Int2Unsigned.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Int3Unsigned.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Int4Signed.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Int4Unsigned.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Int8Signed.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Int8Unsigned.c | 0 .../core/{202409 => j2735_202409}/src/IntersectionAccessPoint.c | 0 .../core/{202409 => j2735_202409}/src/IntersectionCollision.c | 0 .../core/{202409 => j2735_202409}/src/IntersectionGeometry.c | 0 .../core/{202409 => j2735_202409}/src/IntersectionGeometryList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/IntersectionID.c | 0 .../core/{202409 => j2735_202409}/src/IntersectionReferenceID.c | 0 .../core/{202409 => j2735_202409}/src/IntersectionState-addGrpC.c | 0 j2735codec/core/{202409 => j2735_202409}/src/IntersectionState.c | 0 .../core/{202409 => j2735_202409}/src/IntersectionStateList.c | 0 .../core/{202409 => j2735_202409}/src/IntersectionStatusObject.c | 0 j2735codec/core/{202409 => j2735_202409}/src/IsDolly.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Iso3833VehicleType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/IssuerIdentifier.c | 0 .../core/{202409 => j2735_202409}/src/ItemizedChargerData.c | 0 .../core/{202409 => j2735_202409}/src/ItemizedPaymentReport.c | 0 j2735codec/core/{202409 => j2735_202409}/src/J1939data.c | 0 .../{202409 => j2735_202409}/src/J2540ITIS_GenericLocations.c | 0 .../core/{202409 => j2735_202409}/src/J2540ITIS_ITIScodes.c | 0 .../{202409 => j2735_202409}/src/J2540ITIS_ITIScodesAndText.c | 0 j2735codec/core/{202409 => j2735_202409}/src/J2540ITIS_ITIStext.c | 0 .../src/J2540ITIS_IncidentResponseEquipment.c | 0 .../src/J2540ITIS_ResponderGroupAffected.c | 0 .../{202409 => j2735_202409}/src/J2540ITIS_VehicleGroupAffected.c | 0 .../core/{202409 => j2735_202409}/src/LaneAttributes-Barrier.c | 0 .../core/{202409 => j2735_202409}/src/LaneAttributes-Bike.c | 0 .../core/{202409 => j2735_202409}/src/LaneAttributes-Crosswalk.c | 0 .../core/{202409 => j2735_202409}/src/LaneAttributes-Parking.c | 0 .../core/{202409 => j2735_202409}/src/LaneAttributes-Sidewalk.c | 0 .../core/{202409 => j2735_202409}/src/LaneAttributes-Striping.c | 0 .../{202409 => j2735_202409}/src/LaneAttributes-TrackedVehicle.c | 0 .../core/{202409 => j2735_202409}/src/LaneAttributes-Vehicle.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LaneAttributes.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LaneChargesTable.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LaneClosed.c | 0 .../core/{202409 => j2735_202409}/src/LaneClosureContainer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LaneConnectionID.c | 0 .../core/{202409 => j2735_202409}/src/LaneDataAttribute-addGrpB.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LaneDataAttribute.c | 0 .../core/{202409 => j2735_202409}/src/LaneDataAttributeList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LaneDirection.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LaneID.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LaneInfo.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LaneList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LaneOffset.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LaneRoadway.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LaneSharing.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LaneTypeAttributes.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LaneWidth.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LargeNumbers.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LastTollPointInfo.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LastTollPointInfos.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LatOffset.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LatitudeDMS.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LatitudeDMS2.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LayerID.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LayerType.c | 0 .../core/{202409 => j2735_202409}/src/LightVehicleCCMExtensions.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LightbarInUse.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LocAndTimeStamp.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LocAndTimeStamps.c | 0 .../core/{202409 => j2735_202409}/src/LocalVehicleClassId.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Location-quality.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Location-tech.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LocationClassId.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LongOffset.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LongitudeDMS.c | 0 j2735codec/core/{202409 => j2735_202409}/src/LongitudeDMS2.c | 0 .../core/{202409 => j2735_202409}/src/LongitudinalControlState.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Lpn.c | 0 j2735codec/core/{202409 => j2735_202409}/src/MSCMType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/MUTCDCode.c | 0 j2735codec/core/{202409 => j2735_202409}/src/MUTCDLocations.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Maneuver.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ManeuverAssistList.c | 0 .../core/{202409 => j2735_202409}/src/ManeuverExecutionStatus.c | 0 .../src/ManeuverSharingAndCoordinatingMessage.c | 0 .../src/ManeuverSharingAndCoordinatingMessage_ManeuverID.c | 0 .../src/ManeuverSharingAndCoordinatingMessage_ObjectDistance.c | 0 .../src/ManeuverSharingAndCoordinatingMessage_PositionOffsetXYZ.c | 0 j2735codec/core/{202409 => j2735_202409}/src/MapData-addGrpC.c | 0 j2735codec/core/{202409 => j2735_202409}/src/MapData.c | 0 .../core/{202409 => j2735_202409}/src/MaxAvailableAcceleration.c | 0 .../core/{202409 => j2735_202409}/src/MaxAvailableDeceleration.c | 0 j2735codec/core/{202409 => j2735_202409}/src/MaxTimetoChange.c | 0 .../core/{202409 => j2735_202409}/src/MeasurementTimeOffset.c | 0 .../core/{202409 => j2735_202409}/src/MergeDivergeNodeAngle.c | 0 j2735codec/core/{202409 => j2735_202409}/src/MessageBLOB.c | 0 j2735codec/core/{202409 => j2735_202409}/src/MessageFrame.c | 0 j2735codec/core/{202409 => j2735_202409}/src/MinTimetoChange.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Minute.c | 0 j2735codec/core/{202409 => j2735_202409}/src/MinuteOfTheYear.c | 0 j2735codec/core/{202409 => j2735_202409}/src/MinutesAngle.c | 0 j2735codec/core/{202409 => j2735_202409}/src/MinutesDuration.c | 0 j2735codec/core/{202409 => j2735_202409}/src/MobileSituation.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Month.c | 0 .../core/{202409 => j2735_202409}/src/MotorizedPropelledType.c | 0 .../core/{202409 => j2735_202409}/src/MovementEvent-addGrpB.c | 0 j2735codec/core/{202409 => j2735_202409}/src/MovementEvent.c | 0 j2735codec/core/{202409 => j2735_202409}/src/MovementEventList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/MovementList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/MovementPhaseState.c | 0 j2735codec/core/{202409 => j2735_202409}/src/MovementState.c | 0 j2735codec/core/{202409 => j2735_202409}/src/MsgCRC.c | 0 .../core/{202409 => j2735_202409}/src/MultiVehicleResponse.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NMEA-MsgType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NMEA-Payload.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NMEA-Revision.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NMEAcorrections.c | 0 .../core/{202409 => j2735_202409}/src/NTCIPEssAirTemperature.c | 0 .../core/{202409 => j2735_202409}/src/NTCIPEssCloudSituationV4.c | 0 .../core/{202409 => j2735_202409}/src/NTCIPEssDewpointTemp.c | 0 .../{202409 => j2735_202409}/src/NTCIPEssPaveTreatProductForm.c | 0 .../{202409 => j2735_202409}/src/NTCIPEssPaveTreatProductType.c | 0 .../{202409 => j2735_202409}/src/NTCIPEssPaveTreatmentAmount.c | 0 .../{202409 => j2735_202409}/src/NTCIPEssPaveTreatmentWidth.c | 0 .../src/NTCIPEssPavementTreatmentLatitude.c | 0 .../src/NTCIPEssPavementTreatmentLocation.c | 0 .../src/NTCIPEssPavementTreatmentLongitude.c | 0 .../core/{202409 => j2735_202409}/src/NTCIPEssPercentProductMix.c | 0 .../src/NTCIPEssPressureSensorAtmosphericPressure.c | 0 .../{202409 => j2735_202409}/src/NTCIPEssSurfaceIceOrWaterDepth.c | 0 .../{202409 => j2735_202409}/src/NTCIPEssSurfaceTemperature.c | 0 .../src/NTCIPEssTemperatureSensorHeight.c | 0 .../{202409 => j2735_202409}/src/NTCIPEssTotalRadiationPeriod.c | 0 .../core/{202409 => j2735_202409}/src/NTCIPEssTotalRadiationV4.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NTCIPEssVisibility.c | 0 .../{202409 => j2735_202409}/src/NTCIPEssVisibilitySituation.c | 0 .../src/NTCIPHumiditySensorRelativeHumidity.c | 0 .../src/NTCIPPavementSensorSurfaceCondition.c | 0 .../src/NTCIPPrecipitationSensorPrecipSituation.c | 0 .../{202409 => j2735_202409}/src/NTCIPWindSensorAvgDirection.c | 0 .../core/{202409 => j2735_202409}/src/NTCIPWindSensorAvgSpeed.c | 0 .../{202409 => j2735_202409}/src/NTCIPWindSensorGustDirection.c | 0 .../core/{202409 => j2735_202409}/src/NTCIPWindSensorGustSpeed.c | 0 .../{202409 => j2735_202409}/src/NTCIPWindSensorSpotDirection.c | 0 .../core/{202409 => j2735_202409}/src/NTCIPWindSensorSpotSpeed.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NULL.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NULL_aper.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NULL_ber.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NULL_jer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NULL_oer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NULL_print.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NULL_rfill.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NULL_uper.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NULL_xer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NamedObjects.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NativeEnumerated.c | 0 .../core/{202409 => j2735_202409}/src/NativeEnumerated_aper.c | 0 .../core/{202409 => j2735_202409}/src/NativeEnumerated_ber.c | 0 .../core/{202409 => j2735_202409}/src/NativeEnumerated_jer.c | 0 .../core/{202409 => j2735_202409}/src/NativeEnumerated_oer.c | 0 .../core/{202409 => j2735_202409}/src/NativeEnumerated_uper.c | 0 .../core/{202409 => j2735_202409}/src/NativeEnumerated_xer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NativeInteger.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NativeInteger_aper.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NativeInteger_ber.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NativeInteger_jer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NativeInteger_oer.c | 0 .../core/{202409 => j2735_202409}/src/NativeInteger_print.c | 0 .../core/{202409 => j2735_202409}/src/NativeInteger_rfill.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NativeInteger_uper.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NativeInteger_xer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Node-LL-24B.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Node-LL-28B.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Node-LL-32B.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Node-LL-36B.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Node-LL-44B.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Node-LL-48B.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Node-LLdms-48b.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Node-LLdms-80b.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Node-LLmD-64b.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Node-XY-20b.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Node-XY-22b.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Node-XY-24b.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Node-XY-26b.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Node-XY-28b.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Node-XY-32b.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NodeAttributeLL.c | 0 .../core/{202409 => j2735_202409}/src/NodeAttributeLLList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NodeAttributeSetLL.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NodeAttributeSetXY.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NodeAttributeXY.c | 0 .../core/{202409 => j2735_202409}/src/NodeAttributeXYList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NodeLL.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NodeListLL.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NodeListXY.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NodeOffsetPointLL.c | 0 .../core/{202409 => j2735_202409}/src/NodeOffsetPointXY-addGrpB.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NodeOffsetPointXY.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NodePointLLE.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NodeSetLL.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NodeSetXY.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NodeXY.c | 0 .../core/{202409 => j2735_202409}/src/NtcipAirTemperature.c | 0 .../core/{202409 => j2735_202409}/src/NtcipAtmosphericPressure.c | 0 .../core/{202409 => j2735_202409}/src/NtcipCloudSituation.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NtcipDewPoint.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NtcipEssData.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NtcipPavement.c | 0 .../core/{202409 => j2735_202409}/src/NtcipPavementTreatment.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NtcipPrecipitation.c | 0 .../core/{202409 => j2735_202409}/src/NtcipRelativeHumidity.c | 0 .../core/{202409 => j2735_202409}/src/NtcipSolarRadiation.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NtcipVisibility.c | 0 .../core/{202409 => j2735_202409}/src/NtcipVisibilitySituation.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NtcipWind.c | 0 j2735codec/core/{202409 => j2735_202409}/src/NumberOfAxles.c | 0 .../{202409 => j2735_202409}/src/NumberOfParticipantsInCluster.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OBJECT_IDENTIFIER.c | 0 .../core/{202409 => j2735_202409}/src/OBJECT_IDENTIFIER_jer.c | 0 .../core/{202409 => j2735_202409}/src/OBJECT_IDENTIFIER_print.c | 0 .../core/{202409 => j2735_202409}/src/OBJECT_IDENTIFIER_rfill.c | 0 .../core/{202409 => j2735_202409}/src/OBJECT_IDENTIFIER_xer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OCTET_STRING.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OCTET_STRING_aper.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OCTET_STRING_ber.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OCTET_STRING_jer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OCTET_STRING_oer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OCTET_STRING_print.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OCTET_STRING_rfill.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OCTET_STRING_uper.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OCTET_STRING_xer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OPEN_TYPE.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OPEN_TYPE_aper.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OPEN_TYPE_ber.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OPEN_TYPE_jer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OPEN_TYPE_oer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OPEN_TYPE_uper.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OPEN_TYPE_xer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ObeId.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ObjectCount.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ObjectDescriptor.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ObjectID.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ObjectType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Objects.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ObstacleDetection.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ObstacleDirection.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ObstacleDistance.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ObstacleSize.c | 0 .../core/{202409 => j2735_202409}/src/ObstacleSizeConfidence.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Obstruction.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Obstructions.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Offset-B09.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Offset-B10.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Offset-B11.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Offset-B12.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Offset-B13.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Offset-B14.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Offset-B16.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Offset3D.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OffsetLL-B12.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OffsetLL-B14.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OffsetLL-B16.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OffsetLL-B18.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OffsetLL-B22.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OffsetLL-B24.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OffsetSystem.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OperatorDefined.c | 0 j2735codec/core/{202409 => j2735_202409}/src/OverlayLaneList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Parked.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ParkingInformation.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PartIIcontent.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Particulate.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PassengerCapacity.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Path.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PathHistory.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PathHistoryPoint.c | 0 .../core/{202409 => j2735_202409}/src/PathHistoryPointList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PathList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PathPoints.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PathPrediction.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PavementConditions.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PayUnit.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PayloadData.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PaymentFee.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PaymentMeans.c | 0 .../core/{202409 => j2735_202409}/src/PaymentMeansBalance.c | 0 .../core/{202409 => j2735_202409}/src/PaymentSecurityData.c | 0 .../core/{202409 => j2735_202409}/src/PedestrianBicycleDetect.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PedestrianCall.c | 0 .../core/{202409 => j2735_202409}/src/PerAxleWeightCharges.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Period.c | 0 .../core/{202409 => j2735_202409}/src/PermissiveNonProtected.c | 0 .../core/{202409 => j2735_202409}/src/PersonalAccountNumber.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PersonalAssistive.c | 0 .../core/{202409 => j2735_202409}/src/PersonalClusterRadius.c | 0 .../{202409 => j2735_202409}/src/PersonalCrossingInProgress.c | 0 .../core/{202409 => j2735_202409}/src/PersonalCrossingRequest.c | 0 .../core/{202409 => j2735_202409}/src/PersonalDeviceUsageState.c | 0 .../core/{202409 => j2735_202409}/src/PersonalDeviceUserType.c | 0 .../core/{202409 => j2735_202409}/src/PersonalSafetyMessage.c | 0 .../core/{202409 => j2735_202409}/src/PersonalSafetyMessage2.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Pitch.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PitchDetected.c | 0 .../core/{202409 => j2735_202409}/src/PitchRateConfidence.c | 0 .../core/{202409 => j2735_202409}/src/PivotPointDescription.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PivotingAllowed.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Point.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PortlandCement.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PortlandCementType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Position3D-addGrpB.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Position3D-addGrpC.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Position3D.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PositionConfidence.c | 0 .../core/{202409 => j2735_202409}/src/PositionConfidenceSet.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PositionalAccuracy.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Precipitation.c | 0 .../core/{202409 => j2735_202409}/src/PreemptPriorityList.c | 0 .../core/{202409 => j2735_202409}/src/PrimaryRegionChargingInfo.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PrimaryRegionState.c | 0 .../core/{202409 => j2735_202409}/src/PrioritizationResponse.c | 0 .../{202409 => j2735_202409}/src/PrioritizationResponseList.c | 0 .../{202409 => j2735_202409}/src/PrioritizationResponseStatus.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Priority.c | 0 .../core/{202409 => j2735_202409}/src/PriorityRequestType.c | 0 .../core/{202409 => j2735_202409}/src/PrivilegedEventFlags.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PrivilegedEvents.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ProbeDataConfig.c | 0 .../core/{202409 => j2735_202409}/src/ProbeDataConfigMessage.c | 0 .../core/{202409 => j2735_202409}/src/ProbeDataManagement.c | 0 .../core/{202409 => j2735_202409}/src/ProbeDataReportMessage.c | 0 .../{202409 => j2735_202409}/src/ProbeDataReport_MeanVariation.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ProbeSegmentNumber.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ProbeVehicleData.c | 0 .../core/{202409 => j2735_202409}/src/PropelledInformation.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Provider.c | 0 .../src/PublicSafetyAndRoadWorkerActivity.c | 0 .../src/PublicSafetyDirectingTrafficSubType.c | 0 .../src/PublicSafetyEventResponderWorkerType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/PurseBalance.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Qualifiers.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RELATIVE-OID.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RELATIVE-OID_jer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RELATIVE-OID_print.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RELATIVE-OID_rfill.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RELATIVE-OID_xer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RSMLanePosition.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RSMPolygon.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RTCM-Revision.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RTCMPackage.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RTCMcorrections.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RTCMheader.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RTCMmessage.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RTCMmessageList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Radius-B12.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Radius.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RadiusOfCurvature.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RainSensor.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ReasonCode.c | 0 .../core/{202409 => j2735_202409}/src/ReceiptAuthenticator.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ReceiptContract.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ReceiptData.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ReceiptDistance.c | 0 .../core/{202409 => j2735_202409}/src/ReceiptFinancialPart.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ReceiptIccId.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ReceiptObuId.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ReceiptServicePart.c | 0 .../{202409 => j2735_202409}/src/ReceiptServiceSerialNumber.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ReceiptText.c | 0 .../src/RecreationalObjectsAndActivities.c | 0 .../core/{202409 => j2735_202409}/src/ReducedSpeedZoneContainer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ReferencePointType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RegionId.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RegionInfo.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RegionList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RegionOffsets.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RegionPointSet.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RegionUncertainty.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RegionalExtension.c | 0 .../core/{202409 => j2735_202409}/src/RegulatoryAndWarningSigns.c | 0 .../core/{202409 => j2735_202409}/src/RegulatorySpeedLimit.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RelativePosition3d.c | 0 .../core/{202409 => j2735_202409}/src/RelativeRoadAuthorityID.c | 0 .../core/{202409 => j2735_202409}/src/ReportCharacteristics.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RequestID.c | 0 .../core/{202409 => j2735_202409}/src/RequestImportanceLevel.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RequestSubRole.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RequestedItem.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RequestedItemList.c | 0 .../core/{202409 => j2735_202409}/src/RequestorDescription.c | 0 .../core/{202409 => j2735_202409}/src/RequestorPositionVector.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RequestorType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ReservedBit.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ResponseFlag.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ResponseType.c | 0 .../core/{202409 => j2735_202409}/src/RestrictionAppliesTo.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RestrictionClass.c | 0 .../{202409 => j2735_202409}/src/RestrictionClassAssignment.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RestrictionClassID.c | 0 .../core/{202409 => j2735_202409}/src/RestrictionClassList.c | 0 .../{202409 => j2735_202409}/src/RestrictionUserType-addGrpC.c | 0 .../core/{202409 => j2735_202409}/src/RestrictionUserType.c | 0 .../core/{202409 => j2735_202409}/src/RestrictionUserTypeList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ResultFin.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ResultOp.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RoadAuthorityID.c | 0 .../core/{202409 => j2735_202409}/src/RoadGeometryAndAttributes.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RoadGrade.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RoadLaneSetList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RoadRegulatorID.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RoadRoughness.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RoadSafetyMessage.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RoadSegment.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RoadSegmentID.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RoadSegmentList.c | 0 .../core/{202409 => j2735_202409}/src/RoadSegmentReferenceID.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RoadSideAlert.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RoadSignID.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RoadSnapShot.c | 0 .../core/{202409 => j2735_202409}/src/RoadSurfaceCondition.c | 0 .../{202409 => j2735_202409}/src/RoadUserChargingConfigMessage.c | 0 .../{202409 => j2735_202409}/src/RoadUserChargingReportMessage.c | 0 .../core/{202409 => j2735_202409}/src/RoadWeatherDownload.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RoadWeatherMessage.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RoadWeatherUpload.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RoadsideAssets.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RoadwayCrownAngle.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Roadwork.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Rock.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RockType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Roll.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RollDetected.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RollRateConfidence.c | 0 .../{202409 => j2735_202409}/src/RptAveragedAndSummaryRecord.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RptAveragedRecord.c | 0 .../{202409 => j2735_202409}/src/RptAvgAndSummaryRecordData.c | 0 .../core/{202409 => j2735_202409}/src/RptCommSysPerfEvents.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RptDevType.c | 0 .../{202409 => j2735_202409}/src/RptDriverAlertsAndWarnings.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RptEmissions.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RptEvents.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RptHysteresis.c | 0 .../core/{202409 => j2735_202409}/src/RptHysteresisRecord.c | 0 .../core/{202409 => j2735_202409}/src/RptInstantaneousRecord.c | 0 .../{202409 => j2735_202409}/src/RptInstantaneousRecordData.c | 0 .../core/{202409 => j2735_202409}/src/RptInstantaneousRecords.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RptIntervalEvents.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RptKinematicEvents.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RptLocOfStops.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RptRoadRoughness.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RptRoadwayEvents.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RptSummaryRecord.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RptTrafficMetrics.c | 0 .../core/{202409 => j2735_202409}/src/RptTrafficSigEncounters.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RptTransitVehData.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RptVehicleClass.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RptVehicleEvents.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RptVehicleReport.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RptVelocity.c | 0 j2735codec/core/{202409 => j2735_202409}/src/RptWiperStatus.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SPAT.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SPAT_TimeMark.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SSPindex.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Sample.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Scale-B12.c | 0 .../core/{202409 => j2735_202409}/src/SchoolBusJ2945Slash1C.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Second.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SecondOfTime.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SecondsAngle.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Segment.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SegmentAttributeLL.c | 0 .../core/{202409 => j2735_202409}/src/SegmentAttributeLLList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SegmentAttributeXY.c | 0 .../core/{202409 => j2735_202409}/src/SegmentAttributeXYList.c | 0 .../core/{202409 => j2735_202409}/src/SemiMajorAxisAccuracy.c | 0 .../core/{202409 => j2735_202409}/src/SemiMajorAxisOrientation.c | 0 .../core/{202409 => j2735_202409}/src/SemiMinorAxisAccuracy.c | 0 .../core/{202409 => j2735_202409}/src/SensorDataSharingMessage.c | 0 .../src/SensorDataSharingMessage_ObjectDistance.c | 0 .../src/SensorDataSharingMessage_PitchRate.c | 0 .../src/SensorDataSharingMessage_PositionOffsetXYZ.c | 0 .../src/SensorDataSharingMessage_RollRate.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SeparationDistance.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SessionClass.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SessionLocation.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ShapePointSet.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ShortString.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SignPriority.c | 0 .../src/SignalControlAndPrioritizationRequest.c | 0 .../src/SignalControlAndPrioritizationStatus.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SignalControlZone.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SignalGroupID.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SignalHeadLocation.c | 0 .../core/{202409 => j2735_202409}/src/SignalHeadLocationList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SignalReqScheme.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SignalRequest.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SignalRequestList.c | 0 .../core/{202409 => j2735_202409}/src/SignalRequestMessage.c | 0 .../core/{202409 => j2735_202409}/src/SignalRequestPackage.c | 0 .../core/{202409 => j2735_202409}/src/SignalRequesterInfo.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SignalStatus.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SignalStatusList.c | 0 .../core/{202409 => j2735_202409}/src/SignalStatusMessage.c | 0 .../core/{202409 => j2735_202409}/src/SignalStatusPackage.c | 0 .../core/{202409 => j2735_202409}/src/SignalStatusPackageList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SignedValue.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SirenInUse.c | 0 .../core/{202409 => j2735_202409}/src/SituationalContainer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SizeValue.c | 0 .../core/{202409 => j2735_202409}/src/SizeValueConfidence.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SmallNumbers.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Snapshot.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SnapshotDistance.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SnapshotTime.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Snow.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SnowType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SoundLevel.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SpecialCharges.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SpecialEvents.c | 0 .../core/{202409 => j2735_202409}/src/SpecialVehicleExtensions.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Speed.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SpeedAdvice.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SpeedConfidence.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SpeedLimit.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SpeedLimitList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SpeedLimitType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SpeedProfile.c | 0 .../core/{202409 => j2735_202409}/src/SpeedProfileMeasurement.c | 0 .../{202409 => j2735_202409}/src/SpeedProfileMeasurementList.c | 0 .../src/SpeedandHeadingandThrottleConfidence.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SportingEvents.c | 0 .../core/{202409 => j2735_202409}/src/StabilityControlStatus.c | 0 .../core/{202409 => j2735_202409}/src/StatesAndTerritories.c | 0 j2735codec/core/{202409 => j2735_202409}/src/StationID.c | 0 j2735codec/core/{202409 => j2735_202409}/src/StationType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/StdDev.c | 0 .../core/{202409 => j2735_202409}/src/SteeringAxleLubePressure.c | 0 .../core/{202409 => j2735_202409}/src/SteeringAxleTemperature.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SteeringWheelAngle.c | 0 .../{202409 => j2735_202409}/src/SteeringWheelAngleConfidence.c | 0 .../{202409 => j2735_202409}/src/SteeringWheelAngleRateOfChange.c | 0 j2735codec/core/{202409 => j2735_202409}/src/StreetSuffixes.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Structures.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SubManeuver.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SubManeuverList.c | 0 .../core/{202409 => j2735_202409}/src/SubRegionChargingInfo.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SuggestionAdvice.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SummerTime.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SunSensor.c | 0 .../{202409 => j2735_202409}/src/SupplementalVehicleExtensions.c | 0 .../{202409 => j2735_202409}/src/SurfaceTempMeasurementStdDev.c | 0 .../core/{202409 => j2735_202409}/src/SurroundingVehicleInfo.c | 0 j2735codec/core/{202409 => j2735_202409}/src/SystemInformation.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TRRLength.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TRRLocation.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TRRLocationType1.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TRRLocationType2.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TRRLocationType3.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TRRType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TargetRoadResource.c | 0 .../core/{202409 => j2735_202409}/src/TariffClassDescription.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TariffClassId.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Temperature.c | 0 .../{202409 => j2735_202409}/src/TemperatureMeasurementStdDev.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TemporaryID.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TemporaryIDList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TemporaryIDPointer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TenthSecond.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TermDistance.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TermTime.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TestMessage00.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TestMessage01.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TestMessage02.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TestMessage03.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TestMessage04.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TestMessage05.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TestMessage06.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TestMessage07.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TestMessage08.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TestMessage09.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TestMessage10.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TestMessage11.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TestMessage12.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TestMessage13.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TestMessage14.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TestMessage15.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ThrottleConfidence.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ThrottlePosition.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TimeChangeDetails.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TimeChargesTable.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TimeClassId.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TimeCompact.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TimeConfidence.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TimeConstant.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TimeInSecond-B16.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TimeInSecond-B8.c | 0 .../core/{202409 => j2735_202409}/src/TimeIntervalConfidence.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TimeOffset.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TimePeriod.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TimeRemaining.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TimeUnit.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TireData.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TireDataList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TireLeakageRate.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TireLocation.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TirePressure.c | 0 .../{202409 => j2735_202409}/src/TirePressureThresholdDetection.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TireTemp.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Tolerance.c | 0 .../core/{202409 => j2735_202409}/src/TollAdvertisementInfo.c | 0 .../core/{202409 => j2735_202409}/src/TollAdvertisementMessage.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TollChargerInfo.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TollChargesTable.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TollPointID.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TollPointMap.c | 0 .../core/{202409 => j2735_202409}/src/TollServiceProviderData.c | 0 .../core/{202409 => j2735_202409}/src/TollUsageAckMessage.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TollUsageMessage.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TollUserData.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TollVehicleId.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Torque.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TotalMass.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TotalWeightCharges.c | 0 .../core/{202409 => j2735_202409}/src/TractionControlStatus.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TrafficConditions.c | 0 .../{202409 => j2735_202409}/src/TrafficLightControllerStatus.c | 0 .../core/{202409 => j2735_202409}/src/TrafficLightDirectionCode.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TrafficLightID.c | 0 .../core/{202409 => j2735_202409}/src/TrafficLightIntervalType.c | 0 .../{202409 => j2735_202409}/src/TrafficLightOperationStatus.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TrafficLightStatus.c | 0 .../core/{202409 => j2735_202409}/src/TrafficLightStatusList.c | 0 .../core/{202409 => j2735_202409}/src/TrafficLightStatusMessage.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TrafficLightType.c | 0 .../core/{202409 => j2735_202409}/src/TrafficLightingStatus.c | 0 .../{202409 => j2735_202409}/src/TrafficSignalPhaseAndTiming.c | 0 .../core/{202409 => j2735_202409}/src/TrailerCharacteristics.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TrailerData.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TrailerDetails.c | 0 .../core/{202409 => j2735_202409}/src/TrailerHistoryPoint.c | 0 .../core/{202409 => j2735_202409}/src/TrailerHistoryPointList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TrailerMass.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TrailerType.c | 0 .../{202409 => j2735_202409}/src/TrailerUnitDescJ2945Slash1B.c | 0 .../core/{202409 => j2735_202409}/src/TrailerUnitDescription.c | 0 .../{202409 => j2735_202409}/src/TrailerUnitDescriptionList.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TrailerWeight.c | 0 .../core/{202409 => j2735_202409}/src/TrailersJ2945Slash1B.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TransitMode.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TransitOperations.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TransitStatus.c | 0 .../core/{202409 => j2735_202409}/src/TransitVehicleOccupancy.c | 0 .../core/{202409 => j2735_202409}/src/TransitVehicleStatus.c | 0 .../core/{202409 => j2735_202409}/src/TransmissionAndSpeed.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TransmissionState.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TravelerDataFrame.c | 0 .../core/{202409 => j2735_202409}/src/TravelerDataFrameList.c | 0 .../src/TravelerDataFrameNewPartIIIContent.c | 0 .../core/{202409 => j2735_202409}/src/TravelerGroupAffected.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TravelerInfoType.c | 0 .../core/{202409 => j2735_202409}/src/TravelerInformation.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TripInfo.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TumAck.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TumAckHash.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TumData.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TumHash.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TumInstructions.c | 0 j2735codec/core/{202409 => j2735_202409}/src/TyreConfiguration.c | 0 j2735codec/core/{202409 => j2735_202409}/src/URL-Base.c | 0 j2735codec/core/{202409 => j2735_202409}/src/URL-Link.c | 0 j2735codec/core/{202409 => j2735_202409}/src/URL-Short.c | 0 j2735codec/core/{202409 => j2735_202409}/src/UniqueMSGID.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Units.c | 0 j2735codec/core/{202409 => j2735_202409}/src/UnusualDriving.c | 0 j2735codec/core/{202409 => j2735_202409}/src/UsageReport.c | 0 j2735codec/core/{202409 => j2735_202409}/src/UserClassId.c | 0 j2735codec/core/{202409 => j2735_202409}/src/UserData.c | 0 j2735codec/core/{202409 => j2735_202409}/src/UserFeeInfo.c | 0 j2735codec/core/{202409 => j2735_202409}/src/UserId.c | 0 .../core/{202409 => j2735_202409}/src/UserSizeAndBehaviour.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VINstring.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ValidManeuvers.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ValidRegion.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ValidityOfContract.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VariationStdDev.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VehTypeCharges.c | 0 .../core/{202409 => j2735_202409}/src/VehTypeChargesTable.c | 0 .../core/{202409 => j2735_202409}/src/VehicleAuthenticator.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VehicleAxles.c | 0 .../core/{202409 => j2735_202409}/src/VehicleAxlesAndWeightInfo.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VehicleAxlesNumber.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VehicleClass.c | 0 .../core/{202409 => j2735_202409}/src/VehicleClassification.c | 0 .../{202409 => j2735_202409}/src/VehicleCurrentMaxTrainWeight.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VehicleData.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VehicleDescription.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VehicleDimensions.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VehicleEventFlags.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VehicleHeight.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VehicleID.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VehicleIdent.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VehicleLength.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VehicleMass.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VehicleReport.c | 0 .../core/{202409 => j2735_202409}/src/VehicleSafetyExtensions.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VehicleSize.c | 0 .../core/{202409 => j2735_202409}/src/VehicleSizeConfidence.c | 0 .../{202409 => j2735_202409}/src/VehicleSpecificCharacteristics.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VehicleStatus.c | 0 .../{202409 => j2735_202409}/src/VehicleStatusDeviceTypeTag.c | 0 .../core/{202409 => j2735_202409}/src/VehicleStatusRequest.c | 0 .../core/{202409 => j2735_202409}/src/VehicleStatusRequestList.c | 0 .../core/{202409 => j2735_202409}/src/VehicleToLanePosition.c | 0 .../core/{202409 => j2735_202409}/src/VehicleToLanePositionList.c | 0 .../core/{202409 => j2735_202409}/src/VehicleTotalDistance.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VehicleType.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VehicleTypes.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VehicleWeightLaden.c | 0 .../core/{202409 => j2735_202409}/src/VehicleWeightLimits.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VehicleWidth.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Velocity.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VertOffset-B07.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VertOffset-B08.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VertOffset-B09.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VertOffset-B10.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VertOffset-B11.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VertOffset-B12.c | 0 .../core/{202409 => j2735_202409}/src/VerticalAcceleration.c | 0 .../{202409 => j2735_202409}/src/VerticalAccelerationThreshold.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VerticalOffset.c | 0 .../core/{202409 => j2735_202409}/src/VisibilityAndAirQuality.c | 0 j2735codec/core/{202409 => j2735_202409}/src/VisualLink.c | 0 j2735codec/core/{202409 => j2735_202409}/src/WDMSFleetData.c | 0 j2735codec/core/{202409 => j2735_202409}/src/WaitOnStopline.c | 0 j2735codec/core/{202409 => j2735_202409}/src/WarningAdvice.c | 0 j2735codec/core/{202409 => j2735_202409}/src/WeatherConditions.c | 0 j2735codec/core/{202409 => j2735_202409}/src/WeatherProbe.c | 0 j2735codec/core/{202409 => j2735_202409}/src/WeatherReport.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Weekday.c | 0 j2735codec/core/{202409 => j2735_202409}/src/WeightCharges.c | 0 j2735codec/core/{202409 => j2735_202409}/src/WeightChargesTable.c | 0 j2735codec/core/{202409 => j2735_202409}/src/WheelEndElectFault.c | 0 j2735codec/core/{202409 => j2735_202409}/src/WheelSensorStatus.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Winds.c | 0 j2735codec/core/{202409 => j2735_202409}/src/WinterDrivingIndex.c | 0 .../core/{202409 => j2735_202409}/src/WinterDrivingRestrictions.c | 0 j2735codec/core/{202409 => j2735_202409}/src/WiperRate.c | 0 j2735codec/core/{202409 => j2735_202409}/src/WiperSet.c | 0 j2735codec/core/{202409 => j2735_202409}/src/WiperStatus.c | 0 j2735codec/core/{202409 => j2735_202409}/src/WorkZone.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Yaw.c | 0 j2735codec/core/{202409 => j2735_202409}/src/YawDetected.c | 0 j2735codec/core/{202409 => j2735_202409}/src/YawRate.c | 0 j2735codec/core/{202409 => j2735_202409}/src/YawRateConfidence.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Year.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ZoneLength.c | 0 j2735codec/core/{202409 => j2735_202409}/src/Zoom.c | 0 j2735codec/core/{202409 => j2735_202409}/src/aper_decoder.c | 0 j2735codec/core/{202409 => j2735_202409}/src/aper_encoder.c | 0 j2735codec/core/{202409 => j2735_202409}/src/aper_opentype.c | 0 j2735codec/core/{202409 => j2735_202409}/src/aper_support.c | 0 j2735codec/core/{202409 => j2735_202409}/src/asn_SEQUENCE_OF.c | 0 j2735codec/core/{202409 => j2735_202409}/src/asn_SET_OF.c | 0 j2735codec/core/{202409 => j2735_202409}/src/asn_application.c | 0 j2735codec/core/{202409 => j2735_202409}/src/asn_bit_data.c | 0 j2735codec/core/{202409 => j2735_202409}/src/asn_codecs_prim.c | 0 .../core/{202409 => j2735_202409}/src/asn_codecs_prim_ber.c | 0 .../core/{202409 => j2735_202409}/src/asn_codecs_prim_jer.c | 0 .../core/{202409 => j2735_202409}/src/asn_codecs_prim_xer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/asn_internal.c | 0 j2735codec/core/{202409 => j2735_202409}/src/asn_random_fill.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ber_decoder.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ber_tlv_length.c | 0 j2735codec/core/{202409 => j2735_202409}/src/ber_tlv_tag.c | 0 j2735codec/core/{202409 => j2735_202409}/src/constr_CHOICE.c | 0 j2735codec/core/{202409 => j2735_202409}/src/constr_CHOICE_aper.c | 0 j2735codec/core/{202409 => j2735_202409}/src/constr_CHOICE_ber.c | 0 j2735codec/core/{202409 => j2735_202409}/src/constr_CHOICE_jer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/constr_CHOICE_oer.c | 0 .../core/{202409 => j2735_202409}/src/constr_CHOICE_print.c | 0 .../core/{202409 => j2735_202409}/src/constr_CHOICE_rfill.c | 0 j2735codec/core/{202409 => j2735_202409}/src/constr_CHOICE_uper.c | 0 j2735codec/core/{202409 => j2735_202409}/src/constr_CHOICE_xer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/constr_SEQUENCE.c | 0 j2735codec/core/{202409 => j2735_202409}/src/constr_SEQUENCE_OF.c | 0 .../core/{202409 => j2735_202409}/src/constr_SEQUENCE_OF_aper.c | 0 .../core/{202409 => j2735_202409}/src/constr_SEQUENCE_OF_ber.c | 0 .../core/{202409 => j2735_202409}/src/constr_SEQUENCE_OF_jer.c | 0 .../core/{202409 => j2735_202409}/src/constr_SEQUENCE_OF_uper.c | 0 .../core/{202409 => j2735_202409}/src/constr_SEQUENCE_OF_xer.c | 0 .../core/{202409 => j2735_202409}/src/constr_SEQUENCE_aper.c | 0 .../core/{202409 => j2735_202409}/src/constr_SEQUENCE_ber.c | 0 .../core/{202409 => j2735_202409}/src/constr_SEQUENCE_jer.c | 0 .../core/{202409 => j2735_202409}/src/constr_SEQUENCE_oer.c | 0 .../core/{202409 => j2735_202409}/src/constr_SEQUENCE_print.c | 0 .../core/{202409 => j2735_202409}/src/constr_SEQUENCE_rfill.c | 0 .../core/{202409 => j2735_202409}/src/constr_SEQUENCE_uper.c | 0 .../core/{202409 => j2735_202409}/src/constr_SEQUENCE_xer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/constr_SET_OF.c | 0 j2735codec/core/{202409 => j2735_202409}/src/constr_SET_OF_aper.c | 0 j2735codec/core/{202409 => j2735_202409}/src/constr_SET_OF_ber.c | 0 j2735codec/core/{202409 => j2735_202409}/src/constr_SET_OF_jer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/constr_SET_OF_oer.c | 0 .../core/{202409 => j2735_202409}/src/constr_SET_OF_print.c | 0 .../core/{202409 => j2735_202409}/src/constr_SET_OF_rfill.c | 0 j2735codec/core/{202409 => j2735_202409}/src/constr_SET_OF_uper.c | 0 j2735codec/core/{202409 => j2735_202409}/src/constr_SET_OF_xer.c | 0 j2735codec/core/{202409 => j2735_202409}/src/constr_TYPE.c | 0 j2735codec/core/{202409 => j2735_202409}/src/constraints.c | 0 j2735codec/core/{202409 => j2735_202409}/src/der_encoder.c | 0 j2735codec/core/{202409 => j2735_202409}/src/jer_decoder.c | 0 j2735codec/core/{202409 => j2735_202409}/src/jer_encoder.c | 0 j2735codec/core/{202409 => j2735_202409}/src/jer_support.c | 0 j2735codec/core/{202409 => j2735_202409}/src/oer_decoder.c | 0 j2735codec/core/{202409 => j2735_202409}/src/oer_encoder.c | 0 j2735codec/core/{202409 => j2735_202409}/src/oer_support.c | 0 j2735codec/core/{202409 => j2735_202409}/src/pdu_collection.c | 0 j2735codec/core/{202409 => j2735_202409}/src/per_decoder.c | 0 j2735codec/core/{202409 => j2735_202409}/src/per_encoder.c | 0 j2735codec/core/{202409 => j2735_202409}/src/per_opentype.c | 0 j2735codec/core/{202409 => j2735_202409}/src/per_support.c | 0 j2735codec/core/{202409 => j2735_202409}/src/uper_decoder.c | 0 j2735codec/core/{202409 => j2735_202409}/src/uper_encoder.c | 0 j2735codec/core/{202409 => j2735_202409}/src/uper_opentype.c | 0 j2735codec/core/{202409 => j2735_202409}/src/uper_support.c | 0 j2735codec/core/{202409 => j2735_202409}/src/xer_decoder.c | 0 j2735codec/core/{202409 => j2735_202409}/src/xer_encoder.c | 0 j2735codec/core/{202409 => j2735_202409}/src/xer_support.c | 0 2240 files changed, 0 insertions(+), 0 deletions(-) rename j2735codec/core/{202409 => j2735_202409}/include/ANY.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AbsolutePosition2d.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AbsolutePosition3d.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AccelSteerYawRateConfidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AccelTimeConstant.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Acceleration.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AccelerationConfidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AccelerationSet4Way.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AcceleratorPedalPosition.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AccidentsAndIncidents.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AccountStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AckPolicy.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Activity.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ActualNumberOfPassengers.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ActuatedInterval.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AddGrpB_Angle.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AddGrpB_Elevation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AddGrpB_MsgCount.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AddGrpB_TimeMark.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AddGrpC_Altitude.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AdviceInstructionsMandatory.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AdviceInstructionsRecommendations.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AdvisorySpeed.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AdvisorySpeedList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AdvisorySpeedType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AggregatedSingleTariffClassSession.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AllowedManeuvers.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AlternateRoute.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AltitudeConfidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AltitudeValue.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AmbientAirPressure.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AmbientAirTemperature.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AngularVelocity.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AngularVelocityConfidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AnimalPropelledType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AnimalType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AntennaOffsetSet.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AntiLockBrakeStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ApplicableHeading.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ApproachID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ApproachOrLane.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Area.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AreaOrSegmentChargingInfo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AreaType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AsphaltOrTar.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AsphaltOrTarType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AssetStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AtmosPressureMeasurementStdDev.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Attachment.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AttachmentRadius.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Attitude.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AttitudeConfidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AudioLink.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AuxiliaryBrakeStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AxesMovement.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AxleLocation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AxleWeight.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AxleWeightLimit.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AxleWeightLimits.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AxleWeightList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AxleWeightSet.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Axles.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AxlesCharges.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AxlesChargesTable.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/AxlesWeightLimits.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/BIT_STRING.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/BOOLEAN.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/BSMcoreData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/BankAngle.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/BasicSafetyMessage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/BasicSafetyMessage_PartII-Id.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/BasicVehicleClass.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/BasicVehicleRole.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/BrakeAppliedPressure.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/BrakeAppliedStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/BrakeBoostApplied.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/BrakePedalPosition.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/BrakeSystemStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/BroadRegion.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/BroadRegionArea.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/BumperHeight.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/BumperHeights.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CCMFaultMode.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CCMPartIIcontent.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CO2EmissionValue.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CargoWeight.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgAveragedAndSummaryTriggers.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgAveragedTriggers.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgCommSysPerfEvents.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgEmerAndTransitInfo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgEventRecurrence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgEvents.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgHysteresis.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgInstantaneousEventTriggers.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgInterval.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgIntervalEvents.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgKinematicEvents.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgLowSpeedCriteria.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgMsgDictionary.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgMsgRecepIndicators.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgRoadSignInfo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgRoadSignTypes.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgRoadwayEvents.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgStoppedCriteria.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgSummaryTriggers.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgTrafficSigEncounters.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgTransitVehicleData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgVehicleClass.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CfgVehicleEvents.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ChargeObjectId.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ChargerInfo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ChargesTable.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ChargingAreaOrSegment.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ChargingConfig.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ChargingFees.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ChargingUnits.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Cinders.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CindersType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Circle.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ClassificationConfidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ClosedNetworkChargesTable.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Closures.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CoarseHeading.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CodeWord.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CoefficientOfFriction.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CommonContainer.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CommonSafetyRequest.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Common_Angle.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Common_Duration.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Common_Elevation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Common_Latitude.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Common_Longitude.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Common_MeanVariation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Common_MsgCount.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ComputedLane.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Confidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ConfidenceSet.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ConfigBoundary.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ConfigDescriptor.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ConfigId.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ConfigInfo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ConfigTemporalBoundary.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ConfigTriggers.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ConnectingLane.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Connection.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ConnectionManeuverAssist-addGrpC.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ConnectionManeuverAssist.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ConnectsToList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ConsecutiveTrafficLight.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ContentContainer.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ContractAuthenticator.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ContractSerialNumber.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ContractValidity.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CooperativeControlMessage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CooperativeControlMessage_ManeuverID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CooperativeControlMessage_PartII-Id.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CooperativeControlMessage_PitchRate.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CooperativeControlMessage_RollRate.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CopValue.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Count.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CountryCode.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CrossLinking.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CurrentStateData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/CurveContainer.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DDate.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DDateTime.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DDay.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DFullTime.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DHour.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DMinute.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DMonth.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DMonthDay.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DOffset.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DSRCmsgID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DSecond.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DTime.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DYear.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DYearMonth.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DataParameters.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DataSourceInfo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DateAndTime.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DateCompact.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Day.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DayOfWeek.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DegreesLat.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DegreesLong.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DelayStatusCancellation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DeltaAngle.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DeltaTime.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DescriptionOfRoadSurface.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DescriptiveCharacteristics.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DescriptiveName.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DetectedChargeObject.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DetectedObjectCommonData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DetectedObjectData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DetectedObjectList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DetectedObjectOptionalData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DetectedObstacleData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DetectedVRUData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DetectedVehicleData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DetectionMode.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DeviceStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DewPointTempMeasurementStdDev.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DieselEmissionValues.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DirectionOfUse.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DisabledVehicle.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Disasters.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Distance.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DistanceUnit.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DistanceUnits.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Disturbances.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DriveAxleLiftAirPressure.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DriveAxleLocation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DriveAxleLubePressure.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DriveAxleTemperature.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Driven.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DrivenLineOffsetLg.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DrivenLineOffsetSm.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DriverCharacteristics.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DrivingWheelAngle.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/DynamicInfoContainer.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ENUMERATED.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EXTERNAL.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EfcContextMark.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EfcDataDictionary_Altitude.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EfcDataDictionary_Duration.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EfcDataDictionary_Latitude.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EfcDataDictionary_Longitude.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EfcTime.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ElevOffset.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ElevationConfidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EmergencyDetails.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EmergencyVehicleAlert.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EmissionType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EmissionUnit.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EnabledLaneList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EncryptedTumData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EngineCharacteristics.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EngineDetails.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EntryChargesTable.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EnvironmentalCharacteristics.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EquipmentIccId.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EquipmentObuId.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EquipmentStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EquipmentType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EssMobileFriction.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EssPrecipRate.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EssPrecipSituation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EssPrecipYesNo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EssSolarRadiation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EuroValue.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EventDescription.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EventIdentifier.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EventInfo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/EventRecurrence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ExhaustEmissionValues.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ExitChargesTable.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ExitInfo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ExitService.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Extent.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ExteriorLights.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/FeeReport.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/FrictionInformation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/FrontCutIn.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/FuelType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/FullPositionVector.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/FullRoadAuthorityID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/FurtherInfoID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/FutureCharacteristics.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/GNSSstatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/GeneralizedTime.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/GenericLane.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/GenericSignage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/GeographicalPath.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/GeometricProjection.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/GraphicString.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Grass.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/GrassType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Gravel.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/GravelType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/GrossDistance.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/GrossSpeed.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Header.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Heading.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/HeadingConfidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/HeadingDeg.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/HeadingSlice.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/HeavyTruckCCMExtensions.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Holiday.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Hour.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/HumanPropelledType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/IA5String.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/INTEGER.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ITISEventType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ITIS_GenericLocations.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ITIS_ITIScodes.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ITIS_ITIScodesAndText.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ITIS_ITIStext.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ITIS_IncidentResponseEquipment.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ITIS_ResponderGroupAffected.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ITIS_VehicleGroupAffected.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ITISgroups.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ITIStextPhrase.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Ice.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/IceType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/IncidentResponseStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/IncidentsContainer.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Int1Signed.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Int1Unsigned.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Int2Signed.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Int2Unsigned.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Int3Unsigned.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Int4Signed.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Int4Unsigned.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Int8Signed.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Int8Unsigned.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/IntersectionAccessPoint.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/IntersectionCollision.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/IntersectionGeometry.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/IntersectionGeometryList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/IntersectionID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/IntersectionReferenceID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/IntersectionState-addGrpC.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/IntersectionState.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/IntersectionStateList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/IntersectionStatusObject.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/IsDolly.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Iso3833VehicleType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/IssuerIdentifier.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ItemizedChargerData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ItemizedPaymentReport.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/J1939data.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/J2540ITIS_GenericLocations.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/J2540ITIS_ITIScodes.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/J2540ITIS_ITIScodesAndText.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/J2540ITIS_ITIStext.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/J2540ITIS_IncidentResponseEquipment.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/J2540ITIS_ResponderGroupAffected.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/J2540ITIS_VehicleGroupAffected.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneAttributes-Barrier.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneAttributes-Bike.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneAttributes-Crosswalk.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneAttributes-Parking.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneAttributes-Sidewalk.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneAttributes-Striping.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneAttributes-TrackedVehicle.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneAttributes-Vehicle.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneAttributes.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneChargesTable.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneClosed.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneClosureContainer.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneConnectionID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneDataAttribute-addGrpB.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneDataAttribute.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneDataAttributeList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneDirection.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneInfo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneOffset.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneRoadway.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneSharing.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneTypeAttributes.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LaneWidth.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LargeNumbers.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LastTollPointInfo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LastTollPointInfos.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LatOffset.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LatitudeDMS.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LatitudeDMS2.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LayerID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LayerType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LightVehicleCCMExtensions.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LightbarInUse.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LocAndTimeStamp.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LocAndTimeStamps.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LocalVehicleClassId.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Location-quality.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Location-tech.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LocationClassId.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LongOffset.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LongitudeDMS.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LongitudeDMS2.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/LongitudinalControlState.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Lpn.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MSCMType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MUTCDCode.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MUTCDLocations.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Maneuver.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ManeuverAssistList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ManeuverExecutionStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ManeuverSharingAndCoordinatingMessage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ManeuverSharingAndCoordinatingMessage_ManeuverID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ManeuverSharingAndCoordinatingMessage_ObjectDistance.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ManeuverSharingAndCoordinatingMessage_PositionOffsetXYZ.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MapData-addGrpC.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MapData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MaxAvailableAcceleration.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MaxAvailableDeceleration.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MaxTimetoChange.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MeasurementTimeOffset.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MergeDivergeNodeAngle.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MessageBLOB.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MessageFrame.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MinTimetoChange.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Minute.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MinuteOfTheYear.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MinutesAngle.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MinutesDuration.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MobileSituation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Month.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MotorizedPropelledType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MovementEvent-addGrpB.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MovementEvent.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MovementEventList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MovementList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MovementPhaseState.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MovementState.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MsgCRC.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/MultiVehicleResponse.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NMEA-MsgType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NMEA-Payload.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NMEA-Revision.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NMEAcorrections.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPEssAirTemperature.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPEssCloudSituationV4.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPEssDewpointTemp.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPEssPaveTreatProductForm.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPEssPaveTreatProductType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPEssPaveTreatmentAmount.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPEssPaveTreatmentWidth.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPEssPavementTreatmentLatitude.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPEssPavementTreatmentLocation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPEssPavementTreatmentLongitude.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPEssPercentProductMix.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPEssPressureSensorAtmosphericPressure.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPEssSurfaceIceOrWaterDepth.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPEssSurfaceTemperature.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPEssTemperatureSensorHeight.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPEssTotalRadiationPeriod.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPEssTotalRadiationV4.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPEssVisibility.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPEssVisibilitySituation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPHumiditySensorRelativeHumidity.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPPavementSensorSurfaceCondition.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPPrecipitationSensorPrecipSituation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPWindSensorAvgDirection.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPWindSensorAvgSpeed.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPWindSensorGustDirection.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPWindSensorGustSpeed.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPWindSensorSpotDirection.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NTCIPWindSensorSpotSpeed.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NULL.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NamedObjects.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NativeEnumerated.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NativeInteger.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Node-LL-24B.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Node-LL-28B.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Node-LL-32B.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Node-LL-36B.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Node-LL-44B.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Node-LL-48B.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Node-LLdms-48b.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Node-LLdms-80b.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Node-LLmD-64b.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Node-XY-20b.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Node-XY-22b.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Node-XY-24b.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Node-XY-26b.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Node-XY-28b.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Node-XY-32b.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NodeAttributeLL.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NodeAttributeLLList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NodeAttributeSetLL.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NodeAttributeSetXY.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NodeAttributeXY.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NodeAttributeXYList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NodeLL.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NodeListLL.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NodeListXY.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NodeOffsetPointLL.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NodeOffsetPointXY-addGrpB.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NodeOffsetPointXY.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NodePointLLE.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NodeSetLL.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NodeSetXY.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NodeXY.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NtcipAirTemperature.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NtcipAtmosphericPressure.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NtcipCloudSituation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NtcipDewPoint.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NtcipEssData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NtcipPavement.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NtcipPavementTreatment.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NtcipPrecipitation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NtcipRelativeHumidity.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NtcipSolarRadiation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NtcipVisibility.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NtcipVisibilitySituation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NtcipWind.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NumberOfAxles.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/NumberOfParticipantsInCluster.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/OBJECT_IDENTIFIER.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/OCTET_STRING.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/OPEN_TYPE.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ObeId.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ObjectCount.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ObjectDescriptor.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ObjectID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ObjectType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Objects.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ObstacleDetection.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ObstacleDirection.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ObstacleDistance.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ObstacleSize.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ObstacleSizeConfidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Obstruction.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Obstructions.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Offset-B09.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Offset-B10.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Offset-B11.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Offset-B12.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Offset-B13.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Offset-B14.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Offset-B16.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Offset3D.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/OffsetLL-B12.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/OffsetLL-B14.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/OffsetLL-B16.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/OffsetLL-B18.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/OffsetLL-B22.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/OffsetLL-B24.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/OffsetSystem.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/OperatorDefined.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/OverlayLaneList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Parked.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ParkingInformation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PartIIcontent.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Particulate.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PassengerCapacity.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Path.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PathHistory.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PathHistoryPoint.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PathHistoryPointList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PathList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PathPoints.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PathPrediction.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PavementConditions.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PayUnit.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PayloadData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PaymentFee.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PaymentMeans.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PaymentMeansBalance.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PaymentSecurityData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PedestrianBicycleDetect.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PedestrianCall.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PerAxleWeightCharges.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Period.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PermissiveNonProtected.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PersonalAccountNumber.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PersonalAssistive.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PersonalClusterRadius.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PersonalCrossingInProgress.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PersonalCrossingRequest.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PersonalDeviceUsageState.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PersonalDeviceUserType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PersonalSafetyMessage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PersonalSafetyMessage2.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Pitch.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PitchDetected.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PitchRateConfidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PivotPointDescription.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PivotingAllowed.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Point.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PortlandCement.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PortlandCementType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Position3D-addGrpB.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Position3D-addGrpC.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Position3D.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PositionConfidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PositionConfidenceSet.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PositionalAccuracy.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Precipitation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PreemptPriorityList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PrimaryRegionChargingInfo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PrimaryRegionState.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PrioritizationResponse.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PrioritizationResponseList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PrioritizationResponseStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Priority.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PriorityRequestType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PrivilegedEventFlags.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PrivilegedEvents.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ProbeDataConfig.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ProbeDataConfigMessage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ProbeDataManagement.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ProbeDataReportMessage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ProbeDataReport_MeanVariation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ProbeSegmentNumber.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ProbeVehicleData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PropelledInformation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Provider.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PublicSafetyAndRoadWorkerActivity.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PublicSafetyDirectingTrafficSubType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PublicSafetyEventResponderWorkerType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/PurseBalance.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Qualifiers.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RELATIVE-OID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RSMLanePosition.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RSMPolygon.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RTCM-Revision.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RTCMPackage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RTCMcorrections.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RTCMheader.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RTCMmessage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RTCMmessageList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Radius-B12.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Radius.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RadiusOfCurvature.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RainSensor.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ReasonCode.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ReceiptAuthenticator.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ReceiptContract.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ReceiptData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ReceiptDistance.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ReceiptFinancialPart.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ReceiptIccId.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ReceiptObuId.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ReceiptServicePart.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ReceiptServiceSerialNumber.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ReceiptText.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RecreationalObjectsAndActivities.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ReducedSpeedZoneContainer.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ReferencePointType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RegionId.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RegionInfo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RegionList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RegionOffsets.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RegionPointSet.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RegionUncertainty.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RegionalExtension.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RegulatoryAndWarningSigns.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RegulatorySpeedLimit.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RelativePosition3d.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RelativeRoadAuthorityID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ReportCharacteristics.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RequestID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RequestImportanceLevel.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RequestSubRole.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RequestedItem.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RequestedItemList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RequestorDescription.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RequestorPositionVector.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RequestorType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ReservedBit.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ResponseFlag.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ResponseType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RestrictionAppliesTo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RestrictionClass.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RestrictionClassAssignment.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RestrictionClassID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RestrictionClassList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RestrictionUserType-addGrpC.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RestrictionUserType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RestrictionUserTypeList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ResultFin.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ResultOp.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadAuthorityID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadGeometryAndAttributes.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadGrade.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadLaneSetList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadRegulatorID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadRoughness.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadSafetyMessage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadSegment.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadSegmentID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadSegmentList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadSegmentReferenceID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadSideAlert.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadSignID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadSnapShot.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadSurfaceCondition.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadUserChargingConfigMessage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadUserChargingReportMessage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadWeatherDownload.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadWeatherMessage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadWeatherUpload.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadsideAssets.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RoadwayCrownAngle.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Roadwork.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Rock.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RockType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Roll.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RollDetected.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RollRateConfidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptAveragedAndSummaryRecord.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptAveragedRecord.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptAvgAndSummaryRecordData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptCommSysPerfEvents.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptDevType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptDriverAlertsAndWarnings.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptEmissions.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptEvents.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptHysteresis.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptHysteresisRecord.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptInstantaneousRecord.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptInstantaneousRecordData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptInstantaneousRecords.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptIntervalEvents.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptKinematicEvents.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptLocOfStops.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptRoadRoughness.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptRoadwayEvents.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptSummaryRecord.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptTrafficMetrics.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptTrafficSigEncounters.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptTransitVehData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptVehicleClass.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptVehicleEvents.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptVehicleReport.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptVelocity.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/RptWiperStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SPAT.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SPAT_TimeMark.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SSPindex.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Sample.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Scale-B12.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SchoolBusJ2945Slash1C.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Second.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SecondOfTime.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SecondsAngle.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Segment.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SegmentAttributeLL.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SegmentAttributeLLList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SegmentAttributeXY.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SegmentAttributeXYList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SemiMajorAxisAccuracy.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SemiMajorAxisOrientation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SemiMinorAxisAccuracy.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SensorDataSharingMessage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SensorDataSharingMessage_ObjectDistance.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SensorDataSharingMessage_PitchRate.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SensorDataSharingMessage_PositionOffsetXYZ.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SensorDataSharingMessage_RollRate.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SeparationDistance.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SessionClass.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SessionLocation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ShapePointSet.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ShortString.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SignPriority.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SignalControlAndPrioritizationRequest.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SignalControlAndPrioritizationStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SignalControlZone.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SignalGroupID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SignalHeadLocation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SignalHeadLocationList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SignalReqScheme.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SignalRequest.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SignalRequestList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SignalRequestMessage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SignalRequestPackage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SignalRequesterInfo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SignalStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SignalStatusList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SignalStatusMessage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SignalStatusPackage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SignalStatusPackageList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SignedValue.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SirenInUse.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SituationalContainer.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SizeValue.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SizeValueConfidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SmallNumbers.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Snapshot.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SnapshotDistance.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SnapshotTime.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Snow.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SnowType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SoundLevel.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SpecialCharges.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SpecialEvents.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SpecialVehicleExtensions.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Speed.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SpeedAdvice.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SpeedConfidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SpeedLimit.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SpeedLimitList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SpeedLimitType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SpeedProfile.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SpeedProfileMeasurement.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SpeedProfileMeasurementList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SpeedandHeadingandThrottleConfidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SportingEvents.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/StabilityControlStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/StatesAndTerritories.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/StationID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/StationType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/StdDev.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SteeringAxleLubePressure.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SteeringAxleTemperature.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SteeringWheelAngle.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SteeringWheelAngleConfidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SteeringWheelAngleRateOfChange.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/StreetSuffixes.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Structures.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SubManeuver.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SubManeuverList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SubRegionChargingInfo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SuggestionAdvice.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SummerTime.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SunSensor.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SupplementalVehicleExtensions.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SurfaceTempMeasurementStdDev.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SurroundingVehicleInfo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/SystemInformation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TRRLength.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TRRLocation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TRRLocationType1.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TRRLocationType2.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TRRLocationType3.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TRRType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TargetRoadResource.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TariffClassDescription.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TariffClassId.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Temperature.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TemperatureMeasurementStdDev.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TemporaryID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TemporaryIDList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TemporaryIDPointer.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TenthSecond.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TermDistance.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TermTime.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TestMessage00.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TestMessage01.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TestMessage02.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TestMessage03.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TestMessage04.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TestMessage05.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TestMessage06.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TestMessage07.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TestMessage08.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TestMessage09.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TestMessage10.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TestMessage11.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TestMessage12.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TestMessage13.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TestMessage14.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TestMessage15.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ThrottleConfidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ThrottlePosition.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TimeChangeDetails.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TimeChargesTable.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TimeClassId.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TimeCompact.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TimeConfidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TimeConstant.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TimeInSecond-B16.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TimeInSecond-B8.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TimeIntervalConfidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TimeOffset.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TimePeriod.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TimeRemaining.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TimeUnit.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TireData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TireDataList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TireLeakageRate.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TireLocation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TirePressure.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TirePressureThresholdDetection.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TireTemp.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Tolerance.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TollAdvertisementInfo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TollAdvertisementMessage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TollChargerInfo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TollChargesTable.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TollPointID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TollPointMap.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TollServiceProviderData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TollUsageAckMessage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TollUsageMessage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TollUserData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TollVehicleId.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Torque.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TotalMass.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TotalWeightCharges.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TractionControlStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrafficConditions.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrafficLightControllerStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrafficLightDirectionCode.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrafficLightID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrafficLightIntervalType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrafficLightOperationStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrafficLightStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrafficLightStatusList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrafficLightStatusMessage.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrafficLightType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrafficLightingStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrafficSignalPhaseAndTiming.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrailerCharacteristics.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrailerData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrailerDetails.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrailerHistoryPoint.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrailerHistoryPointList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrailerMass.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrailerType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrailerUnitDescJ2945Slash1B.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrailerUnitDescription.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrailerUnitDescriptionList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrailerWeight.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TrailersJ2945Slash1B.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TransitMode.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TransitOperations.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TransitStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TransitVehicleOccupancy.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TransitVehicleStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TransmissionAndSpeed.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TransmissionState.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TravelerDataFrame.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TravelerDataFrameList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TravelerDataFrameNewPartIIIContent.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TravelerGroupAffected.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TravelerInfoType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TravelerInformation.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TripInfo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TumAck.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TumAckHash.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TumData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TumHash.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TumInstructions.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/TyreConfiguration.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/URL-Base.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/URL-Link.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/URL-Short.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/UniqueMSGID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Units.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/UnusualDriving.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/UsageReport.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/UserClassId.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/UserData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/UserFeeInfo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/UserId.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/UserSizeAndBehaviour.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VINstring.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ValidManeuvers.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ValidRegion.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ValidityOfContract.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VariationStdDev.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehTypeCharges.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehTypeChargesTable.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleAuthenticator.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleAxles.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleAxlesAndWeightInfo.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleAxlesNumber.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleClass.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleClassification.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleCurrentMaxTrainWeight.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleDescription.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleDimensions.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleEventFlags.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleHeight.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleID.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleIdent.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleLength.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleMass.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleReport.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleSafetyExtensions.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleSize.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleSizeConfidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleSpecificCharacteristics.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleStatusDeviceTypeTag.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleStatusRequest.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleStatusRequestList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleToLanePosition.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleToLanePositionList.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleTotalDistance.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleType.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleTypes.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleWeightLaden.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleWeightLimits.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VehicleWidth.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Velocity.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VertOffset-B07.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VertOffset-B08.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VertOffset-B09.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VertOffset-B10.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VertOffset-B11.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VertOffset-B12.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VerticalAcceleration.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VerticalAccelerationThreshold.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VerticalOffset.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VisibilityAndAirQuality.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/VisualLink.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/WDMSFleetData.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/WaitOnStopline.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/WarningAdvice.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/WeatherConditions.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/WeatherProbe.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/WeatherReport.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Weekday.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/WeightCharges.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/WeightChargesTable.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/WheelEndElectFault.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/WheelSensorStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Winds.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/WinterDrivingIndex.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/WinterDrivingRestrictions.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/WiperRate.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/WiperSet.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/WiperStatus.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/WorkZone.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Yaw.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/YawDetected.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/YawRate.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/YawRateConfidence.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Year.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ZoneLength.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/Zoom.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/aper_decoder.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/aper_encoder.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/aper_opentype.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/aper_support.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/asn_SEQUENCE_OF.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/asn_SET_OF.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/asn_application.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/asn_bit_data.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/asn_codecs.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/asn_codecs_prim.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/asn_config.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/asn_constant.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/asn_internal.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/asn_ioc.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/asn_random_fill.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/asn_system.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ber_decoder.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ber_tlv_length.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/ber_tlv_tag.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/constr_CHOICE.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/constr_SEQUENCE.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/constr_SEQUENCE_OF.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/constr_SET_OF.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/constr_TYPE.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/constraints.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/der_encoder.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/jer_decoder.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/jer_encoder.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/jer_support.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/oer_decoder.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/oer_encoder.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/oer_support.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/pdu_collection.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/per_decoder.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/per_encoder.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/per_opentype.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/per_support.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/uper_decoder.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/uper_encoder.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/uper_opentype.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/uper_support.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/xer_decoder.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/xer_encoder.h (100%) rename j2735codec/core/{202409 => j2735_202409}/include/xer_support.h (100%) rename j2735codec/core/{202409 => j2735_202409}/samples/jer/bsm.json (100%) rename j2735codec/core/{202409 => j2735_202409}/samples/jer/eva.json (100%) rename j2735codec/core/{202409 => j2735_202409}/samples/jer/map.json (100%) rename j2735codec/core/{202409 => j2735_202409}/samples/jer/psm.json (100%) rename j2735codec/core/{202409 => j2735_202409}/samples/jer/sdsm.json (100%) rename j2735codec/core/{202409 => j2735_202409}/samples/jer/spat.json (100%) rename j2735codec/core/{202409 => j2735_202409}/samples/jer/tim.json (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ANY.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ANY_aper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ANY_ber.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ANY_jer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ANY_uper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ANY_xer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AbsolutePosition2d.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AbsolutePosition3d.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AccelSteerYawRateConfidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AccelTimeConstant.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Acceleration.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AccelerationConfidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AccelerationSet4Way.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AcceleratorPedalPosition.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AccidentsAndIncidents.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AccountStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AckPolicy.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Activity.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ActualNumberOfPassengers.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ActuatedInterval.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AddGrpB_Angle.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AddGrpB_Elevation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AddGrpB_MsgCount.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AddGrpB_TimeMark.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AddGrpC_Altitude.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AdviceInstructionsMandatory.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AdviceInstructionsRecommendations.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AdvisorySpeed.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AdvisorySpeedList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AdvisorySpeedType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AggregatedSingleTariffClassSession.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AllowedManeuvers.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AlternateRoute.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AltitudeConfidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AltitudeValue.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AmbientAirPressure.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AmbientAirTemperature.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AngularVelocity.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AngularVelocityConfidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AnimalPropelledType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AnimalType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AntennaOffsetSet.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AntiLockBrakeStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ApplicableHeading.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ApproachID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ApproachOrLane.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Area.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AreaOrSegmentChargingInfo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AreaType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AsphaltOrTar.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AsphaltOrTarType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AssetStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AtmosPressureMeasurementStdDev.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Attachment.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AttachmentRadius.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Attitude.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AttitudeConfidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AudioLink.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AuxiliaryBrakeStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AxesMovement.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AxleLocation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AxleWeight.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AxleWeightLimit.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AxleWeightLimits.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AxleWeightList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AxleWeightSet.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Axles.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AxlesCharges.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AxlesChargesTable.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/AxlesWeightLimits.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BIT_STRING.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BIT_STRING_jer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BIT_STRING_oer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BIT_STRING_print.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BIT_STRING_rfill.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BIT_STRING_uper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BIT_STRING_xer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BOOLEAN.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BOOLEAN_aper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BOOLEAN_ber.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BOOLEAN_jer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BOOLEAN_oer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BOOLEAN_print.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BOOLEAN_rfill.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BOOLEAN_uper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BOOLEAN_xer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BSMcoreData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BankAngle.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BasicSafetyMessage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BasicSafetyMessage_PartII-Id.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BasicVehicleClass.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BasicVehicleRole.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BrakeAppliedPressure.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BrakeAppliedStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BrakeBoostApplied.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BrakePedalPosition.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BrakeSystemStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BroadRegion.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BroadRegionArea.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BumperHeight.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/BumperHeights.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CCMFaultMode.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CCMPartIIcontent.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CO2EmissionValue.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CargoWeight.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgAveragedAndSummaryTriggers.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgAveragedTriggers.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgCommSysPerfEvents.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgEmerAndTransitInfo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgEventRecurrence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgEvents.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgHysteresis.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgInstantaneousEventTriggers.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgInterval.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgIntervalEvents.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgKinematicEvents.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgLowSpeedCriteria.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgMsgDictionary.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgMsgRecepIndicators.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgRoadSignInfo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgRoadSignTypes.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgRoadwayEvents.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgStoppedCriteria.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgSummaryTriggers.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgTrafficSigEncounters.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgTransitVehicleData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgVehicleClass.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CfgVehicleEvents.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ChargeObjectId.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ChargerInfo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ChargesTable.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ChargingAreaOrSegment.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ChargingConfig.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ChargingFees.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ChargingUnits.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Cinders.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CindersType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Circle.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ClassificationConfidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ClosedNetworkChargesTable.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Closures.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CoarseHeading.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CodeWord.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CoefficientOfFriction.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CommonContainer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CommonSafetyRequest.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Common_Angle.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Common_Duration.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Common_Elevation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Common_Latitude.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Common_Longitude.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Common_MeanVariation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Common_MsgCount.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ComputedLane.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Confidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ConfidenceSet.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ConfigBoundary.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ConfigDescriptor.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ConfigId.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ConfigInfo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ConfigTemporalBoundary.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ConfigTriggers.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ConnectingLane.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Connection.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ConnectionManeuverAssist-addGrpC.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ConnectionManeuverAssist.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ConnectsToList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ConsecutiveTrafficLight.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ContentContainer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ContractAuthenticator.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ContractSerialNumber.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ContractValidity.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CooperativeControlMessage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CooperativeControlMessage_ManeuverID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CooperativeControlMessage_PartII-Id.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CooperativeControlMessage_PitchRate.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CooperativeControlMessage_RollRate.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CopValue.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Count.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CountryCode.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CrossLinking.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CurrentStateData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/CurveContainer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DDate.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DDateTime.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DDay.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DFullTime.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DHour.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DMinute.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DMonth.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DMonthDay.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DOffset.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DSRCmsgID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DSecond.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DTime.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DYear.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DYearMonth.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DataParameters.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DataSourceInfo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DateAndTime.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DateCompact.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Day.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DayOfWeek.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DegreesLat.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DegreesLong.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DelayStatusCancellation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DeltaAngle.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DeltaTime.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DescriptionOfRoadSurface.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DescriptiveCharacteristics.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DescriptiveName.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DetectedChargeObject.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DetectedObjectCommonData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DetectedObjectData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DetectedObjectList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DetectedObjectOptionalData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DetectedObstacleData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DetectedVRUData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DetectedVehicleData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DetectionMode.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DeviceStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DewPointTempMeasurementStdDev.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DieselEmissionValues.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DirectionOfUse.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DisabledVehicle.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Disasters.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Distance.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DistanceUnit.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DistanceUnits.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Disturbances.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DriveAxleLiftAirPressure.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DriveAxleLocation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DriveAxleLubePressure.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DriveAxleTemperature.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Driven.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DrivenLineOffsetLg.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DrivenLineOffsetSm.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DriverCharacteristics.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DrivingWheelAngle.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/DynamicInfoContainer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ENUMERATED.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ENUMERATED_aper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ENUMERATED_jer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ENUMERATED_oer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ENUMERATED_uper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EXTERNAL.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EfcContextMark.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EfcDataDictionary_Altitude.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EfcDataDictionary_Duration.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EfcDataDictionary_Latitude.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EfcDataDictionary_Longitude.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EfcTime.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ElevOffset.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ElevationConfidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EmergencyDetails.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EmergencyVehicleAlert.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EmissionType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EmissionUnit.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EnabledLaneList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EncryptedTumData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EngineCharacteristics.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EngineDetails.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EntryChargesTable.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EnvironmentalCharacteristics.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EquipmentIccId.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EquipmentObuId.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EquipmentStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EquipmentType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EssMobileFriction.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EssPrecipRate.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EssPrecipSituation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EssPrecipYesNo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EssSolarRadiation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EuroValue.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EventDescription.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EventIdentifier.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EventInfo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/EventRecurrence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ExhaustEmissionValues.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ExitChargesTable.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ExitInfo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ExitService.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Extent.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ExteriorLights.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/FeeReport.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/FrictionInformation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/FrontCutIn.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/FuelType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/FullPositionVector.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/FullRoadAuthorityID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/FurtherInfoID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/FutureCharacteristics.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/GNSSstatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/GeneralizedTime.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/GeneralizedTime_ber.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/GeneralizedTime_jer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/GeneralizedTime_print.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/GeneralizedTime_rfill.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/GeneralizedTime_xer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/GenericLane.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/GenericSignage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/GeographicalPath.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/GeometricProjection.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/GraphicString.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Grass.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/GrassType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Gravel.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/GravelType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/GrossDistance.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/GrossSpeed.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Header.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Heading.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/HeadingConfidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/HeadingDeg.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/HeadingSlice.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/HeavyTruckCCMExtensions.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Holiday.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Hour.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/HumanPropelledType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/IA5String.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/INTEGER.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/INTEGER_aper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/INTEGER_ber.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/INTEGER_jer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/INTEGER_oer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/INTEGER_print.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/INTEGER_rfill.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/INTEGER_uper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/INTEGER_xer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ITISEventType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ITIS_GenericLocations.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ITIS_ITIScodes.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ITIS_ITIScodesAndText.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ITIS_ITIStext.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ITIS_IncidentResponseEquipment.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ITIS_ResponderGroupAffected.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ITIS_VehicleGroupAffected.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ITISgroups.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ITIStextPhrase.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Ice.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/IceType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/IncidentResponseStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/IncidentsContainer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Int1Signed.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Int1Unsigned.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Int2Signed.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Int2Unsigned.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Int3Unsigned.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Int4Signed.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Int4Unsigned.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Int8Signed.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Int8Unsigned.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/IntersectionAccessPoint.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/IntersectionCollision.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/IntersectionGeometry.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/IntersectionGeometryList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/IntersectionID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/IntersectionReferenceID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/IntersectionState-addGrpC.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/IntersectionState.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/IntersectionStateList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/IntersectionStatusObject.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/IsDolly.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Iso3833VehicleType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/IssuerIdentifier.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ItemizedChargerData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ItemizedPaymentReport.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/J1939data.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/J2540ITIS_GenericLocations.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/J2540ITIS_ITIScodes.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/J2540ITIS_ITIScodesAndText.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/J2540ITIS_ITIStext.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/J2540ITIS_IncidentResponseEquipment.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/J2540ITIS_ResponderGroupAffected.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/J2540ITIS_VehicleGroupAffected.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneAttributes-Barrier.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneAttributes-Bike.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneAttributes-Crosswalk.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneAttributes-Parking.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneAttributes-Sidewalk.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneAttributes-Striping.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneAttributes-TrackedVehicle.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneAttributes-Vehicle.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneAttributes.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneChargesTable.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneClosed.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneClosureContainer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneConnectionID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneDataAttribute-addGrpB.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneDataAttribute.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneDataAttributeList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneDirection.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneInfo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneOffset.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneRoadway.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneSharing.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneTypeAttributes.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LaneWidth.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LargeNumbers.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LastTollPointInfo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LastTollPointInfos.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LatOffset.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LatitudeDMS.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LatitudeDMS2.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LayerID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LayerType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LightVehicleCCMExtensions.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LightbarInUse.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LocAndTimeStamp.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LocAndTimeStamps.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LocalVehicleClassId.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Location-quality.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Location-tech.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LocationClassId.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LongOffset.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LongitudeDMS.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LongitudeDMS2.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/LongitudinalControlState.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Lpn.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MSCMType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MUTCDCode.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MUTCDLocations.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Maneuver.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ManeuverAssistList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ManeuverExecutionStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ManeuverSharingAndCoordinatingMessage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ManeuverSharingAndCoordinatingMessage_ManeuverID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ManeuverSharingAndCoordinatingMessage_ObjectDistance.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ManeuverSharingAndCoordinatingMessage_PositionOffsetXYZ.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MapData-addGrpC.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MapData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MaxAvailableAcceleration.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MaxAvailableDeceleration.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MaxTimetoChange.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MeasurementTimeOffset.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MergeDivergeNodeAngle.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MessageBLOB.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MessageFrame.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MinTimetoChange.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Minute.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MinuteOfTheYear.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MinutesAngle.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MinutesDuration.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MobileSituation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Month.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MotorizedPropelledType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MovementEvent-addGrpB.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MovementEvent.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MovementEventList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MovementList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MovementPhaseState.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MovementState.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MsgCRC.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/MultiVehicleResponse.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NMEA-MsgType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NMEA-Payload.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NMEA-Revision.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NMEAcorrections.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPEssAirTemperature.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPEssCloudSituationV4.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPEssDewpointTemp.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPEssPaveTreatProductForm.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPEssPaveTreatProductType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPEssPaveTreatmentAmount.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPEssPaveTreatmentWidth.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPEssPavementTreatmentLatitude.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPEssPavementTreatmentLocation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPEssPavementTreatmentLongitude.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPEssPercentProductMix.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPEssPressureSensorAtmosphericPressure.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPEssSurfaceIceOrWaterDepth.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPEssSurfaceTemperature.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPEssTemperatureSensorHeight.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPEssTotalRadiationPeriod.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPEssTotalRadiationV4.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPEssVisibility.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPEssVisibilitySituation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPHumiditySensorRelativeHumidity.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPPavementSensorSurfaceCondition.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPPrecipitationSensorPrecipSituation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPWindSensorAvgDirection.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPWindSensorAvgSpeed.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPWindSensorGustDirection.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPWindSensorGustSpeed.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPWindSensorSpotDirection.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NTCIPWindSensorSpotSpeed.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NULL.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NULL_aper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NULL_ber.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NULL_jer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NULL_oer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NULL_print.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NULL_rfill.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NULL_uper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NULL_xer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NamedObjects.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NativeEnumerated.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NativeEnumerated_aper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NativeEnumerated_ber.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NativeEnumerated_jer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NativeEnumerated_oer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NativeEnumerated_uper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NativeEnumerated_xer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NativeInteger.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NativeInteger_aper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NativeInteger_ber.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NativeInteger_jer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NativeInteger_oer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NativeInteger_print.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NativeInteger_rfill.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NativeInteger_uper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NativeInteger_xer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Node-LL-24B.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Node-LL-28B.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Node-LL-32B.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Node-LL-36B.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Node-LL-44B.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Node-LL-48B.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Node-LLdms-48b.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Node-LLdms-80b.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Node-LLmD-64b.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Node-XY-20b.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Node-XY-22b.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Node-XY-24b.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Node-XY-26b.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Node-XY-28b.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Node-XY-32b.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NodeAttributeLL.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NodeAttributeLLList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NodeAttributeSetLL.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NodeAttributeSetXY.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NodeAttributeXY.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NodeAttributeXYList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NodeLL.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NodeListLL.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NodeListXY.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NodeOffsetPointLL.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NodeOffsetPointXY-addGrpB.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NodeOffsetPointXY.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NodePointLLE.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NodeSetLL.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NodeSetXY.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NodeXY.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NtcipAirTemperature.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NtcipAtmosphericPressure.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NtcipCloudSituation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NtcipDewPoint.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NtcipEssData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NtcipPavement.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NtcipPavementTreatment.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NtcipPrecipitation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NtcipRelativeHumidity.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NtcipSolarRadiation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NtcipVisibility.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NtcipVisibilitySituation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NtcipWind.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NumberOfAxles.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/NumberOfParticipantsInCluster.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OBJECT_IDENTIFIER.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OBJECT_IDENTIFIER_jer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OBJECT_IDENTIFIER_print.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OBJECT_IDENTIFIER_rfill.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OBJECT_IDENTIFIER_xer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OCTET_STRING.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OCTET_STRING_aper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OCTET_STRING_ber.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OCTET_STRING_jer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OCTET_STRING_oer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OCTET_STRING_print.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OCTET_STRING_rfill.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OCTET_STRING_uper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OCTET_STRING_xer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OPEN_TYPE.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OPEN_TYPE_aper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OPEN_TYPE_ber.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OPEN_TYPE_jer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OPEN_TYPE_oer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OPEN_TYPE_uper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OPEN_TYPE_xer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ObeId.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ObjectCount.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ObjectDescriptor.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ObjectID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ObjectType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Objects.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ObstacleDetection.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ObstacleDirection.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ObstacleDistance.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ObstacleSize.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ObstacleSizeConfidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Obstruction.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Obstructions.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Offset-B09.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Offset-B10.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Offset-B11.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Offset-B12.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Offset-B13.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Offset-B14.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Offset-B16.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Offset3D.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OffsetLL-B12.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OffsetLL-B14.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OffsetLL-B16.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OffsetLL-B18.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OffsetLL-B22.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OffsetLL-B24.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OffsetSystem.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OperatorDefined.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/OverlayLaneList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Parked.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ParkingInformation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PartIIcontent.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Particulate.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PassengerCapacity.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Path.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PathHistory.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PathHistoryPoint.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PathHistoryPointList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PathList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PathPoints.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PathPrediction.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PavementConditions.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PayUnit.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PayloadData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PaymentFee.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PaymentMeans.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PaymentMeansBalance.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PaymentSecurityData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PedestrianBicycleDetect.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PedestrianCall.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PerAxleWeightCharges.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Period.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PermissiveNonProtected.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PersonalAccountNumber.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PersonalAssistive.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PersonalClusterRadius.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PersonalCrossingInProgress.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PersonalCrossingRequest.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PersonalDeviceUsageState.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PersonalDeviceUserType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PersonalSafetyMessage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PersonalSafetyMessage2.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Pitch.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PitchDetected.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PitchRateConfidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PivotPointDescription.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PivotingAllowed.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Point.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PortlandCement.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PortlandCementType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Position3D-addGrpB.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Position3D-addGrpC.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Position3D.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PositionConfidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PositionConfidenceSet.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PositionalAccuracy.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Precipitation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PreemptPriorityList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PrimaryRegionChargingInfo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PrimaryRegionState.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PrioritizationResponse.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PrioritizationResponseList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PrioritizationResponseStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Priority.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PriorityRequestType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PrivilegedEventFlags.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PrivilegedEvents.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ProbeDataConfig.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ProbeDataConfigMessage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ProbeDataManagement.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ProbeDataReportMessage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ProbeDataReport_MeanVariation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ProbeSegmentNumber.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ProbeVehicleData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PropelledInformation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Provider.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PublicSafetyAndRoadWorkerActivity.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PublicSafetyDirectingTrafficSubType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PublicSafetyEventResponderWorkerType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/PurseBalance.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Qualifiers.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RELATIVE-OID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RELATIVE-OID_jer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RELATIVE-OID_print.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RELATIVE-OID_rfill.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RELATIVE-OID_xer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RSMLanePosition.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RSMPolygon.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RTCM-Revision.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RTCMPackage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RTCMcorrections.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RTCMheader.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RTCMmessage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RTCMmessageList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Radius-B12.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Radius.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RadiusOfCurvature.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RainSensor.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ReasonCode.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ReceiptAuthenticator.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ReceiptContract.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ReceiptData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ReceiptDistance.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ReceiptFinancialPart.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ReceiptIccId.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ReceiptObuId.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ReceiptServicePart.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ReceiptServiceSerialNumber.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ReceiptText.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RecreationalObjectsAndActivities.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ReducedSpeedZoneContainer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ReferencePointType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RegionId.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RegionInfo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RegionList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RegionOffsets.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RegionPointSet.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RegionUncertainty.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RegionalExtension.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RegulatoryAndWarningSigns.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RegulatorySpeedLimit.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RelativePosition3d.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RelativeRoadAuthorityID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ReportCharacteristics.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RequestID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RequestImportanceLevel.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RequestSubRole.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RequestedItem.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RequestedItemList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RequestorDescription.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RequestorPositionVector.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RequestorType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ReservedBit.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ResponseFlag.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ResponseType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RestrictionAppliesTo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RestrictionClass.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RestrictionClassAssignment.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RestrictionClassID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RestrictionClassList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RestrictionUserType-addGrpC.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RestrictionUserType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RestrictionUserTypeList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ResultFin.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ResultOp.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadAuthorityID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadGeometryAndAttributes.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadGrade.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadLaneSetList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadRegulatorID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadRoughness.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadSafetyMessage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadSegment.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadSegmentID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadSegmentList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadSegmentReferenceID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadSideAlert.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadSignID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadSnapShot.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadSurfaceCondition.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadUserChargingConfigMessage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadUserChargingReportMessage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadWeatherDownload.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadWeatherMessage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadWeatherUpload.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadsideAssets.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RoadwayCrownAngle.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Roadwork.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Rock.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RockType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Roll.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RollDetected.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RollRateConfidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptAveragedAndSummaryRecord.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptAveragedRecord.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptAvgAndSummaryRecordData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptCommSysPerfEvents.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptDevType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptDriverAlertsAndWarnings.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptEmissions.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptEvents.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptHysteresis.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptHysteresisRecord.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptInstantaneousRecord.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptInstantaneousRecordData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptInstantaneousRecords.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptIntervalEvents.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptKinematicEvents.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptLocOfStops.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptRoadRoughness.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptRoadwayEvents.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptSummaryRecord.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptTrafficMetrics.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptTrafficSigEncounters.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptTransitVehData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptVehicleClass.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptVehicleEvents.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptVehicleReport.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptVelocity.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/RptWiperStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SPAT.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SPAT_TimeMark.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SSPindex.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Sample.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Scale-B12.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SchoolBusJ2945Slash1C.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Second.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SecondOfTime.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SecondsAngle.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Segment.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SegmentAttributeLL.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SegmentAttributeLLList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SegmentAttributeXY.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SegmentAttributeXYList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SemiMajorAxisAccuracy.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SemiMajorAxisOrientation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SemiMinorAxisAccuracy.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SensorDataSharingMessage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SensorDataSharingMessage_ObjectDistance.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SensorDataSharingMessage_PitchRate.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SensorDataSharingMessage_PositionOffsetXYZ.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SensorDataSharingMessage_RollRate.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SeparationDistance.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SessionClass.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SessionLocation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ShapePointSet.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ShortString.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SignPriority.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SignalControlAndPrioritizationRequest.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SignalControlAndPrioritizationStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SignalControlZone.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SignalGroupID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SignalHeadLocation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SignalHeadLocationList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SignalReqScheme.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SignalRequest.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SignalRequestList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SignalRequestMessage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SignalRequestPackage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SignalRequesterInfo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SignalStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SignalStatusList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SignalStatusMessage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SignalStatusPackage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SignalStatusPackageList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SignedValue.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SirenInUse.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SituationalContainer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SizeValue.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SizeValueConfidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SmallNumbers.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Snapshot.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SnapshotDistance.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SnapshotTime.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Snow.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SnowType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SoundLevel.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SpecialCharges.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SpecialEvents.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SpecialVehicleExtensions.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Speed.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SpeedAdvice.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SpeedConfidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SpeedLimit.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SpeedLimitList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SpeedLimitType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SpeedProfile.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SpeedProfileMeasurement.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SpeedProfileMeasurementList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SpeedandHeadingandThrottleConfidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SportingEvents.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/StabilityControlStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/StatesAndTerritories.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/StationID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/StationType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/StdDev.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SteeringAxleLubePressure.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SteeringAxleTemperature.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SteeringWheelAngle.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SteeringWheelAngleConfidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SteeringWheelAngleRateOfChange.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/StreetSuffixes.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Structures.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SubManeuver.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SubManeuverList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SubRegionChargingInfo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SuggestionAdvice.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SummerTime.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SunSensor.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SupplementalVehicleExtensions.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SurfaceTempMeasurementStdDev.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SurroundingVehicleInfo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/SystemInformation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TRRLength.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TRRLocation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TRRLocationType1.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TRRLocationType2.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TRRLocationType3.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TRRType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TargetRoadResource.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TariffClassDescription.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TariffClassId.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Temperature.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TemperatureMeasurementStdDev.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TemporaryID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TemporaryIDList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TemporaryIDPointer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TenthSecond.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TermDistance.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TermTime.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TestMessage00.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TestMessage01.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TestMessage02.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TestMessage03.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TestMessage04.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TestMessage05.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TestMessage06.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TestMessage07.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TestMessage08.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TestMessage09.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TestMessage10.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TestMessage11.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TestMessage12.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TestMessage13.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TestMessage14.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TestMessage15.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ThrottleConfidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ThrottlePosition.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TimeChangeDetails.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TimeChargesTable.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TimeClassId.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TimeCompact.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TimeConfidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TimeConstant.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TimeInSecond-B16.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TimeInSecond-B8.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TimeIntervalConfidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TimeOffset.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TimePeriod.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TimeRemaining.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TimeUnit.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TireData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TireDataList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TireLeakageRate.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TireLocation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TirePressure.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TirePressureThresholdDetection.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TireTemp.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Tolerance.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TollAdvertisementInfo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TollAdvertisementMessage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TollChargerInfo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TollChargesTable.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TollPointID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TollPointMap.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TollServiceProviderData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TollUsageAckMessage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TollUsageMessage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TollUserData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TollVehicleId.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Torque.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TotalMass.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TotalWeightCharges.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TractionControlStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrafficConditions.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrafficLightControllerStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrafficLightDirectionCode.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrafficLightID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrafficLightIntervalType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrafficLightOperationStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrafficLightStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrafficLightStatusList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrafficLightStatusMessage.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrafficLightType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrafficLightingStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrafficSignalPhaseAndTiming.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrailerCharacteristics.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrailerData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrailerDetails.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrailerHistoryPoint.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrailerHistoryPointList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrailerMass.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrailerType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrailerUnitDescJ2945Slash1B.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrailerUnitDescription.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrailerUnitDescriptionList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrailerWeight.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TrailersJ2945Slash1B.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TransitMode.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TransitOperations.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TransitStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TransitVehicleOccupancy.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TransitVehicleStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TransmissionAndSpeed.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TransmissionState.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TravelerDataFrame.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TravelerDataFrameList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TravelerDataFrameNewPartIIIContent.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TravelerGroupAffected.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TravelerInfoType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TravelerInformation.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TripInfo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TumAck.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TumAckHash.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TumData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TumHash.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TumInstructions.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/TyreConfiguration.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/URL-Base.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/URL-Link.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/URL-Short.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/UniqueMSGID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Units.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/UnusualDriving.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/UsageReport.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/UserClassId.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/UserData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/UserFeeInfo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/UserId.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/UserSizeAndBehaviour.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VINstring.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ValidManeuvers.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ValidRegion.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ValidityOfContract.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VariationStdDev.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehTypeCharges.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehTypeChargesTable.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleAuthenticator.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleAxles.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleAxlesAndWeightInfo.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleAxlesNumber.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleClass.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleClassification.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleCurrentMaxTrainWeight.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleDescription.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleDimensions.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleEventFlags.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleHeight.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleID.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleIdent.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleLength.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleMass.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleReport.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleSafetyExtensions.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleSize.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleSizeConfidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleSpecificCharacteristics.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleStatusDeviceTypeTag.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleStatusRequest.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleStatusRequestList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleToLanePosition.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleToLanePositionList.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleTotalDistance.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleType.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleTypes.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleWeightLaden.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleWeightLimits.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VehicleWidth.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Velocity.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VertOffset-B07.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VertOffset-B08.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VertOffset-B09.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VertOffset-B10.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VertOffset-B11.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VertOffset-B12.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VerticalAcceleration.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VerticalAccelerationThreshold.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VerticalOffset.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VisibilityAndAirQuality.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/VisualLink.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/WDMSFleetData.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/WaitOnStopline.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/WarningAdvice.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/WeatherConditions.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/WeatherProbe.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/WeatherReport.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Weekday.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/WeightCharges.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/WeightChargesTable.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/WheelEndElectFault.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/WheelSensorStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Winds.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/WinterDrivingIndex.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/WinterDrivingRestrictions.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/WiperRate.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/WiperSet.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/WiperStatus.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/WorkZone.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Yaw.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/YawDetected.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/YawRate.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/YawRateConfidence.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Year.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ZoneLength.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/Zoom.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/aper_decoder.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/aper_encoder.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/aper_opentype.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/aper_support.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/asn_SEQUENCE_OF.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/asn_SET_OF.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/asn_application.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/asn_bit_data.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/asn_codecs_prim.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/asn_codecs_prim_ber.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/asn_codecs_prim_jer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/asn_codecs_prim_xer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/asn_internal.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/asn_random_fill.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ber_decoder.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ber_tlv_length.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/ber_tlv_tag.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_CHOICE.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_CHOICE_aper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_CHOICE_ber.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_CHOICE_jer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_CHOICE_oer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_CHOICE_print.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_CHOICE_rfill.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_CHOICE_uper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_CHOICE_xer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SEQUENCE.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SEQUENCE_OF.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SEQUENCE_OF_aper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SEQUENCE_OF_ber.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SEQUENCE_OF_jer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SEQUENCE_OF_uper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SEQUENCE_OF_xer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SEQUENCE_aper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SEQUENCE_ber.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SEQUENCE_jer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SEQUENCE_oer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SEQUENCE_print.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SEQUENCE_rfill.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SEQUENCE_uper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SEQUENCE_xer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SET_OF.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SET_OF_aper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SET_OF_ber.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SET_OF_jer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SET_OF_oer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SET_OF_print.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SET_OF_rfill.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SET_OF_uper.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_SET_OF_xer.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constr_TYPE.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/constraints.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/der_encoder.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/jer_decoder.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/jer_encoder.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/jer_support.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/oer_decoder.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/oer_encoder.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/oer_support.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/pdu_collection.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/per_decoder.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/per_encoder.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/per_opentype.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/per_support.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/uper_decoder.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/uper_encoder.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/uper_opentype.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/uper_support.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/xer_decoder.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/xer_encoder.c (100%) rename j2735codec/core/{202409 => j2735_202409}/src/xer_support.c (100%) diff --git a/j2735codec/core/202409/include/ANY.h b/j2735codec/core/j2735_202409/include/ANY.h similarity index 100% rename from j2735codec/core/202409/include/ANY.h rename to j2735codec/core/j2735_202409/include/ANY.h diff --git a/j2735codec/core/202409/include/AbsolutePosition2d.h b/j2735codec/core/j2735_202409/include/AbsolutePosition2d.h similarity index 100% rename from j2735codec/core/202409/include/AbsolutePosition2d.h rename to j2735codec/core/j2735_202409/include/AbsolutePosition2d.h diff --git a/j2735codec/core/202409/include/AbsolutePosition3d.h b/j2735codec/core/j2735_202409/include/AbsolutePosition3d.h similarity index 100% rename from j2735codec/core/202409/include/AbsolutePosition3d.h rename to j2735codec/core/j2735_202409/include/AbsolutePosition3d.h diff --git a/j2735codec/core/202409/include/AccelSteerYawRateConfidence.h b/j2735codec/core/j2735_202409/include/AccelSteerYawRateConfidence.h similarity index 100% rename from j2735codec/core/202409/include/AccelSteerYawRateConfidence.h rename to j2735codec/core/j2735_202409/include/AccelSteerYawRateConfidence.h diff --git a/j2735codec/core/202409/include/AccelTimeConstant.h b/j2735codec/core/j2735_202409/include/AccelTimeConstant.h similarity index 100% rename from j2735codec/core/202409/include/AccelTimeConstant.h rename to j2735codec/core/j2735_202409/include/AccelTimeConstant.h diff --git a/j2735codec/core/202409/include/Acceleration.h b/j2735codec/core/j2735_202409/include/Acceleration.h similarity index 100% rename from j2735codec/core/202409/include/Acceleration.h rename to j2735codec/core/j2735_202409/include/Acceleration.h diff --git a/j2735codec/core/202409/include/AccelerationConfidence.h b/j2735codec/core/j2735_202409/include/AccelerationConfidence.h similarity index 100% rename from j2735codec/core/202409/include/AccelerationConfidence.h rename to j2735codec/core/j2735_202409/include/AccelerationConfidence.h diff --git a/j2735codec/core/202409/include/AccelerationSet4Way.h b/j2735codec/core/j2735_202409/include/AccelerationSet4Way.h similarity index 100% rename from j2735codec/core/202409/include/AccelerationSet4Way.h rename to j2735codec/core/j2735_202409/include/AccelerationSet4Way.h diff --git a/j2735codec/core/202409/include/AcceleratorPedalPosition.h b/j2735codec/core/j2735_202409/include/AcceleratorPedalPosition.h similarity index 100% rename from j2735codec/core/202409/include/AcceleratorPedalPosition.h rename to j2735codec/core/j2735_202409/include/AcceleratorPedalPosition.h diff --git a/j2735codec/core/202409/include/AccidentsAndIncidents.h b/j2735codec/core/j2735_202409/include/AccidentsAndIncidents.h similarity index 100% rename from j2735codec/core/202409/include/AccidentsAndIncidents.h rename to j2735codec/core/j2735_202409/include/AccidentsAndIncidents.h diff --git a/j2735codec/core/202409/include/AccountStatus.h b/j2735codec/core/j2735_202409/include/AccountStatus.h similarity index 100% rename from j2735codec/core/202409/include/AccountStatus.h rename to j2735codec/core/j2735_202409/include/AccountStatus.h diff --git a/j2735codec/core/202409/include/AckPolicy.h b/j2735codec/core/j2735_202409/include/AckPolicy.h similarity index 100% rename from j2735codec/core/202409/include/AckPolicy.h rename to j2735codec/core/j2735_202409/include/AckPolicy.h diff --git a/j2735codec/core/202409/include/Activity.h b/j2735codec/core/j2735_202409/include/Activity.h similarity index 100% rename from j2735codec/core/202409/include/Activity.h rename to j2735codec/core/j2735_202409/include/Activity.h diff --git a/j2735codec/core/202409/include/ActualNumberOfPassengers.h b/j2735codec/core/j2735_202409/include/ActualNumberOfPassengers.h similarity index 100% rename from j2735codec/core/202409/include/ActualNumberOfPassengers.h rename to j2735codec/core/j2735_202409/include/ActualNumberOfPassengers.h diff --git a/j2735codec/core/202409/include/ActuatedInterval.h b/j2735codec/core/j2735_202409/include/ActuatedInterval.h similarity index 100% rename from j2735codec/core/202409/include/ActuatedInterval.h rename to j2735codec/core/j2735_202409/include/ActuatedInterval.h diff --git a/j2735codec/core/202409/include/AddGrpB_Angle.h b/j2735codec/core/j2735_202409/include/AddGrpB_Angle.h similarity index 100% rename from j2735codec/core/202409/include/AddGrpB_Angle.h rename to j2735codec/core/j2735_202409/include/AddGrpB_Angle.h diff --git a/j2735codec/core/202409/include/AddGrpB_Elevation.h b/j2735codec/core/j2735_202409/include/AddGrpB_Elevation.h similarity index 100% rename from j2735codec/core/202409/include/AddGrpB_Elevation.h rename to j2735codec/core/j2735_202409/include/AddGrpB_Elevation.h diff --git a/j2735codec/core/202409/include/AddGrpB_MsgCount.h b/j2735codec/core/j2735_202409/include/AddGrpB_MsgCount.h similarity index 100% rename from j2735codec/core/202409/include/AddGrpB_MsgCount.h rename to j2735codec/core/j2735_202409/include/AddGrpB_MsgCount.h diff --git a/j2735codec/core/202409/include/AddGrpB_TimeMark.h b/j2735codec/core/j2735_202409/include/AddGrpB_TimeMark.h similarity index 100% rename from j2735codec/core/202409/include/AddGrpB_TimeMark.h rename to j2735codec/core/j2735_202409/include/AddGrpB_TimeMark.h diff --git a/j2735codec/core/202409/include/AddGrpC_Altitude.h b/j2735codec/core/j2735_202409/include/AddGrpC_Altitude.h similarity index 100% rename from j2735codec/core/202409/include/AddGrpC_Altitude.h rename to j2735codec/core/j2735_202409/include/AddGrpC_Altitude.h diff --git a/j2735codec/core/202409/include/AdviceInstructionsMandatory.h b/j2735codec/core/j2735_202409/include/AdviceInstructionsMandatory.h similarity index 100% rename from j2735codec/core/202409/include/AdviceInstructionsMandatory.h rename to j2735codec/core/j2735_202409/include/AdviceInstructionsMandatory.h diff --git a/j2735codec/core/202409/include/AdviceInstructionsRecommendations.h b/j2735codec/core/j2735_202409/include/AdviceInstructionsRecommendations.h similarity index 100% rename from j2735codec/core/202409/include/AdviceInstructionsRecommendations.h rename to j2735codec/core/j2735_202409/include/AdviceInstructionsRecommendations.h diff --git a/j2735codec/core/202409/include/AdvisorySpeed.h b/j2735codec/core/j2735_202409/include/AdvisorySpeed.h similarity index 100% rename from j2735codec/core/202409/include/AdvisorySpeed.h rename to j2735codec/core/j2735_202409/include/AdvisorySpeed.h diff --git a/j2735codec/core/202409/include/AdvisorySpeedList.h b/j2735codec/core/j2735_202409/include/AdvisorySpeedList.h similarity index 100% rename from j2735codec/core/202409/include/AdvisorySpeedList.h rename to j2735codec/core/j2735_202409/include/AdvisorySpeedList.h diff --git a/j2735codec/core/202409/include/AdvisorySpeedType.h b/j2735codec/core/j2735_202409/include/AdvisorySpeedType.h similarity index 100% rename from j2735codec/core/202409/include/AdvisorySpeedType.h rename to j2735codec/core/j2735_202409/include/AdvisorySpeedType.h diff --git a/j2735codec/core/202409/include/AggregatedSingleTariffClassSession.h b/j2735codec/core/j2735_202409/include/AggregatedSingleTariffClassSession.h similarity index 100% rename from j2735codec/core/202409/include/AggregatedSingleTariffClassSession.h rename to j2735codec/core/j2735_202409/include/AggregatedSingleTariffClassSession.h diff --git a/j2735codec/core/202409/include/AllowedManeuvers.h b/j2735codec/core/j2735_202409/include/AllowedManeuvers.h similarity index 100% rename from j2735codec/core/202409/include/AllowedManeuvers.h rename to j2735codec/core/j2735_202409/include/AllowedManeuvers.h diff --git a/j2735codec/core/202409/include/AlternateRoute.h b/j2735codec/core/j2735_202409/include/AlternateRoute.h similarity index 100% rename from j2735codec/core/202409/include/AlternateRoute.h rename to j2735codec/core/j2735_202409/include/AlternateRoute.h diff --git a/j2735codec/core/202409/include/AltitudeConfidence.h b/j2735codec/core/j2735_202409/include/AltitudeConfidence.h similarity index 100% rename from j2735codec/core/202409/include/AltitudeConfidence.h rename to j2735codec/core/j2735_202409/include/AltitudeConfidence.h diff --git a/j2735codec/core/202409/include/AltitudeValue.h b/j2735codec/core/j2735_202409/include/AltitudeValue.h similarity index 100% rename from j2735codec/core/202409/include/AltitudeValue.h rename to j2735codec/core/j2735_202409/include/AltitudeValue.h diff --git a/j2735codec/core/202409/include/AmbientAirPressure.h b/j2735codec/core/j2735_202409/include/AmbientAirPressure.h similarity index 100% rename from j2735codec/core/202409/include/AmbientAirPressure.h rename to j2735codec/core/j2735_202409/include/AmbientAirPressure.h diff --git a/j2735codec/core/202409/include/AmbientAirTemperature.h b/j2735codec/core/j2735_202409/include/AmbientAirTemperature.h similarity index 100% rename from j2735codec/core/202409/include/AmbientAirTemperature.h rename to j2735codec/core/j2735_202409/include/AmbientAirTemperature.h diff --git a/j2735codec/core/202409/include/AngularVelocity.h b/j2735codec/core/j2735_202409/include/AngularVelocity.h similarity index 100% rename from j2735codec/core/202409/include/AngularVelocity.h rename to j2735codec/core/j2735_202409/include/AngularVelocity.h diff --git a/j2735codec/core/202409/include/AngularVelocityConfidence.h b/j2735codec/core/j2735_202409/include/AngularVelocityConfidence.h similarity index 100% rename from j2735codec/core/202409/include/AngularVelocityConfidence.h rename to j2735codec/core/j2735_202409/include/AngularVelocityConfidence.h diff --git a/j2735codec/core/202409/include/AnimalPropelledType.h b/j2735codec/core/j2735_202409/include/AnimalPropelledType.h similarity index 100% rename from j2735codec/core/202409/include/AnimalPropelledType.h rename to j2735codec/core/j2735_202409/include/AnimalPropelledType.h diff --git a/j2735codec/core/202409/include/AnimalType.h b/j2735codec/core/j2735_202409/include/AnimalType.h similarity index 100% rename from j2735codec/core/202409/include/AnimalType.h rename to j2735codec/core/j2735_202409/include/AnimalType.h diff --git a/j2735codec/core/202409/include/AntennaOffsetSet.h b/j2735codec/core/j2735_202409/include/AntennaOffsetSet.h similarity index 100% rename from j2735codec/core/202409/include/AntennaOffsetSet.h rename to j2735codec/core/j2735_202409/include/AntennaOffsetSet.h diff --git a/j2735codec/core/202409/include/AntiLockBrakeStatus.h b/j2735codec/core/j2735_202409/include/AntiLockBrakeStatus.h similarity index 100% rename from j2735codec/core/202409/include/AntiLockBrakeStatus.h rename to j2735codec/core/j2735_202409/include/AntiLockBrakeStatus.h diff --git a/j2735codec/core/202409/include/ApplicableHeading.h b/j2735codec/core/j2735_202409/include/ApplicableHeading.h similarity index 100% rename from j2735codec/core/202409/include/ApplicableHeading.h rename to j2735codec/core/j2735_202409/include/ApplicableHeading.h diff --git a/j2735codec/core/202409/include/ApproachID.h b/j2735codec/core/j2735_202409/include/ApproachID.h similarity index 100% rename from j2735codec/core/202409/include/ApproachID.h rename to j2735codec/core/j2735_202409/include/ApproachID.h diff --git a/j2735codec/core/202409/include/ApproachOrLane.h b/j2735codec/core/j2735_202409/include/ApproachOrLane.h similarity index 100% rename from j2735codec/core/202409/include/ApproachOrLane.h rename to j2735codec/core/j2735_202409/include/ApproachOrLane.h diff --git a/j2735codec/core/202409/include/Area.h b/j2735codec/core/j2735_202409/include/Area.h similarity index 100% rename from j2735codec/core/202409/include/Area.h rename to j2735codec/core/j2735_202409/include/Area.h diff --git a/j2735codec/core/202409/include/AreaOrSegmentChargingInfo.h b/j2735codec/core/j2735_202409/include/AreaOrSegmentChargingInfo.h similarity index 100% rename from j2735codec/core/202409/include/AreaOrSegmentChargingInfo.h rename to j2735codec/core/j2735_202409/include/AreaOrSegmentChargingInfo.h diff --git a/j2735codec/core/202409/include/AreaType.h b/j2735codec/core/j2735_202409/include/AreaType.h similarity index 100% rename from j2735codec/core/202409/include/AreaType.h rename to j2735codec/core/j2735_202409/include/AreaType.h diff --git a/j2735codec/core/202409/include/AsphaltOrTar.h b/j2735codec/core/j2735_202409/include/AsphaltOrTar.h similarity index 100% rename from j2735codec/core/202409/include/AsphaltOrTar.h rename to j2735codec/core/j2735_202409/include/AsphaltOrTar.h diff --git a/j2735codec/core/202409/include/AsphaltOrTarType.h b/j2735codec/core/j2735_202409/include/AsphaltOrTarType.h similarity index 100% rename from j2735codec/core/202409/include/AsphaltOrTarType.h rename to j2735codec/core/j2735_202409/include/AsphaltOrTarType.h diff --git a/j2735codec/core/202409/include/AssetStatus.h b/j2735codec/core/j2735_202409/include/AssetStatus.h similarity index 100% rename from j2735codec/core/202409/include/AssetStatus.h rename to j2735codec/core/j2735_202409/include/AssetStatus.h diff --git a/j2735codec/core/202409/include/AtmosPressureMeasurementStdDev.h b/j2735codec/core/j2735_202409/include/AtmosPressureMeasurementStdDev.h similarity index 100% rename from j2735codec/core/202409/include/AtmosPressureMeasurementStdDev.h rename to j2735codec/core/j2735_202409/include/AtmosPressureMeasurementStdDev.h diff --git a/j2735codec/core/202409/include/Attachment.h b/j2735codec/core/j2735_202409/include/Attachment.h similarity index 100% rename from j2735codec/core/202409/include/Attachment.h rename to j2735codec/core/j2735_202409/include/Attachment.h diff --git a/j2735codec/core/202409/include/AttachmentRadius.h b/j2735codec/core/j2735_202409/include/AttachmentRadius.h similarity index 100% rename from j2735codec/core/202409/include/AttachmentRadius.h rename to j2735codec/core/j2735_202409/include/AttachmentRadius.h diff --git a/j2735codec/core/202409/include/Attitude.h b/j2735codec/core/j2735_202409/include/Attitude.h similarity index 100% rename from j2735codec/core/202409/include/Attitude.h rename to j2735codec/core/j2735_202409/include/Attitude.h diff --git a/j2735codec/core/202409/include/AttitudeConfidence.h b/j2735codec/core/j2735_202409/include/AttitudeConfidence.h similarity index 100% rename from j2735codec/core/202409/include/AttitudeConfidence.h rename to j2735codec/core/j2735_202409/include/AttitudeConfidence.h diff --git a/j2735codec/core/202409/include/AudioLink.h b/j2735codec/core/j2735_202409/include/AudioLink.h similarity index 100% rename from j2735codec/core/202409/include/AudioLink.h rename to j2735codec/core/j2735_202409/include/AudioLink.h diff --git a/j2735codec/core/202409/include/AuxiliaryBrakeStatus.h b/j2735codec/core/j2735_202409/include/AuxiliaryBrakeStatus.h similarity index 100% rename from j2735codec/core/202409/include/AuxiliaryBrakeStatus.h rename to j2735codec/core/j2735_202409/include/AuxiliaryBrakeStatus.h diff --git a/j2735codec/core/202409/include/AxesMovement.h b/j2735codec/core/j2735_202409/include/AxesMovement.h similarity index 100% rename from j2735codec/core/202409/include/AxesMovement.h rename to j2735codec/core/j2735_202409/include/AxesMovement.h diff --git a/j2735codec/core/202409/include/AxleLocation.h b/j2735codec/core/j2735_202409/include/AxleLocation.h similarity index 100% rename from j2735codec/core/202409/include/AxleLocation.h rename to j2735codec/core/j2735_202409/include/AxleLocation.h diff --git a/j2735codec/core/202409/include/AxleWeight.h b/j2735codec/core/j2735_202409/include/AxleWeight.h similarity index 100% rename from j2735codec/core/202409/include/AxleWeight.h rename to j2735codec/core/j2735_202409/include/AxleWeight.h diff --git a/j2735codec/core/202409/include/AxleWeightLimit.h b/j2735codec/core/j2735_202409/include/AxleWeightLimit.h similarity index 100% rename from j2735codec/core/202409/include/AxleWeightLimit.h rename to j2735codec/core/j2735_202409/include/AxleWeightLimit.h diff --git a/j2735codec/core/202409/include/AxleWeightLimits.h b/j2735codec/core/j2735_202409/include/AxleWeightLimits.h similarity index 100% rename from j2735codec/core/202409/include/AxleWeightLimits.h rename to j2735codec/core/j2735_202409/include/AxleWeightLimits.h diff --git a/j2735codec/core/202409/include/AxleWeightList.h b/j2735codec/core/j2735_202409/include/AxleWeightList.h similarity index 100% rename from j2735codec/core/202409/include/AxleWeightList.h rename to j2735codec/core/j2735_202409/include/AxleWeightList.h diff --git a/j2735codec/core/202409/include/AxleWeightSet.h b/j2735codec/core/j2735_202409/include/AxleWeightSet.h similarity index 100% rename from j2735codec/core/202409/include/AxleWeightSet.h rename to j2735codec/core/j2735_202409/include/AxleWeightSet.h diff --git a/j2735codec/core/202409/include/Axles.h b/j2735codec/core/j2735_202409/include/Axles.h similarity index 100% rename from j2735codec/core/202409/include/Axles.h rename to j2735codec/core/j2735_202409/include/Axles.h diff --git a/j2735codec/core/202409/include/AxlesCharges.h b/j2735codec/core/j2735_202409/include/AxlesCharges.h similarity index 100% rename from j2735codec/core/202409/include/AxlesCharges.h rename to j2735codec/core/j2735_202409/include/AxlesCharges.h diff --git a/j2735codec/core/202409/include/AxlesChargesTable.h b/j2735codec/core/j2735_202409/include/AxlesChargesTable.h similarity index 100% rename from j2735codec/core/202409/include/AxlesChargesTable.h rename to j2735codec/core/j2735_202409/include/AxlesChargesTable.h diff --git a/j2735codec/core/202409/include/AxlesWeightLimits.h b/j2735codec/core/j2735_202409/include/AxlesWeightLimits.h similarity index 100% rename from j2735codec/core/202409/include/AxlesWeightLimits.h rename to j2735codec/core/j2735_202409/include/AxlesWeightLimits.h diff --git a/j2735codec/core/202409/include/BIT_STRING.h b/j2735codec/core/j2735_202409/include/BIT_STRING.h similarity index 100% rename from j2735codec/core/202409/include/BIT_STRING.h rename to j2735codec/core/j2735_202409/include/BIT_STRING.h diff --git a/j2735codec/core/202409/include/BOOLEAN.h b/j2735codec/core/j2735_202409/include/BOOLEAN.h similarity index 100% rename from j2735codec/core/202409/include/BOOLEAN.h rename to j2735codec/core/j2735_202409/include/BOOLEAN.h diff --git a/j2735codec/core/202409/include/BSMcoreData.h b/j2735codec/core/j2735_202409/include/BSMcoreData.h similarity index 100% rename from j2735codec/core/202409/include/BSMcoreData.h rename to j2735codec/core/j2735_202409/include/BSMcoreData.h diff --git a/j2735codec/core/202409/include/BankAngle.h b/j2735codec/core/j2735_202409/include/BankAngle.h similarity index 100% rename from j2735codec/core/202409/include/BankAngle.h rename to j2735codec/core/j2735_202409/include/BankAngle.h diff --git a/j2735codec/core/202409/include/BasicSafetyMessage.h b/j2735codec/core/j2735_202409/include/BasicSafetyMessage.h similarity index 100% rename from j2735codec/core/202409/include/BasicSafetyMessage.h rename to j2735codec/core/j2735_202409/include/BasicSafetyMessage.h diff --git a/j2735codec/core/202409/include/BasicSafetyMessage_PartII-Id.h b/j2735codec/core/j2735_202409/include/BasicSafetyMessage_PartII-Id.h similarity index 100% rename from j2735codec/core/202409/include/BasicSafetyMessage_PartII-Id.h rename to j2735codec/core/j2735_202409/include/BasicSafetyMessage_PartII-Id.h diff --git a/j2735codec/core/202409/include/BasicVehicleClass.h b/j2735codec/core/j2735_202409/include/BasicVehicleClass.h similarity index 100% rename from j2735codec/core/202409/include/BasicVehicleClass.h rename to j2735codec/core/j2735_202409/include/BasicVehicleClass.h diff --git a/j2735codec/core/202409/include/BasicVehicleRole.h b/j2735codec/core/j2735_202409/include/BasicVehicleRole.h similarity index 100% rename from j2735codec/core/202409/include/BasicVehicleRole.h rename to j2735codec/core/j2735_202409/include/BasicVehicleRole.h diff --git a/j2735codec/core/202409/include/BrakeAppliedPressure.h b/j2735codec/core/j2735_202409/include/BrakeAppliedPressure.h similarity index 100% rename from j2735codec/core/202409/include/BrakeAppliedPressure.h rename to j2735codec/core/j2735_202409/include/BrakeAppliedPressure.h diff --git a/j2735codec/core/202409/include/BrakeAppliedStatus.h b/j2735codec/core/j2735_202409/include/BrakeAppliedStatus.h similarity index 100% rename from j2735codec/core/202409/include/BrakeAppliedStatus.h rename to j2735codec/core/j2735_202409/include/BrakeAppliedStatus.h diff --git a/j2735codec/core/202409/include/BrakeBoostApplied.h b/j2735codec/core/j2735_202409/include/BrakeBoostApplied.h similarity index 100% rename from j2735codec/core/202409/include/BrakeBoostApplied.h rename to j2735codec/core/j2735_202409/include/BrakeBoostApplied.h diff --git a/j2735codec/core/202409/include/BrakePedalPosition.h b/j2735codec/core/j2735_202409/include/BrakePedalPosition.h similarity index 100% rename from j2735codec/core/202409/include/BrakePedalPosition.h rename to j2735codec/core/j2735_202409/include/BrakePedalPosition.h diff --git a/j2735codec/core/202409/include/BrakeSystemStatus.h b/j2735codec/core/j2735_202409/include/BrakeSystemStatus.h similarity index 100% rename from j2735codec/core/202409/include/BrakeSystemStatus.h rename to j2735codec/core/j2735_202409/include/BrakeSystemStatus.h diff --git a/j2735codec/core/202409/include/BroadRegion.h b/j2735codec/core/j2735_202409/include/BroadRegion.h similarity index 100% rename from j2735codec/core/202409/include/BroadRegion.h rename to j2735codec/core/j2735_202409/include/BroadRegion.h diff --git a/j2735codec/core/202409/include/BroadRegionArea.h b/j2735codec/core/j2735_202409/include/BroadRegionArea.h similarity index 100% rename from j2735codec/core/202409/include/BroadRegionArea.h rename to j2735codec/core/j2735_202409/include/BroadRegionArea.h diff --git a/j2735codec/core/202409/include/BumperHeight.h b/j2735codec/core/j2735_202409/include/BumperHeight.h similarity index 100% rename from j2735codec/core/202409/include/BumperHeight.h rename to j2735codec/core/j2735_202409/include/BumperHeight.h diff --git a/j2735codec/core/202409/include/BumperHeights.h b/j2735codec/core/j2735_202409/include/BumperHeights.h similarity index 100% rename from j2735codec/core/202409/include/BumperHeights.h rename to j2735codec/core/j2735_202409/include/BumperHeights.h diff --git a/j2735codec/core/202409/include/CCMFaultMode.h b/j2735codec/core/j2735_202409/include/CCMFaultMode.h similarity index 100% rename from j2735codec/core/202409/include/CCMFaultMode.h rename to j2735codec/core/j2735_202409/include/CCMFaultMode.h diff --git a/j2735codec/core/202409/include/CCMPartIIcontent.h b/j2735codec/core/j2735_202409/include/CCMPartIIcontent.h similarity index 100% rename from j2735codec/core/202409/include/CCMPartIIcontent.h rename to j2735codec/core/j2735_202409/include/CCMPartIIcontent.h diff --git a/j2735codec/core/202409/include/CO2EmissionValue.h b/j2735codec/core/j2735_202409/include/CO2EmissionValue.h similarity index 100% rename from j2735codec/core/202409/include/CO2EmissionValue.h rename to j2735codec/core/j2735_202409/include/CO2EmissionValue.h diff --git a/j2735codec/core/202409/include/CargoWeight.h b/j2735codec/core/j2735_202409/include/CargoWeight.h similarity index 100% rename from j2735codec/core/202409/include/CargoWeight.h rename to j2735codec/core/j2735_202409/include/CargoWeight.h diff --git a/j2735codec/core/202409/include/CfgAveragedAndSummaryTriggers.h b/j2735codec/core/j2735_202409/include/CfgAveragedAndSummaryTriggers.h similarity index 100% rename from j2735codec/core/202409/include/CfgAveragedAndSummaryTriggers.h rename to j2735codec/core/j2735_202409/include/CfgAveragedAndSummaryTriggers.h diff --git a/j2735codec/core/202409/include/CfgAveragedTriggers.h b/j2735codec/core/j2735_202409/include/CfgAveragedTriggers.h similarity index 100% rename from j2735codec/core/202409/include/CfgAveragedTriggers.h rename to j2735codec/core/j2735_202409/include/CfgAveragedTriggers.h diff --git a/j2735codec/core/202409/include/CfgCommSysPerfEvents.h b/j2735codec/core/j2735_202409/include/CfgCommSysPerfEvents.h similarity index 100% rename from j2735codec/core/202409/include/CfgCommSysPerfEvents.h rename to j2735codec/core/j2735_202409/include/CfgCommSysPerfEvents.h diff --git a/j2735codec/core/202409/include/CfgEmerAndTransitInfo.h b/j2735codec/core/j2735_202409/include/CfgEmerAndTransitInfo.h similarity index 100% rename from j2735codec/core/202409/include/CfgEmerAndTransitInfo.h rename to j2735codec/core/j2735_202409/include/CfgEmerAndTransitInfo.h diff --git a/j2735codec/core/202409/include/CfgEventRecurrence.h b/j2735codec/core/j2735_202409/include/CfgEventRecurrence.h similarity index 100% rename from j2735codec/core/202409/include/CfgEventRecurrence.h rename to j2735codec/core/j2735_202409/include/CfgEventRecurrence.h diff --git a/j2735codec/core/202409/include/CfgEvents.h b/j2735codec/core/j2735_202409/include/CfgEvents.h similarity index 100% rename from j2735codec/core/202409/include/CfgEvents.h rename to j2735codec/core/j2735_202409/include/CfgEvents.h diff --git a/j2735codec/core/202409/include/CfgHysteresis.h b/j2735codec/core/j2735_202409/include/CfgHysteresis.h similarity index 100% rename from j2735codec/core/202409/include/CfgHysteresis.h rename to j2735codec/core/j2735_202409/include/CfgHysteresis.h diff --git a/j2735codec/core/202409/include/CfgInstantaneousEventTriggers.h b/j2735codec/core/j2735_202409/include/CfgInstantaneousEventTriggers.h similarity index 100% rename from j2735codec/core/202409/include/CfgInstantaneousEventTriggers.h rename to j2735codec/core/j2735_202409/include/CfgInstantaneousEventTriggers.h diff --git a/j2735codec/core/202409/include/CfgInterval.h b/j2735codec/core/j2735_202409/include/CfgInterval.h similarity index 100% rename from j2735codec/core/202409/include/CfgInterval.h rename to j2735codec/core/j2735_202409/include/CfgInterval.h diff --git a/j2735codec/core/202409/include/CfgIntervalEvents.h b/j2735codec/core/j2735_202409/include/CfgIntervalEvents.h similarity index 100% rename from j2735codec/core/202409/include/CfgIntervalEvents.h rename to j2735codec/core/j2735_202409/include/CfgIntervalEvents.h diff --git a/j2735codec/core/202409/include/CfgKinematicEvents.h b/j2735codec/core/j2735_202409/include/CfgKinematicEvents.h similarity index 100% rename from j2735codec/core/202409/include/CfgKinematicEvents.h rename to j2735codec/core/j2735_202409/include/CfgKinematicEvents.h diff --git a/j2735codec/core/202409/include/CfgLowSpeedCriteria.h b/j2735codec/core/j2735_202409/include/CfgLowSpeedCriteria.h similarity index 100% rename from j2735codec/core/202409/include/CfgLowSpeedCriteria.h rename to j2735codec/core/j2735_202409/include/CfgLowSpeedCriteria.h diff --git a/j2735codec/core/202409/include/CfgMsgDictionary.h b/j2735codec/core/j2735_202409/include/CfgMsgDictionary.h similarity index 100% rename from j2735codec/core/202409/include/CfgMsgDictionary.h rename to j2735codec/core/j2735_202409/include/CfgMsgDictionary.h diff --git a/j2735codec/core/202409/include/CfgMsgRecepIndicators.h b/j2735codec/core/j2735_202409/include/CfgMsgRecepIndicators.h similarity index 100% rename from j2735codec/core/202409/include/CfgMsgRecepIndicators.h rename to j2735codec/core/j2735_202409/include/CfgMsgRecepIndicators.h diff --git a/j2735codec/core/202409/include/CfgRoadSignInfo.h b/j2735codec/core/j2735_202409/include/CfgRoadSignInfo.h similarity index 100% rename from j2735codec/core/202409/include/CfgRoadSignInfo.h rename to j2735codec/core/j2735_202409/include/CfgRoadSignInfo.h diff --git a/j2735codec/core/202409/include/CfgRoadSignTypes.h b/j2735codec/core/j2735_202409/include/CfgRoadSignTypes.h similarity index 100% rename from j2735codec/core/202409/include/CfgRoadSignTypes.h rename to j2735codec/core/j2735_202409/include/CfgRoadSignTypes.h diff --git a/j2735codec/core/202409/include/CfgRoadwayEvents.h b/j2735codec/core/j2735_202409/include/CfgRoadwayEvents.h similarity index 100% rename from j2735codec/core/202409/include/CfgRoadwayEvents.h rename to j2735codec/core/j2735_202409/include/CfgRoadwayEvents.h diff --git a/j2735codec/core/202409/include/CfgStoppedCriteria.h b/j2735codec/core/j2735_202409/include/CfgStoppedCriteria.h similarity index 100% rename from j2735codec/core/202409/include/CfgStoppedCriteria.h rename to j2735codec/core/j2735_202409/include/CfgStoppedCriteria.h diff --git a/j2735codec/core/202409/include/CfgSummaryTriggers.h b/j2735codec/core/j2735_202409/include/CfgSummaryTriggers.h similarity index 100% rename from j2735codec/core/202409/include/CfgSummaryTriggers.h rename to j2735codec/core/j2735_202409/include/CfgSummaryTriggers.h diff --git a/j2735codec/core/202409/include/CfgTrafficSigEncounters.h b/j2735codec/core/j2735_202409/include/CfgTrafficSigEncounters.h similarity index 100% rename from j2735codec/core/202409/include/CfgTrafficSigEncounters.h rename to j2735codec/core/j2735_202409/include/CfgTrafficSigEncounters.h diff --git a/j2735codec/core/202409/include/CfgTransitVehicleData.h b/j2735codec/core/j2735_202409/include/CfgTransitVehicleData.h similarity index 100% rename from j2735codec/core/202409/include/CfgTransitVehicleData.h rename to j2735codec/core/j2735_202409/include/CfgTransitVehicleData.h diff --git a/j2735codec/core/202409/include/CfgVehicleClass.h b/j2735codec/core/j2735_202409/include/CfgVehicleClass.h similarity index 100% rename from j2735codec/core/202409/include/CfgVehicleClass.h rename to j2735codec/core/j2735_202409/include/CfgVehicleClass.h diff --git a/j2735codec/core/202409/include/CfgVehicleEvents.h b/j2735codec/core/j2735_202409/include/CfgVehicleEvents.h similarity index 100% rename from j2735codec/core/202409/include/CfgVehicleEvents.h rename to j2735codec/core/j2735_202409/include/CfgVehicleEvents.h diff --git a/j2735codec/core/202409/include/ChargeObjectId.h b/j2735codec/core/j2735_202409/include/ChargeObjectId.h similarity index 100% rename from j2735codec/core/202409/include/ChargeObjectId.h rename to j2735codec/core/j2735_202409/include/ChargeObjectId.h diff --git a/j2735codec/core/202409/include/ChargerInfo.h b/j2735codec/core/j2735_202409/include/ChargerInfo.h similarity index 100% rename from j2735codec/core/202409/include/ChargerInfo.h rename to j2735codec/core/j2735_202409/include/ChargerInfo.h diff --git a/j2735codec/core/202409/include/ChargesTable.h b/j2735codec/core/j2735_202409/include/ChargesTable.h similarity index 100% rename from j2735codec/core/202409/include/ChargesTable.h rename to j2735codec/core/j2735_202409/include/ChargesTable.h diff --git a/j2735codec/core/202409/include/ChargingAreaOrSegment.h b/j2735codec/core/j2735_202409/include/ChargingAreaOrSegment.h similarity index 100% rename from j2735codec/core/202409/include/ChargingAreaOrSegment.h rename to j2735codec/core/j2735_202409/include/ChargingAreaOrSegment.h diff --git a/j2735codec/core/202409/include/ChargingConfig.h b/j2735codec/core/j2735_202409/include/ChargingConfig.h similarity index 100% rename from j2735codec/core/202409/include/ChargingConfig.h rename to j2735codec/core/j2735_202409/include/ChargingConfig.h diff --git a/j2735codec/core/202409/include/ChargingFees.h b/j2735codec/core/j2735_202409/include/ChargingFees.h similarity index 100% rename from j2735codec/core/202409/include/ChargingFees.h rename to j2735codec/core/j2735_202409/include/ChargingFees.h diff --git a/j2735codec/core/202409/include/ChargingUnits.h b/j2735codec/core/j2735_202409/include/ChargingUnits.h similarity index 100% rename from j2735codec/core/202409/include/ChargingUnits.h rename to j2735codec/core/j2735_202409/include/ChargingUnits.h diff --git a/j2735codec/core/202409/include/Cinders.h b/j2735codec/core/j2735_202409/include/Cinders.h similarity index 100% rename from j2735codec/core/202409/include/Cinders.h rename to j2735codec/core/j2735_202409/include/Cinders.h diff --git a/j2735codec/core/202409/include/CindersType.h b/j2735codec/core/j2735_202409/include/CindersType.h similarity index 100% rename from j2735codec/core/202409/include/CindersType.h rename to j2735codec/core/j2735_202409/include/CindersType.h diff --git a/j2735codec/core/202409/include/Circle.h b/j2735codec/core/j2735_202409/include/Circle.h similarity index 100% rename from j2735codec/core/202409/include/Circle.h rename to j2735codec/core/j2735_202409/include/Circle.h diff --git a/j2735codec/core/202409/include/ClassificationConfidence.h b/j2735codec/core/j2735_202409/include/ClassificationConfidence.h similarity index 100% rename from j2735codec/core/202409/include/ClassificationConfidence.h rename to j2735codec/core/j2735_202409/include/ClassificationConfidence.h diff --git a/j2735codec/core/202409/include/ClosedNetworkChargesTable.h b/j2735codec/core/j2735_202409/include/ClosedNetworkChargesTable.h similarity index 100% rename from j2735codec/core/202409/include/ClosedNetworkChargesTable.h rename to j2735codec/core/j2735_202409/include/ClosedNetworkChargesTable.h diff --git a/j2735codec/core/202409/include/Closures.h b/j2735codec/core/j2735_202409/include/Closures.h similarity index 100% rename from j2735codec/core/202409/include/Closures.h rename to j2735codec/core/j2735_202409/include/Closures.h diff --git a/j2735codec/core/202409/include/CoarseHeading.h b/j2735codec/core/j2735_202409/include/CoarseHeading.h similarity index 100% rename from j2735codec/core/202409/include/CoarseHeading.h rename to j2735codec/core/j2735_202409/include/CoarseHeading.h diff --git a/j2735codec/core/202409/include/CodeWord.h b/j2735codec/core/j2735_202409/include/CodeWord.h similarity index 100% rename from j2735codec/core/202409/include/CodeWord.h rename to j2735codec/core/j2735_202409/include/CodeWord.h diff --git a/j2735codec/core/202409/include/CoefficientOfFriction.h b/j2735codec/core/j2735_202409/include/CoefficientOfFriction.h similarity index 100% rename from j2735codec/core/202409/include/CoefficientOfFriction.h rename to j2735codec/core/j2735_202409/include/CoefficientOfFriction.h diff --git a/j2735codec/core/202409/include/CommonContainer.h b/j2735codec/core/j2735_202409/include/CommonContainer.h similarity index 100% rename from j2735codec/core/202409/include/CommonContainer.h rename to j2735codec/core/j2735_202409/include/CommonContainer.h diff --git a/j2735codec/core/202409/include/CommonSafetyRequest.h b/j2735codec/core/j2735_202409/include/CommonSafetyRequest.h similarity index 100% rename from j2735codec/core/202409/include/CommonSafetyRequest.h rename to j2735codec/core/j2735_202409/include/CommonSafetyRequest.h diff --git a/j2735codec/core/202409/include/Common_Angle.h b/j2735codec/core/j2735_202409/include/Common_Angle.h similarity index 100% rename from j2735codec/core/202409/include/Common_Angle.h rename to j2735codec/core/j2735_202409/include/Common_Angle.h diff --git a/j2735codec/core/202409/include/Common_Duration.h b/j2735codec/core/j2735_202409/include/Common_Duration.h similarity index 100% rename from j2735codec/core/202409/include/Common_Duration.h rename to j2735codec/core/j2735_202409/include/Common_Duration.h diff --git a/j2735codec/core/202409/include/Common_Elevation.h b/j2735codec/core/j2735_202409/include/Common_Elevation.h similarity index 100% rename from j2735codec/core/202409/include/Common_Elevation.h rename to j2735codec/core/j2735_202409/include/Common_Elevation.h diff --git a/j2735codec/core/202409/include/Common_Latitude.h b/j2735codec/core/j2735_202409/include/Common_Latitude.h similarity index 100% rename from j2735codec/core/202409/include/Common_Latitude.h rename to j2735codec/core/j2735_202409/include/Common_Latitude.h diff --git a/j2735codec/core/202409/include/Common_Longitude.h b/j2735codec/core/j2735_202409/include/Common_Longitude.h similarity index 100% rename from j2735codec/core/202409/include/Common_Longitude.h rename to j2735codec/core/j2735_202409/include/Common_Longitude.h diff --git a/j2735codec/core/202409/include/Common_MeanVariation.h b/j2735codec/core/j2735_202409/include/Common_MeanVariation.h similarity index 100% rename from j2735codec/core/202409/include/Common_MeanVariation.h rename to j2735codec/core/j2735_202409/include/Common_MeanVariation.h diff --git a/j2735codec/core/202409/include/Common_MsgCount.h b/j2735codec/core/j2735_202409/include/Common_MsgCount.h similarity index 100% rename from j2735codec/core/202409/include/Common_MsgCount.h rename to j2735codec/core/j2735_202409/include/Common_MsgCount.h diff --git a/j2735codec/core/202409/include/ComputedLane.h b/j2735codec/core/j2735_202409/include/ComputedLane.h similarity index 100% rename from j2735codec/core/202409/include/ComputedLane.h rename to j2735codec/core/j2735_202409/include/ComputedLane.h diff --git a/j2735codec/core/202409/include/Confidence.h b/j2735codec/core/j2735_202409/include/Confidence.h similarity index 100% rename from j2735codec/core/202409/include/Confidence.h rename to j2735codec/core/j2735_202409/include/Confidence.h diff --git a/j2735codec/core/202409/include/ConfidenceSet.h b/j2735codec/core/j2735_202409/include/ConfidenceSet.h similarity index 100% rename from j2735codec/core/202409/include/ConfidenceSet.h rename to j2735codec/core/j2735_202409/include/ConfidenceSet.h diff --git a/j2735codec/core/202409/include/ConfigBoundary.h b/j2735codec/core/j2735_202409/include/ConfigBoundary.h similarity index 100% rename from j2735codec/core/202409/include/ConfigBoundary.h rename to j2735codec/core/j2735_202409/include/ConfigBoundary.h diff --git a/j2735codec/core/202409/include/ConfigDescriptor.h b/j2735codec/core/j2735_202409/include/ConfigDescriptor.h similarity index 100% rename from j2735codec/core/202409/include/ConfigDescriptor.h rename to j2735codec/core/j2735_202409/include/ConfigDescriptor.h diff --git a/j2735codec/core/202409/include/ConfigId.h b/j2735codec/core/j2735_202409/include/ConfigId.h similarity index 100% rename from j2735codec/core/202409/include/ConfigId.h rename to j2735codec/core/j2735_202409/include/ConfigId.h diff --git a/j2735codec/core/202409/include/ConfigInfo.h b/j2735codec/core/j2735_202409/include/ConfigInfo.h similarity index 100% rename from j2735codec/core/202409/include/ConfigInfo.h rename to j2735codec/core/j2735_202409/include/ConfigInfo.h diff --git a/j2735codec/core/202409/include/ConfigTemporalBoundary.h b/j2735codec/core/j2735_202409/include/ConfigTemporalBoundary.h similarity index 100% rename from j2735codec/core/202409/include/ConfigTemporalBoundary.h rename to j2735codec/core/j2735_202409/include/ConfigTemporalBoundary.h diff --git a/j2735codec/core/202409/include/ConfigTriggers.h b/j2735codec/core/j2735_202409/include/ConfigTriggers.h similarity index 100% rename from j2735codec/core/202409/include/ConfigTriggers.h rename to j2735codec/core/j2735_202409/include/ConfigTriggers.h diff --git a/j2735codec/core/202409/include/ConnectingLane.h b/j2735codec/core/j2735_202409/include/ConnectingLane.h similarity index 100% rename from j2735codec/core/202409/include/ConnectingLane.h rename to j2735codec/core/j2735_202409/include/ConnectingLane.h diff --git a/j2735codec/core/202409/include/Connection.h b/j2735codec/core/j2735_202409/include/Connection.h similarity index 100% rename from j2735codec/core/202409/include/Connection.h rename to j2735codec/core/j2735_202409/include/Connection.h diff --git a/j2735codec/core/202409/include/ConnectionManeuverAssist-addGrpC.h b/j2735codec/core/j2735_202409/include/ConnectionManeuverAssist-addGrpC.h similarity index 100% rename from j2735codec/core/202409/include/ConnectionManeuverAssist-addGrpC.h rename to j2735codec/core/j2735_202409/include/ConnectionManeuverAssist-addGrpC.h diff --git a/j2735codec/core/202409/include/ConnectionManeuverAssist.h b/j2735codec/core/j2735_202409/include/ConnectionManeuverAssist.h similarity index 100% rename from j2735codec/core/202409/include/ConnectionManeuverAssist.h rename to j2735codec/core/j2735_202409/include/ConnectionManeuverAssist.h diff --git a/j2735codec/core/202409/include/ConnectsToList.h b/j2735codec/core/j2735_202409/include/ConnectsToList.h similarity index 100% rename from j2735codec/core/202409/include/ConnectsToList.h rename to j2735codec/core/j2735_202409/include/ConnectsToList.h diff --git a/j2735codec/core/202409/include/ConsecutiveTrafficLight.h b/j2735codec/core/j2735_202409/include/ConsecutiveTrafficLight.h similarity index 100% rename from j2735codec/core/202409/include/ConsecutiveTrafficLight.h rename to j2735codec/core/j2735_202409/include/ConsecutiveTrafficLight.h diff --git a/j2735codec/core/202409/include/ContentContainer.h b/j2735codec/core/j2735_202409/include/ContentContainer.h similarity index 100% rename from j2735codec/core/202409/include/ContentContainer.h rename to j2735codec/core/j2735_202409/include/ContentContainer.h diff --git a/j2735codec/core/202409/include/ContractAuthenticator.h b/j2735codec/core/j2735_202409/include/ContractAuthenticator.h similarity index 100% rename from j2735codec/core/202409/include/ContractAuthenticator.h rename to j2735codec/core/j2735_202409/include/ContractAuthenticator.h diff --git a/j2735codec/core/202409/include/ContractSerialNumber.h b/j2735codec/core/j2735_202409/include/ContractSerialNumber.h similarity index 100% rename from j2735codec/core/202409/include/ContractSerialNumber.h rename to j2735codec/core/j2735_202409/include/ContractSerialNumber.h diff --git a/j2735codec/core/202409/include/ContractValidity.h b/j2735codec/core/j2735_202409/include/ContractValidity.h similarity index 100% rename from j2735codec/core/202409/include/ContractValidity.h rename to j2735codec/core/j2735_202409/include/ContractValidity.h diff --git a/j2735codec/core/202409/include/CooperativeControlMessage.h b/j2735codec/core/j2735_202409/include/CooperativeControlMessage.h similarity index 100% rename from j2735codec/core/202409/include/CooperativeControlMessage.h rename to j2735codec/core/j2735_202409/include/CooperativeControlMessage.h diff --git a/j2735codec/core/202409/include/CooperativeControlMessage_ManeuverID.h b/j2735codec/core/j2735_202409/include/CooperativeControlMessage_ManeuverID.h similarity index 100% rename from j2735codec/core/202409/include/CooperativeControlMessage_ManeuverID.h rename to j2735codec/core/j2735_202409/include/CooperativeControlMessage_ManeuverID.h diff --git a/j2735codec/core/202409/include/CooperativeControlMessage_PartII-Id.h b/j2735codec/core/j2735_202409/include/CooperativeControlMessage_PartII-Id.h similarity index 100% rename from j2735codec/core/202409/include/CooperativeControlMessage_PartII-Id.h rename to j2735codec/core/j2735_202409/include/CooperativeControlMessage_PartII-Id.h diff --git a/j2735codec/core/202409/include/CooperativeControlMessage_PitchRate.h b/j2735codec/core/j2735_202409/include/CooperativeControlMessage_PitchRate.h similarity index 100% rename from j2735codec/core/202409/include/CooperativeControlMessage_PitchRate.h rename to j2735codec/core/j2735_202409/include/CooperativeControlMessage_PitchRate.h diff --git a/j2735codec/core/202409/include/CooperativeControlMessage_RollRate.h b/j2735codec/core/j2735_202409/include/CooperativeControlMessage_RollRate.h similarity index 100% rename from j2735codec/core/202409/include/CooperativeControlMessage_RollRate.h rename to j2735codec/core/j2735_202409/include/CooperativeControlMessage_RollRate.h diff --git a/j2735codec/core/202409/include/CopValue.h b/j2735codec/core/j2735_202409/include/CopValue.h similarity index 100% rename from j2735codec/core/202409/include/CopValue.h rename to j2735codec/core/j2735_202409/include/CopValue.h diff --git a/j2735codec/core/202409/include/Count.h b/j2735codec/core/j2735_202409/include/Count.h similarity index 100% rename from j2735codec/core/202409/include/Count.h rename to j2735codec/core/j2735_202409/include/Count.h diff --git a/j2735codec/core/202409/include/CountryCode.h b/j2735codec/core/j2735_202409/include/CountryCode.h similarity index 100% rename from j2735codec/core/202409/include/CountryCode.h rename to j2735codec/core/j2735_202409/include/CountryCode.h diff --git a/j2735codec/core/202409/include/CrossLinking.h b/j2735codec/core/j2735_202409/include/CrossLinking.h similarity index 100% rename from j2735codec/core/202409/include/CrossLinking.h rename to j2735codec/core/j2735_202409/include/CrossLinking.h diff --git a/j2735codec/core/202409/include/CurrentStateData.h b/j2735codec/core/j2735_202409/include/CurrentStateData.h similarity index 100% rename from j2735codec/core/202409/include/CurrentStateData.h rename to j2735codec/core/j2735_202409/include/CurrentStateData.h diff --git a/j2735codec/core/202409/include/CurveContainer.h b/j2735codec/core/j2735_202409/include/CurveContainer.h similarity index 100% rename from j2735codec/core/202409/include/CurveContainer.h rename to j2735codec/core/j2735_202409/include/CurveContainer.h diff --git a/j2735codec/core/202409/include/DDate.h b/j2735codec/core/j2735_202409/include/DDate.h similarity index 100% rename from j2735codec/core/202409/include/DDate.h rename to j2735codec/core/j2735_202409/include/DDate.h diff --git a/j2735codec/core/202409/include/DDateTime.h b/j2735codec/core/j2735_202409/include/DDateTime.h similarity index 100% rename from j2735codec/core/202409/include/DDateTime.h rename to j2735codec/core/j2735_202409/include/DDateTime.h diff --git a/j2735codec/core/202409/include/DDay.h b/j2735codec/core/j2735_202409/include/DDay.h similarity index 100% rename from j2735codec/core/202409/include/DDay.h rename to j2735codec/core/j2735_202409/include/DDay.h diff --git a/j2735codec/core/202409/include/DFullTime.h b/j2735codec/core/j2735_202409/include/DFullTime.h similarity index 100% rename from j2735codec/core/202409/include/DFullTime.h rename to j2735codec/core/j2735_202409/include/DFullTime.h diff --git a/j2735codec/core/202409/include/DHour.h b/j2735codec/core/j2735_202409/include/DHour.h similarity index 100% rename from j2735codec/core/202409/include/DHour.h rename to j2735codec/core/j2735_202409/include/DHour.h diff --git a/j2735codec/core/202409/include/DMinute.h b/j2735codec/core/j2735_202409/include/DMinute.h similarity index 100% rename from j2735codec/core/202409/include/DMinute.h rename to j2735codec/core/j2735_202409/include/DMinute.h diff --git a/j2735codec/core/202409/include/DMonth.h b/j2735codec/core/j2735_202409/include/DMonth.h similarity index 100% rename from j2735codec/core/202409/include/DMonth.h rename to j2735codec/core/j2735_202409/include/DMonth.h diff --git a/j2735codec/core/202409/include/DMonthDay.h b/j2735codec/core/j2735_202409/include/DMonthDay.h similarity index 100% rename from j2735codec/core/202409/include/DMonthDay.h rename to j2735codec/core/j2735_202409/include/DMonthDay.h diff --git a/j2735codec/core/202409/include/DOffset.h b/j2735codec/core/j2735_202409/include/DOffset.h similarity index 100% rename from j2735codec/core/202409/include/DOffset.h rename to j2735codec/core/j2735_202409/include/DOffset.h diff --git a/j2735codec/core/202409/include/DSRCmsgID.h b/j2735codec/core/j2735_202409/include/DSRCmsgID.h similarity index 100% rename from j2735codec/core/202409/include/DSRCmsgID.h rename to j2735codec/core/j2735_202409/include/DSRCmsgID.h diff --git a/j2735codec/core/202409/include/DSecond.h b/j2735codec/core/j2735_202409/include/DSecond.h similarity index 100% rename from j2735codec/core/202409/include/DSecond.h rename to j2735codec/core/j2735_202409/include/DSecond.h diff --git a/j2735codec/core/202409/include/DTime.h b/j2735codec/core/j2735_202409/include/DTime.h similarity index 100% rename from j2735codec/core/202409/include/DTime.h rename to j2735codec/core/j2735_202409/include/DTime.h diff --git a/j2735codec/core/202409/include/DYear.h b/j2735codec/core/j2735_202409/include/DYear.h similarity index 100% rename from j2735codec/core/202409/include/DYear.h rename to j2735codec/core/j2735_202409/include/DYear.h diff --git a/j2735codec/core/202409/include/DYearMonth.h b/j2735codec/core/j2735_202409/include/DYearMonth.h similarity index 100% rename from j2735codec/core/202409/include/DYearMonth.h rename to j2735codec/core/j2735_202409/include/DYearMonth.h diff --git a/j2735codec/core/202409/include/DataParameters.h b/j2735codec/core/j2735_202409/include/DataParameters.h similarity index 100% rename from j2735codec/core/202409/include/DataParameters.h rename to j2735codec/core/j2735_202409/include/DataParameters.h diff --git a/j2735codec/core/202409/include/DataSourceInfo.h b/j2735codec/core/j2735_202409/include/DataSourceInfo.h similarity index 100% rename from j2735codec/core/202409/include/DataSourceInfo.h rename to j2735codec/core/j2735_202409/include/DataSourceInfo.h diff --git a/j2735codec/core/202409/include/DateAndTime.h b/j2735codec/core/j2735_202409/include/DateAndTime.h similarity index 100% rename from j2735codec/core/202409/include/DateAndTime.h rename to j2735codec/core/j2735_202409/include/DateAndTime.h diff --git a/j2735codec/core/202409/include/DateCompact.h b/j2735codec/core/j2735_202409/include/DateCompact.h similarity index 100% rename from j2735codec/core/202409/include/DateCompact.h rename to j2735codec/core/j2735_202409/include/DateCompact.h diff --git a/j2735codec/core/202409/include/Day.h b/j2735codec/core/j2735_202409/include/Day.h similarity index 100% rename from j2735codec/core/202409/include/Day.h rename to j2735codec/core/j2735_202409/include/Day.h diff --git a/j2735codec/core/202409/include/DayOfWeek.h b/j2735codec/core/j2735_202409/include/DayOfWeek.h similarity index 100% rename from j2735codec/core/202409/include/DayOfWeek.h rename to j2735codec/core/j2735_202409/include/DayOfWeek.h diff --git a/j2735codec/core/202409/include/DegreesLat.h b/j2735codec/core/j2735_202409/include/DegreesLat.h similarity index 100% rename from j2735codec/core/202409/include/DegreesLat.h rename to j2735codec/core/j2735_202409/include/DegreesLat.h diff --git a/j2735codec/core/202409/include/DegreesLong.h b/j2735codec/core/j2735_202409/include/DegreesLong.h similarity index 100% rename from j2735codec/core/202409/include/DegreesLong.h rename to j2735codec/core/j2735_202409/include/DegreesLong.h diff --git a/j2735codec/core/202409/include/DelayStatusCancellation.h b/j2735codec/core/j2735_202409/include/DelayStatusCancellation.h similarity index 100% rename from j2735codec/core/202409/include/DelayStatusCancellation.h rename to j2735codec/core/j2735_202409/include/DelayStatusCancellation.h diff --git a/j2735codec/core/202409/include/DeltaAngle.h b/j2735codec/core/j2735_202409/include/DeltaAngle.h similarity index 100% rename from j2735codec/core/202409/include/DeltaAngle.h rename to j2735codec/core/j2735_202409/include/DeltaAngle.h diff --git a/j2735codec/core/202409/include/DeltaTime.h b/j2735codec/core/j2735_202409/include/DeltaTime.h similarity index 100% rename from j2735codec/core/202409/include/DeltaTime.h rename to j2735codec/core/j2735_202409/include/DeltaTime.h diff --git a/j2735codec/core/202409/include/DescriptionOfRoadSurface.h b/j2735codec/core/j2735_202409/include/DescriptionOfRoadSurface.h similarity index 100% rename from j2735codec/core/202409/include/DescriptionOfRoadSurface.h rename to j2735codec/core/j2735_202409/include/DescriptionOfRoadSurface.h diff --git a/j2735codec/core/202409/include/DescriptiveCharacteristics.h b/j2735codec/core/j2735_202409/include/DescriptiveCharacteristics.h similarity index 100% rename from j2735codec/core/202409/include/DescriptiveCharacteristics.h rename to j2735codec/core/j2735_202409/include/DescriptiveCharacteristics.h diff --git a/j2735codec/core/202409/include/DescriptiveName.h b/j2735codec/core/j2735_202409/include/DescriptiveName.h similarity index 100% rename from j2735codec/core/202409/include/DescriptiveName.h rename to j2735codec/core/j2735_202409/include/DescriptiveName.h diff --git a/j2735codec/core/202409/include/DetectedChargeObject.h b/j2735codec/core/j2735_202409/include/DetectedChargeObject.h similarity index 100% rename from j2735codec/core/202409/include/DetectedChargeObject.h rename to j2735codec/core/j2735_202409/include/DetectedChargeObject.h diff --git a/j2735codec/core/202409/include/DetectedObjectCommonData.h b/j2735codec/core/j2735_202409/include/DetectedObjectCommonData.h similarity index 100% rename from j2735codec/core/202409/include/DetectedObjectCommonData.h rename to j2735codec/core/j2735_202409/include/DetectedObjectCommonData.h diff --git a/j2735codec/core/202409/include/DetectedObjectData.h b/j2735codec/core/j2735_202409/include/DetectedObjectData.h similarity index 100% rename from j2735codec/core/202409/include/DetectedObjectData.h rename to j2735codec/core/j2735_202409/include/DetectedObjectData.h diff --git a/j2735codec/core/202409/include/DetectedObjectList.h b/j2735codec/core/j2735_202409/include/DetectedObjectList.h similarity index 100% rename from j2735codec/core/202409/include/DetectedObjectList.h rename to j2735codec/core/j2735_202409/include/DetectedObjectList.h diff --git a/j2735codec/core/202409/include/DetectedObjectOptionalData.h b/j2735codec/core/j2735_202409/include/DetectedObjectOptionalData.h similarity index 100% rename from j2735codec/core/202409/include/DetectedObjectOptionalData.h rename to j2735codec/core/j2735_202409/include/DetectedObjectOptionalData.h diff --git a/j2735codec/core/202409/include/DetectedObstacleData.h b/j2735codec/core/j2735_202409/include/DetectedObstacleData.h similarity index 100% rename from j2735codec/core/202409/include/DetectedObstacleData.h rename to j2735codec/core/j2735_202409/include/DetectedObstacleData.h diff --git a/j2735codec/core/202409/include/DetectedVRUData.h b/j2735codec/core/j2735_202409/include/DetectedVRUData.h similarity index 100% rename from j2735codec/core/202409/include/DetectedVRUData.h rename to j2735codec/core/j2735_202409/include/DetectedVRUData.h diff --git a/j2735codec/core/202409/include/DetectedVehicleData.h b/j2735codec/core/j2735_202409/include/DetectedVehicleData.h similarity index 100% rename from j2735codec/core/202409/include/DetectedVehicleData.h rename to j2735codec/core/j2735_202409/include/DetectedVehicleData.h diff --git a/j2735codec/core/202409/include/DetectionMode.h b/j2735codec/core/j2735_202409/include/DetectionMode.h similarity index 100% rename from j2735codec/core/202409/include/DetectionMode.h rename to j2735codec/core/j2735_202409/include/DetectionMode.h diff --git a/j2735codec/core/202409/include/DeviceStatus.h b/j2735codec/core/j2735_202409/include/DeviceStatus.h similarity index 100% rename from j2735codec/core/202409/include/DeviceStatus.h rename to j2735codec/core/j2735_202409/include/DeviceStatus.h diff --git a/j2735codec/core/202409/include/DewPointTempMeasurementStdDev.h b/j2735codec/core/j2735_202409/include/DewPointTempMeasurementStdDev.h similarity index 100% rename from j2735codec/core/202409/include/DewPointTempMeasurementStdDev.h rename to j2735codec/core/j2735_202409/include/DewPointTempMeasurementStdDev.h diff --git a/j2735codec/core/202409/include/DieselEmissionValues.h b/j2735codec/core/j2735_202409/include/DieselEmissionValues.h similarity index 100% rename from j2735codec/core/202409/include/DieselEmissionValues.h rename to j2735codec/core/j2735_202409/include/DieselEmissionValues.h diff --git a/j2735codec/core/202409/include/DirectionOfUse.h b/j2735codec/core/j2735_202409/include/DirectionOfUse.h similarity index 100% rename from j2735codec/core/202409/include/DirectionOfUse.h rename to j2735codec/core/j2735_202409/include/DirectionOfUse.h diff --git a/j2735codec/core/202409/include/DisabledVehicle.h b/j2735codec/core/j2735_202409/include/DisabledVehicle.h similarity index 100% rename from j2735codec/core/202409/include/DisabledVehicle.h rename to j2735codec/core/j2735_202409/include/DisabledVehicle.h diff --git a/j2735codec/core/202409/include/Disasters.h b/j2735codec/core/j2735_202409/include/Disasters.h similarity index 100% rename from j2735codec/core/202409/include/Disasters.h rename to j2735codec/core/j2735_202409/include/Disasters.h diff --git a/j2735codec/core/202409/include/Distance.h b/j2735codec/core/j2735_202409/include/Distance.h similarity index 100% rename from j2735codec/core/202409/include/Distance.h rename to j2735codec/core/j2735_202409/include/Distance.h diff --git a/j2735codec/core/202409/include/DistanceUnit.h b/j2735codec/core/j2735_202409/include/DistanceUnit.h similarity index 100% rename from j2735codec/core/202409/include/DistanceUnit.h rename to j2735codec/core/j2735_202409/include/DistanceUnit.h diff --git a/j2735codec/core/202409/include/DistanceUnits.h b/j2735codec/core/j2735_202409/include/DistanceUnits.h similarity index 100% rename from j2735codec/core/202409/include/DistanceUnits.h rename to j2735codec/core/j2735_202409/include/DistanceUnits.h diff --git a/j2735codec/core/202409/include/Disturbances.h b/j2735codec/core/j2735_202409/include/Disturbances.h similarity index 100% rename from j2735codec/core/202409/include/Disturbances.h rename to j2735codec/core/j2735_202409/include/Disturbances.h diff --git a/j2735codec/core/202409/include/DriveAxleLiftAirPressure.h b/j2735codec/core/j2735_202409/include/DriveAxleLiftAirPressure.h similarity index 100% rename from j2735codec/core/202409/include/DriveAxleLiftAirPressure.h rename to j2735codec/core/j2735_202409/include/DriveAxleLiftAirPressure.h diff --git a/j2735codec/core/202409/include/DriveAxleLocation.h b/j2735codec/core/j2735_202409/include/DriveAxleLocation.h similarity index 100% rename from j2735codec/core/202409/include/DriveAxleLocation.h rename to j2735codec/core/j2735_202409/include/DriveAxleLocation.h diff --git a/j2735codec/core/202409/include/DriveAxleLubePressure.h b/j2735codec/core/j2735_202409/include/DriveAxleLubePressure.h similarity index 100% rename from j2735codec/core/202409/include/DriveAxleLubePressure.h rename to j2735codec/core/j2735_202409/include/DriveAxleLubePressure.h diff --git a/j2735codec/core/202409/include/DriveAxleTemperature.h b/j2735codec/core/j2735_202409/include/DriveAxleTemperature.h similarity index 100% rename from j2735codec/core/202409/include/DriveAxleTemperature.h rename to j2735codec/core/j2735_202409/include/DriveAxleTemperature.h diff --git a/j2735codec/core/202409/include/Driven.h b/j2735codec/core/j2735_202409/include/Driven.h similarity index 100% rename from j2735codec/core/202409/include/Driven.h rename to j2735codec/core/j2735_202409/include/Driven.h diff --git a/j2735codec/core/202409/include/DrivenLineOffsetLg.h b/j2735codec/core/j2735_202409/include/DrivenLineOffsetLg.h similarity index 100% rename from j2735codec/core/202409/include/DrivenLineOffsetLg.h rename to j2735codec/core/j2735_202409/include/DrivenLineOffsetLg.h diff --git a/j2735codec/core/202409/include/DrivenLineOffsetSm.h b/j2735codec/core/j2735_202409/include/DrivenLineOffsetSm.h similarity index 100% rename from j2735codec/core/202409/include/DrivenLineOffsetSm.h rename to j2735codec/core/j2735_202409/include/DrivenLineOffsetSm.h diff --git a/j2735codec/core/202409/include/DriverCharacteristics.h b/j2735codec/core/j2735_202409/include/DriverCharacteristics.h similarity index 100% rename from j2735codec/core/202409/include/DriverCharacteristics.h rename to j2735codec/core/j2735_202409/include/DriverCharacteristics.h diff --git a/j2735codec/core/202409/include/DrivingWheelAngle.h b/j2735codec/core/j2735_202409/include/DrivingWheelAngle.h similarity index 100% rename from j2735codec/core/202409/include/DrivingWheelAngle.h rename to j2735codec/core/j2735_202409/include/DrivingWheelAngle.h diff --git a/j2735codec/core/202409/include/DynamicInfoContainer.h b/j2735codec/core/j2735_202409/include/DynamicInfoContainer.h similarity index 100% rename from j2735codec/core/202409/include/DynamicInfoContainer.h rename to j2735codec/core/j2735_202409/include/DynamicInfoContainer.h diff --git a/j2735codec/core/202409/include/ENUMERATED.h b/j2735codec/core/j2735_202409/include/ENUMERATED.h similarity index 100% rename from j2735codec/core/202409/include/ENUMERATED.h rename to j2735codec/core/j2735_202409/include/ENUMERATED.h diff --git a/j2735codec/core/202409/include/EXTERNAL.h b/j2735codec/core/j2735_202409/include/EXTERNAL.h similarity index 100% rename from j2735codec/core/202409/include/EXTERNAL.h rename to j2735codec/core/j2735_202409/include/EXTERNAL.h diff --git a/j2735codec/core/202409/include/EfcContextMark.h b/j2735codec/core/j2735_202409/include/EfcContextMark.h similarity index 100% rename from j2735codec/core/202409/include/EfcContextMark.h rename to j2735codec/core/j2735_202409/include/EfcContextMark.h diff --git a/j2735codec/core/202409/include/EfcDataDictionary_Altitude.h b/j2735codec/core/j2735_202409/include/EfcDataDictionary_Altitude.h similarity index 100% rename from j2735codec/core/202409/include/EfcDataDictionary_Altitude.h rename to j2735codec/core/j2735_202409/include/EfcDataDictionary_Altitude.h diff --git a/j2735codec/core/202409/include/EfcDataDictionary_Duration.h b/j2735codec/core/j2735_202409/include/EfcDataDictionary_Duration.h similarity index 100% rename from j2735codec/core/202409/include/EfcDataDictionary_Duration.h rename to j2735codec/core/j2735_202409/include/EfcDataDictionary_Duration.h diff --git a/j2735codec/core/202409/include/EfcDataDictionary_Latitude.h b/j2735codec/core/j2735_202409/include/EfcDataDictionary_Latitude.h similarity index 100% rename from j2735codec/core/202409/include/EfcDataDictionary_Latitude.h rename to j2735codec/core/j2735_202409/include/EfcDataDictionary_Latitude.h diff --git a/j2735codec/core/202409/include/EfcDataDictionary_Longitude.h b/j2735codec/core/j2735_202409/include/EfcDataDictionary_Longitude.h similarity index 100% rename from j2735codec/core/202409/include/EfcDataDictionary_Longitude.h rename to j2735codec/core/j2735_202409/include/EfcDataDictionary_Longitude.h diff --git a/j2735codec/core/202409/include/EfcTime.h b/j2735codec/core/j2735_202409/include/EfcTime.h similarity index 100% rename from j2735codec/core/202409/include/EfcTime.h rename to j2735codec/core/j2735_202409/include/EfcTime.h diff --git a/j2735codec/core/202409/include/ElevOffset.h b/j2735codec/core/j2735_202409/include/ElevOffset.h similarity index 100% rename from j2735codec/core/202409/include/ElevOffset.h rename to j2735codec/core/j2735_202409/include/ElevOffset.h diff --git a/j2735codec/core/202409/include/ElevationConfidence.h b/j2735codec/core/j2735_202409/include/ElevationConfidence.h similarity index 100% rename from j2735codec/core/202409/include/ElevationConfidence.h rename to j2735codec/core/j2735_202409/include/ElevationConfidence.h diff --git a/j2735codec/core/202409/include/EmergencyDetails.h b/j2735codec/core/j2735_202409/include/EmergencyDetails.h similarity index 100% rename from j2735codec/core/202409/include/EmergencyDetails.h rename to j2735codec/core/j2735_202409/include/EmergencyDetails.h diff --git a/j2735codec/core/202409/include/EmergencyVehicleAlert.h b/j2735codec/core/j2735_202409/include/EmergencyVehicleAlert.h similarity index 100% rename from j2735codec/core/202409/include/EmergencyVehicleAlert.h rename to j2735codec/core/j2735_202409/include/EmergencyVehicleAlert.h diff --git a/j2735codec/core/202409/include/EmissionType.h b/j2735codec/core/j2735_202409/include/EmissionType.h similarity index 100% rename from j2735codec/core/202409/include/EmissionType.h rename to j2735codec/core/j2735_202409/include/EmissionType.h diff --git a/j2735codec/core/202409/include/EmissionUnit.h b/j2735codec/core/j2735_202409/include/EmissionUnit.h similarity index 100% rename from j2735codec/core/202409/include/EmissionUnit.h rename to j2735codec/core/j2735_202409/include/EmissionUnit.h diff --git a/j2735codec/core/202409/include/EnabledLaneList.h b/j2735codec/core/j2735_202409/include/EnabledLaneList.h similarity index 100% rename from j2735codec/core/202409/include/EnabledLaneList.h rename to j2735codec/core/j2735_202409/include/EnabledLaneList.h diff --git a/j2735codec/core/202409/include/EncryptedTumData.h b/j2735codec/core/j2735_202409/include/EncryptedTumData.h similarity index 100% rename from j2735codec/core/202409/include/EncryptedTumData.h rename to j2735codec/core/j2735_202409/include/EncryptedTumData.h diff --git a/j2735codec/core/202409/include/EngineCharacteristics.h b/j2735codec/core/j2735_202409/include/EngineCharacteristics.h similarity index 100% rename from j2735codec/core/202409/include/EngineCharacteristics.h rename to j2735codec/core/j2735_202409/include/EngineCharacteristics.h diff --git a/j2735codec/core/202409/include/EngineDetails.h b/j2735codec/core/j2735_202409/include/EngineDetails.h similarity index 100% rename from j2735codec/core/202409/include/EngineDetails.h rename to j2735codec/core/j2735_202409/include/EngineDetails.h diff --git a/j2735codec/core/202409/include/EntryChargesTable.h b/j2735codec/core/j2735_202409/include/EntryChargesTable.h similarity index 100% rename from j2735codec/core/202409/include/EntryChargesTable.h rename to j2735codec/core/j2735_202409/include/EntryChargesTable.h diff --git a/j2735codec/core/202409/include/EnvironmentalCharacteristics.h b/j2735codec/core/j2735_202409/include/EnvironmentalCharacteristics.h similarity index 100% rename from j2735codec/core/202409/include/EnvironmentalCharacteristics.h rename to j2735codec/core/j2735_202409/include/EnvironmentalCharacteristics.h diff --git a/j2735codec/core/202409/include/EquipmentIccId.h b/j2735codec/core/j2735_202409/include/EquipmentIccId.h similarity index 100% rename from j2735codec/core/202409/include/EquipmentIccId.h rename to j2735codec/core/j2735_202409/include/EquipmentIccId.h diff --git a/j2735codec/core/202409/include/EquipmentObuId.h b/j2735codec/core/j2735_202409/include/EquipmentObuId.h similarity index 100% rename from j2735codec/core/202409/include/EquipmentObuId.h rename to j2735codec/core/j2735_202409/include/EquipmentObuId.h diff --git a/j2735codec/core/202409/include/EquipmentStatus.h b/j2735codec/core/j2735_202409/include/EquipmentStatus.h similarity index 100% rename from j2735codec/core/202409/include/EquipmentStatus.h rename to j2735codec/core/j2735_202409/include/EquipmentStatus.h diff --git a/j2735codec/core/202409/include/EquipmentType.h b/j2735codec/core/j2735_202409/include/EquipmentType.h similarity index 100% rename from j2735codec/core/202409/include/EquipmentType.h rename to j2735codec/core/j2735_202409/include/EquipmentType.h diff --git a/j2735codec/core/202409/include/EssMobileFriction.h b/j2735codec/core/j2735_202409/include/EssMobileFriction.h similarity index 100% rename from j2735codec/core/202409/include/EssMobileFriction.h rename to j2735codec/core/j2735_202409/include/EssMobileFriction.h diff --git a/j2735codec/core/202409/include/EssPrecipRate.h b/j2735codec/core/j2735_202409/include/EssPrecipRate.h similarity index 100% rename from j2735codec/core/202409/include/EssPrecipRate.h rename to j2735codec/core/j2735_202409/include/EssPrecipRate.h diff --git a/j2735codec/core/202409/include/EssPrecipSituation.h b/j2735codec/core/j2735_202409/include/EssPrecipSituation.h similarity index 100% rename from j2735codec/core/202409/include/EssPrecipSituation.h rename to j2735codec/core/j2735_202409/include/EssPrecipSituation.h diff --git a/j2735codec/core/202409/include/EssPrecipYesNo.h b/j2735codec/core/j2735_202409/include/EssPrecipYesNo.h similarity index 100% rename from j2735codec/core/202409/include/EssPrecipYesNo.h rename to j2735codec/core/j2735_202409/include/EssPrecipYesNo.h diff --git a/j2735codec/core/202409/include/EssSolarRadiation.h b/j2735codec/core/j2735_202409/include/EssSolarRadiation.h similarity index 100% rename from j2735codec/core/202409/include/EssSolarRadiation.h rename to j2735codec/core/j2735_202409/include/EssSolarRadiation.h diff --git a/j2735codec/core/202409/include/EuroValue.h b/j2735codec/core/j2735_202409/include/EuroValue.h similarity index 100% rename from j2735codec/core/202409/include/EuroValue.h rename to j2735codec/core/j2735_202409/include/EuroValue.h diff --git a/j2735codec/core/202409/include/EventDescription.h b/j2735codec/core/j2735_202409/include/EventDescription.h similarity index 100% rename from j2735codec/core/202409/include/EventDescription.h rename to j2735codec/core/j2735_202409/include/EventDescription.h diff --git a/j2735codec/core/202409/include/EventIdentifier.h b/j2735codec/core/j2735_202409/include/EventIdentifier.h similarity index 100% rename from j2735codec/core/202409/include/EventIdentifier.h rename to j2735codec/core/j2735_202409/include/EventIdentifier.h diff --git a/j2735codec/core/202409/include/EventInfo.h b/j2735codec/core/j2735_202409/include/EventInfo.h similarity index 100% rename from j2735codec/core/202409/include/EventInfo.h rename to j2735codec/core/j2735_202409/include/EventInfo.h diff --git a/j2735codec/core/202409/include/EventRecurrence.h b/j2735codec/core/j2735_202409/include/EventRecurrence.h similarity index 100% rename from j2735codec/core/202409/include/EventRecurrence.h rename to j2735codec/core/j2735_202409/include/EventRecurrence.h diff --git a/j2735codec/core/202409/include/ExhaustEmissionValues.h b/j2735codec/core/j2735_202409/include/ExhaustEmissionValues.h similarity index 100% rename from j2735codec/core/202409/include/ExhaustEmissionValues.h rename to j2735codec/core/j2735_202409/include/ExhaustEmissionValues.h diff --git a/j2735codec/core/202409/include/ExitChargesTable.h b/j2735codec/core/j2735_202409/include/ExitChargesTable.h similarity index 100% rename from j2735codec/core/202409/include/ExitChargesTable.h rename to j2735codec/core/j2735_202409/include/ExitChargesTable.h diff --git a/j2735codec/core/202409/include/ExitInfo.h b/j2735codec/core/j2735_202409/include/ExitInfo.h similarity index 100% rename from j2735codec/core/202409/include/ExitInfo.h rename to j2735codec/core/j2735_202409/include/ExitInfo.h diff --git a/j2735codec/core/202409/include/ExitService.h b/j2735codec/core/j2735_202409/include/ExitService.h similarity index 100% rename from j2735codec/core/202409/include/ExitService.h rename to j2735codec/core/j2735_202409/include/ExitService.h diff --git a/j2735codec/core/202409/include/Extent.h b/j2735codec/core/j2735_202409/include/Extent.h similarity index 100% rename from j2735codec/core/202409/include/Extent.h rename to j2735codec/core/j2735_202409/include/Extent.h diff --git a/j2735codec/core/202409/include/ExteriorLights.h b/j2735codec/core/j2735_202409/include/ExteriorLights.h similarity index 100% rename from j2735codec/core/202409/include/ExteriorLights.h rename to j2735codec/core/j2735_202409/include/ExteriorLights.h diff --git a/j2735codec/core/202409/include/FeeReport.h b/j2735codec/core/j2735_202409/include/FeeReport.h similarity index 100% rename from j2735codec/core/202409/include/FeeReport.h rename to j2735codec/core/j2735_202409/include/FeeReport.h diff --git a/j2735codec/core/202409/include/FrictionInformation.h b/j2735codec/core/j2735_202409/include/FrictionInformation.h similarity index 100% rename from j2735codec/core/202409/include/FrictionInformation.h rename to j2735codec/core/j2735_202409/include/FrictionInformation.h diff --git a/j2735codec/core/202409/include/FrontCutIn.h b/j2735codec/core/j2735_202409/include/FrontCutIn.h similarity index 100% rename from j2735codec/core/202409/include/FrontCutIn.h rename to j2735codec/core/j2735_202409/include/FrontCutIn.h diff --git a/j2735codec/core/202409/include/FuelType.h b/j2735codec/core/j2735_202409/include/FuelType.h similarity index 100% rename from j2735codec/core/202409/include/FuelType.h rename to j2735codec/core/j2735_202409/include/FuelType.h diff --git a/j2735codec/core/202409/include/FullPositionVector.h b/j2735codec/core/j2735_202409/include/FullPositionVector.h similarity index 100% rename from j2735codec/core/202409/include/FullPositionVector.h rename to j2735codec/core/j2735_202409/include/FullPositionVector.h diff --git a/j2735codec/core/202409/include/FullRoadAuthorityID.h b/j2735codec/core/j2735_202409/include/FullRoadAuthorityID.h similarity index 100% rename from j2735codec/core/202409/include/FullRoadAuthorityID.h rename to j2735codec/core/j2735_202409/include/FullRoadAuthorityID.h diff --git a/j2735codec/core/202409/include/FurtherInfoID.h b/j2735codec/core/j2735_202409/include/FurtherInfoID.h similarity index 100% rename from j2735codec/core/202409/include/FurtherInfoID.h rename to j2735codec/core/j2735_202409/include/FurtherInfoID.h diff --git a/j2735codec/core/202409/include/FutureCharacteristics.h b/j2735codec/core/j2735_202409/include/FutureCharacteristics.h similarity index 100% rename from j2735codec/core/202409/include/FutureCharacteristics.h rename to j2735codec/core/j2735_202409/include/FutureCharacteristics.h diff --git a/j2735codec/core/202409/include/GNSSstatus.h b/j2735codec/core/j2735_202409/include/GNSSstatus.h similarity index 100% rename from j2735codec/core/202409/include/GNSSstatus.h rename to j2735codec/core/j2735_202409/include/GNSSstatus.h diff --git a/j2735codec/core/202409/include/GeneralizedTime.h b/j2735codec/core/j2735_202409/include/GeneralizedTime.h similarity index 100% rename from j2735codec/core/202409/include/GeneralizedTime.h rename to j2735codec/core/j2735_202409/include/GeneralizedTime.h diff --git a/j2735codec/core/202409/include/GenericLane.h b/j2735codec/core/j2735_202409/include/GenericLane.h similarity index 100% rename from j2735codec/core/202409/include/GenericLane.h rename to j2735codec/core/j2735_202409/include/GenericLane.h diff --git a/j2735codec/core/202409/include/GenericSignage.h b/j2735codec/core/j2735_202409/include/GenericSignage.h similarity index 100% rename from j2735codec/core/202409/include/GenericSignage.h rename to j2735codec/core/j2735_202409/include/GenericSignage.h diff --git a/j2735codec/core/202409/include/GeographicalPath.h b/j2735codec/core/j2735_202409/include/GeographicalPath.h similarity index 100% rename from j2735codec/core/202409/include/GeographicalPath.h rename to j2735codec/core/j2735_202409/include/GeographicalPath.h diff --git a/j2735codec/core/202409/include/GeometricProjection.h b/j2735codec/core/j2735_202409/include/GeometricProjection.h similarity index 100% rename from j2735codec/core/202409/include/GeometricProjection.h rename to j2735codec/core/j2735_202409/include/GeometricProjection.h diff --git a/j2735codec/core/202409/include/GraphicString.h b/j2735codec/core/j2735_202409/include/GraphicString.h similarity index 100% rename from j2735codec/core/202409/include/GraphicString.h rename to j2735codec/core/j2735_202409/include/GraphicString.h diff --git a/j2735codec/core/202409/include/Grass.h b/j2735codec/core/j2735_202409/include/Grass.h similarity index 100% rename from j2735codec/core/202409/include/Grass.h rename to j2735codec/core/j2735_202409/include/Grass.h diff --git a/j2735codec/core/202409/include/GrassType.h b/j2735codec/core/j2735_202409/include/GrassType.h similarity index 100% rename from j2735codec/core/202409/include/GrassType.h rename to j2735codec/core/j2735_202409/include/GrassType.h diff --git a/j2735codec/core/202409/include/Gravel.h b/j2735codec/core/j2735_202409/include/Gravel.h similarity index 100% rename from j2735codec/core/202409/include/Gravel.h rename to j2735codec/core/j2735_202409/include/Gravel.h diff --git a/j2735codec/core/202409/include/GravelType.h b/j2735codec/core/j2735_202409/include/GravelType.h similarity index 100% rename from j2735codec/core/202409/include/GravelType.h rename to j2735codec/core/j2735_202409/include/GravelType.h diff --git a/j2735codec/core/202409/include/GrossDistance.h b/j2735codec/core/j2735_202409/include/GrossDistance.h similarity index 100% rename from j2735codec/core/202409/include/GrossDistance.h rename to j2735codec/core/j2735_202409/include/GrossDistance.h diff --git a/j2735codec/core/202409/include/GrossSpeed.h b/j2735codec/core/j2735_202409/include/GrossSpeed.h similarity index 100% rename from j2735codec/core/202409/include/GrossSpeed.h rename to j2735codec/core/j2735_202409/include/GrossSpeed.h diff --git a/j2735codec/core/202409/include/Header.h b/j2735codec/core/j2735_202409/include/Header.h similarity index 100% rename from j2735codec/core/202409/include/Header.h rename to j2735codec/core/j2735_202409/include/Header.h diff --git a/j2735codec/core/202409/include/Heading.h b/j2735codec/core/j2735_202409/include/Heading.h similarity index 100% rename from j2735codec/core/202409/include/Heading.h rename to j2735codec/core/j2735_202409/include/Heading.h diff --git a/j2735codec/core/202409/include/HeadingConfidence.h b/j2735codec/core/j2735_202409/include/HeadingConfidence.h similarity index 100% rename from j2735codec/core/202409/include/HeadingConfidence.h rename to j2735codec/core/j2735_202409/include/HeadingConfidence.h diff --git a/j2735codec/core/202409/include/HeadingDeg.h b/j2735codec/core/j2735_202409/include/HeadingDeg.h similarity index 100% rename from j2735codec/core/202409/include/HeadingDeg.h rename to j2735codec/core/j2735_202409/include/HeadingDeg.h diff --git a/j2735codec/core/202409/include/HeadingSlice.h b/j2735codec/core/j2735_202409/include/HeadingSlice.h similarity index 100% rename from j2735codec/core/202409/include/HeadingSlice.h rename to j2735codec/core/j2735_202409/include/HeadingSlice.h diff --git a/j2735codec/core/202409/include/HeavyTruckCCMExtensions.h b/j2735codec/core/j2735_202409/include/HeavyTruckCCMExtensions.h similarity index 100% rename from j2735codec/core/202409/include/HeavyTruckCCMExtensions.h rename to j2735codec/core/j2735_202409/include/HeavyTruckCCMExtensions.h diff --git a/j2735codec/core/202409/include/Holiday.h b/j2735codec/core/j2735_202409/include/Holiday.h similarity index 100% rename from j2735codec/core/202409/include/Holiday.h rename to j2735codec/core/j2735_202409/include/Holiday.h diff --git a/j2735codec/core/202409/include/Hour.h b/j2735codec/core/j2735_202409/include/Hour.h similarity index 100% rename from j2735codec/core/202409/include/Hour.h rename to j2735codec/core/j2735_202409/include/Hour.h diff --git a/j2735codec/core/202409/include/HumanPropelledType.h b/j2735codec/core/j2735_202409/include/HumanPropelledType.h similarity index 100% rename from j2735codec/core/202409/include/HumanPropelledType.h rename to j2735codec/core/j2735_202409/include/HumanPropelledType.h diff --git a/j2735codec/core/202409/include/IA5String.h b/j2735codec/core/j2735_202409/include/IA5String.h similarity index 100% rename from j2735codec/core/202409/include/IA5String.h rename to j2735codec/core/j2735_202409/include/IA5String.h diff --git a/j2735codec/core/202409/include/INTEGER.h b/j2735codec/core/j2735_202409/include/INTEGER.h similarity index 100% rename from j2735codec/core/202409/include/INTEGER.h rename to j2735codec/core/j2735_202409/include/INTEGER.h diff --git a/j2735codec/core/202409/include/ITISEventType.h b/j2735codec/core/j2735_202409/include/ITISEventType.h similarity index 100% rename from j2735codec/core/202409/include/ITISEventType.h rename to j2735codec/core/j2735_202409/include/ITISEventType.h diff --git a/j2735codec/core/202409/include/ITIS_GenericLocations.h b/j2735codec/core/j2735_202409/include/ITIS_GenericLocations.h similarity index 100% rename from j2735codec/core/202409/include/ITIS_GenericLocations.h rename to j2735codec/core/j2735_202409/include/ITIS_GenericLocations.h diff --git a/j2735codec/core/202409/include/ITIS_ITIScodes.h b/j2735codec/core/j2735_202409/include/ITIS_ITIScodes.h similarity index 100% rename from j2735codec/core/202409/include/ITIS_ITIScodes.h rename to j2735codec/core/j2735_202409/include/ITIS_ITIScodes.h diff --git a/j2735codec/core/202409/include/ITIS_ITIScodesAndText.h b/j2735codec/core/j2735_202409/include/ITIS_ITIScodesAndText.h similarity index 100% rename from j2735codec/core/202409/include/ITIS_ITIScodesAndText.h rename to j2735codec/core/j2735_202409/include/ITIS_ITIScodesAndText.h diff --git a/j2735codec/core/202409/include/ITIS_ITIStext.h b/j2735codec/core/j2735_202409/include/ITIS_ITIStext.h similarity index 100% rename from j2735codec/core/202409/include/ITIS_ITIStext.h rename to j2735codec/core/j2735_202409/include/ITIS_ITIStext.h diff --git a/j2735codec/core/202409/include/ITIS_IncidentResponseEquipment.h b/j2735codec/core/j2735_202409/include/ITIS_IncidentResponseEquipment.h similarity index 100% rename from j2735codec/core/202409/include/ITIS_IncidentResponseEquipment.h rename to j2735codec/core/j2735_202409/include/ITIS_IncidentResponseEquipment.h diff --git a/j2735codec/core/202409/include/ITIS_ResponderGroupAffected.h b/j2735codec/core/j2735_202409/include/ITIS_ResponderGroupAffected.h similarity index 100% rename from j2735codec/core/202409/include/ITIS_ResponderGroupAffected.h rename to j2735codec/core/j2735_202409/include/ITIS_ResponderGroupAffected.h diff --git a/j2735codec/core/202409/include/ITIS_VehicleGroupAffected.h b/j2735codec/core/j2735_202409/include/ITIS_VehicleGroupAffected.h similarity index 100% rename from j2735codec/core/202409/include/ITIS_VehicleGroupAffected.h rename to j2735codec/core/j2735_202409/include/ITIS_VehicleGroupAffected.h diff --git a/j2735codec/core/202409/include/ITISgroups.h b/j2735codec/core/j2735_202409/include/ITISgroups.h similarity index 100% rename from j2735codec/core/202409/include/ITISgroups.h rename to j2735codec/core/j2735_202409/include/ITISgroups.h diff --git a/j2735codec/core/202409/include/ITIStextPhrase.h b/j2735codec/core/j2735_202409/include/ITIStextPhrase.h similarity index 100% rename from j2735codec/core/202409/include/ITIStextPhrase.h rename to j2735codec/core/j2735_202409/include/ITIStextPhrase.h diff --git a/j2735codec/core/202409/include/Ice.h b/j2735codec/core/j2735_202409/include/Ice.h similarity index 100% rename from j2735codec/core/202409/include/Ice.h rename to j2735codec/core/j2735_202409/include/Ice.h diff --git a/j2735codec/core/202409/include/IceType.h b/j2735codec/core/j2735_202409/include/IceType.h similarity index 100% rename from j2735codec/core/202409/include/IceType.h rename to j2735codec/core/j2735_202409/include/IceType.h diff --git a/j2735codec/core/202409/include/IncidentResponseStatus.h b/j2735codec/core/j2735_202409/include/IncidentResponseStatus.h similarity index 100% rename from j2735codec/core/202409/include/IncidentResponseStatus.h rename to j2735codec/core/j2735_202409/include/IncidentResponseStatus.h diff --git a/j2735codec/core/202409/include/IncidentsContainer.h b/j2735codec/core/j2735_202409/include/IncidentsContainer.h similarity index 100% rename from j2735codec/core/202409/include/IncidentsContainer.h rename to j2735codec/core/j2735_202409/include/IncidentsContainer.h diff --git a/j2735codec/core/202409/include/Int1Signed.h b/j2735codec/core/j2735_202409/include/Int1Signed.h similarity index 100% rename from j2735codec/core/202409/include/Int1Signed.h rename to j2735codec/core/j2735_202409/include/Int1Signed.h diff --git a/j2735codec/core/202409/include/Int1Unsigned.h b/j2735codec/core/j2735_202409/include/Int1Unsigned.h similarity index 100% rename from j2735codec/core/202409/include/Int1Unsigned.h rename to j2735codec/core/j2735_202409/include/Int1Unsigned.h diff --git a/j2735codec/core/202409/include/Int2Signed.h b/j2735codec/core/j2735_202409/include/Int2Signed.h similarity index 100% rename from j2735codec/core/202409/include/Int2Signed.h rename to j2735codec/core/j2735_202409/include/Int2Signed.h diff --git a/j2735codec/core/202409/include/Int2Unsigned.h b/j2735codec/core/j2735_202409/include/Int2Unsigned.h similarity index 100% rename from j2735codec/core/202409/include/Int2Unsigned.h rename to j2735codec/core/j2735_202409/include/Int2Unsigned.h diff --git a/j2735codec/core/202409/include/Int3Unsigned.h b/j2735codec/core/j2735_202409/include/Int3Unsigned.h similarity index 100% rename from j2735codec/core/202409/include/Int3Unsigned.h rename to j2735codec/core/j2735_202409/include/Int3Unsigned.h diff --git a/j2735codec/core/202409/include/Int4Signed.h b/j2735codec/core/j2735_202409/include/Int4Signed.h similarity index 100% rename from j2735codec/core/202409/include/Int4Signed.h rename to j2735codec/core/j2735_202409/include/Int4Signed.h diff --git a/j2735codec/core/202409/include/Int4Unsigned.h b/j2735codec/core/j2735_202409/include/Int4Unsigned.h similarity index 100% rename from j2735codec/core/202409/include/Int4Unsigned.h rename to j2735codec/core/j2735_202409/include/Int4Unsigned.h diff --git a/j2735codec/core/202409/include/Int8Signed.h b/j2735codec/core/j2735_202409/include/Int8Signed.h similarity index 100% rename from j2735codec/core/202409/include/Int8Signed.h rename to j2735codec/core/j2735_202409/include/Int8Signed.h diff --git a/j2735codec/core/202409/include/Int8Unsigned.h b/j2735codec/core/j2735_202409/include/Int8Unsigned.h similarity index 100% rename from j2735codec/core/202409/include/Int8Unsigned.h rename to j2735codec/core/j2735_202409/include/Int8Unsigned.h diff --git a/j2735codec/core/202409/include/IntersectionAccessPoint.h b/j2735codec/core/j2735_202409/include/IntersectionAccessPoint.h similarity index 100% rename from j2735codec/core/202409/include/IntersectionAccessPoint.h rename to j2735codec/core/j2735_202409/include/IntersectionAccessPoint.h diff --git a/j2735codec/core/202409/include/IntersectionCollision.h b/j2735codec/core/j2735_202409/include/IntersectionCollision.h similarity index 100% rename from j2735codec/core/202409/include/IntersectionCollision.h rename to j2735codec/core/j2735_202409/include/IntersectionCollision.h diff --git a/j2735codec/core/202409/include/IntersectionGeometry.h b/j2735codec/core/j2735_202409/include/IntersectionGeometry.h similarity index 100% rename from j2735codec/core/202409/include/IntersectionGeometry.h rename to j2735codec/core/j2735_202409/include/IntersectionGeometry.h diff --git a/j2735codec/core/202409/include/IntersectionGeometryList.h b/j2735codec/core/j2735_202409/include/IntersectionGeometryList.h similarity index 100% rename from j2735codec/core/202409/include/IntersectionGeometryList.h rename to j2735codec/core/j2735_202409/include/IntersectionGeometryList.h diff --git a/j2735codec/core/202409/include/IntersectionID.h b/j2735codec/core/j2735_202409/include/IntersectionID.h similarity index 100% rename from j2735codec/core/202409/include/IntersectionID.h rename to j2735codec/core/j2735_202409/include/IntersectionID.h diff --git a/j2735codec/core/202409/include/IntersectionReferenceID.h b/j2735codec/core/j2735_202409/include/IntersectionReferenceID.h similarity index 100% rename from j2735codec/core/202409/include/IntersectionReferenceID.h rename to j2735codec/core/j2735_202409/include/IntersectionReferenceID.h diff --git a/j2735codec/core/202409/include/IntersectionState-addGrpC.h b/j2735codec/core/j2735_202409/include/IntersectionState-addGrpC.h similarity index 100% rename from j2735codec/core/202409/include/IntersectionState-addGrpC.h rename to j2735codec/core/j2735_202409/include/IntersectionState-addGrpC.h diff --git a/j2735codec/core/202409/include/IntersectionState.h b/j2735codec/core/j2735_202409/include/IntersectionState.h similarity index 100% rename from j2735codec/core/202409/include/IntersectionState.h rename to j2735codec/core/j2735_202409/include/IntersectionState.h diff --git a/j2735codec/core/202409/include/IntersectionStateList.h b/j2735codec/core/j2735_202409/include/IntersectionStateList.h similarity index 100% rename from j2735codec/core/202409/include/IntersectionStateList.h rename to j2735codec/core/j2735_202409/include/IntersectionStateList.h diff --git a/j2735codec/core/202409/include/IntersectionStatusObject.h b/j2735codec/core/j2735_202409/include/IntersectionStatusObject.h similarity index 100% rename from j2735codec/core/202409/include/IntersectionStatusObject.h rename to j2735codec/core/j2735_202409/include/IntersectionStatusObject.h diff --git a/j2735codec/core/202409/include/IsDolly.h b/j2735codec/core/j2735_202409/include/IsDolly.h similarity index 100% rename from j2735codec/core/202409/include/IsDolly.h rename to j2735codec/core/j2735_202409/include/IsDolly.h diff --git a/j2735codec/core/202409/include/Iso3833VehicleType.h b/j2735codec/core/j2735_202409/include/Iso3833VehicleType.h similarity index 100% rename from j2735codec/core/202409/include/Iso3833VehicleType.h rename to j2735codec/core/j2735_202409/include/Iso3833VehicleType.h diff --git a/j2735codec/core/202409/include/IssuerIdentifier.h b/j2735codec/core/j2735_202409/include/IssuerIdentifier.h similarity index 100% rename from j2735codec/core/202409/include/IssuerIdentifier.h rename to j2735codec/core/j2735_202409/include/IssuerIdentifier.h diff --git a/j2735codec/core/202409/include/ItemizedChargerData.h b/j2735codec/core/j2735_202409/include/ItemizedChargerData.h similarity index 100% rename from j2735codec/core/202409/include/ItemizedChargerData.h rename to j2735codec/core/j2735_202409/include/ItemizedChargerData.h diff --git a/j2735codec/core/202409/include/ItemizedPaymentReport.h b/j2735codec/core/j2735_202409/include/ItemizedPaymentReport.h similarity index 100% rename from j2735codec/core/202409/include/ItemizedPaymentReport.h rename to j2735codec/core/j2735_202409/include/ItemizedPaymentReport.h diff --git a/j2735codec/core/202409/include/J1939data.h b/j2735codec/core/j2735_202409/include/J1939data.h similarity index 100% rename from j2735codec/core/202409/include/J1939data.h rename to j2735codec/core/j2735_202409/include/J1939data.h diff --git a/j2735codec/core/202409/include/J2540ITIS_GenericLocations.h b/j2735codec/core/j2735_202409/include/J2540ITIS_GenericLocations.h similarity index 100% rename from j2735codec/core/202409/include/J2540ITIS_GenericLocations.h rename to j2735codec/core/j2735_202409/include/J2540ITIS_GenericLocations.h diff --git a/j2735codec/core/202409/include/J2540ITIS_ITIScodes.h b/j2735codec/core/j2735_202409/include/J2540ITIS_ITIScodes.h similarity index 100% rename from j2735codec/core/202409/include/J2540ITIS_ITIScodes.h rename to j2735codec/core/j2735_202409/include/J2540ITIS_ITIScodes.h diff --git a/j2735codec/core/202409/include/J2540ITIS_ITIScodesAndText.h b/j2735codec/core/j2735_202409/include/J2540ITIS_ITIScodesAndText.h similarity index 100% rename from j2735codec/core/202409/include/J2540ITIS_ITIScodesAndText.h rename to j2735codec/core/j2735_202409/include/J2540ITIS_ITIScodesAndText.h diff --git a/j2735codec/core/202409/include/J2540ITIS_ITIStext.h b/j2735codec/core/j2735_202409/include/J2540ITIS_ITIStext.h similarity index 100% rename from j2735codec/core/202409/include/J2540ITIS_ITIStext.h rename to j2735codec/core/j2735_202409/include/J2540ITIS_ITIStext.h diff --git a/j2735codec/core/202409/include/J2540ITIS_IncidentResponseEquipment.h b/j2735codec/core/j2735_202409/include/J2540ITIS_IncidentResponseEquipment.h similarity index 100% rename from j2735codec/core/202409/include/J2540ITIS_IncidentResponseEquipment.h rename to j2735codec/core/j2735_202409/include/J2540ITIS_IncidentResponseEquipment.h diff --git a/j2735codec/core/202409/include/J2540ITIS_ResponderGroupAffected.h b/j2735codec/core/j2735_202409/include/J2540ITIS_ResponderGroupAffected.h similarity index 100% rename from j2735codec/core/202409/include/J2540ITIS_ResponderGroupAffected.h rename to j2735codec/core/j2735_202409/include/J2540ITIS_ResponderGroupAffected.h diff --git a/j2735codec/core/202409/include/J2540ITIS_VehicleGroupAffected.h b/j2735codec/core/j2735_202409/include/J2540ITIS_VehicleGroupAffected.h similarity index 100% rename from j2735codec/core/202409/include/J2540ITIS_VehicleGroupAffected.h rename to j2735codec/core/j2735_202409/include/J2540ITIS_VehicleGroupAffected.h diff --git a/j2735codec/core/202409/include/LaneAttributes-Barrier.h b/j2735codec/core/j2735_202409/include/LaneAttributes-Barrier.h similarity index 100% rename from j2735codec/core/202409/include/LaneAttributes-Barrier.h rename to j2735codec/core/j2735_202409/include/LaneAttributes-Barrier.h diff --git a/j2735codec/core/202409/include/LaneAttributes-Bike.h b/j2735codec/core/j2735_202409/include/LaneAttributes-Bike.h similarity index 100% rename from j2735codec/core/202409/include/LaneAttributes-Bike.h rename to j2735codec/core/j2735_202409/include/LaneAttributes-Bike.h diff --git a/j2735codec/core/202409/include/LaneAttributes-Crosswalk.h b/j2735codec/core/j2735_202409/include/LaneAttributes-Crosswalk.h similarity index 100% rename from j2735codec/core/202409/include/LaneAttributes-Crosswalk.h rename to j2735codec/core/j2735_202409/include/LaneAttributes-Crosswalk.h diff --git a/j2735codec/core/202409/include/LaneAttributes-Parking.h b/j2735codec/core/j2735_202409/include/LaneAttributes-Parking.h similarity index 100% rename from j2735codec/core/202409/include/LaneAttributes-Parking.h rename to j2735codec/core/j2735_202409/include/LaneAttributes-Parking.h diff --git a/j2735codec/core/202409/include/LaneAttributes-Sidewalk.h b/j2735codec/core/j2735_202409/include/LaneAttributes-Sidewalk.h similarity index 100% rename from j2735codec/core/202409/include/LaneAttributes-Sidewalk.h rename to j2735codec/core/j2735_202409/include/LaneAttributes-Sidewalk.h diff --git a/j2735codec/core/202409/include/LaneAttributes-Striping.h b/j2735codec/core/j2735_202409/include/LaneAttributes-Striping.h similarity index 100% rename from j2735codec/core/202409/include/LaneAttributes-Striping.h rename to j2735codec/core/j2735_202409/include/LaneAttributes-Striping.h diff --git a/j2735codec/core/202409/include/LaneAttributes-TrackedVehicle.h b/j2735codec/core/j2735_202409/include/LaneAttributes-TrackedVehicle.h similarity index 100% rename from j2735codec/core/202409/include/LaneAttributes-TrackedVehicle.h rename to j2735codec/core/j2735_202409/include/LaneAttributes-TrackedVehicle.h diff --git a/j2735codec/core/202409/include/LaneAttributes-Vehicle.h b/j2735codec/core/j2735_202409/include/LaneAttributes-Vehicle.h similarity index 100% rename from j2735codec/core/202409/include/LaneAttributes-Vehicle.h rename to j2735codec/core/j2735_202409/include/LaneAttributes-Vehicle.h diff --git a/j2735codec/core/202409/include/LaneAttributes.h b/j2735codec/core/j2735_202409/include/LaneAttributes.h similarity index 100% rename from j2735codec/core/202409/include/LaneAttributes.h rename to j2735codec/core/j2735_202409/include/LaneAttributes.h diff --git a/j2735codec/core/202409/include/LaneChargesTable.h b/j2735codec/core/j2735_202409/include/LaneChargesTable.h similarity index 100% rename from j2735codec/core/202409/include/LaneChargesTable.h rename to j2735codec/core/j2735_202409/include/LaneChargesTable.h diff --git a/j2735codec/core/202409/include/LaneClosed.h b/j2735codec/core/j2735_202409/include/LaneClosed.h similarity index 100% rename from j2735codec/core/202409/include/LaneClosed.h rename to j2735codec/core/j2735_202409/include/LaneClosed.h diff --git a/j2735codec/core/202409/include/LaneClosureContainer.h b/j2735codec/core/j2735_202409/include/LaneClosureContainer.h similarity index 100% rename from j2735codec/core/202409/include/LaneClosureContainer.h rename to j2735codec/core/j2735_202409/include/LaneClosureContainer.h diff --git a/j2735codec/core/202409/include/LaneConnectionID.h b/j2735codec/core/j2735_202409/include/LaneConnectionID.h similarity index 100% rename from j2735codec/core/202409/include/LaneConnectionID.h rename to j2735codec/core/j2735_202409/include/LaneConnectionID.h diff --git a/j2735codec/core/202409/include/LaneDataAttribute-addGrpB.h b/j2735codec/core/j2735_202409/include/LaneDataAttribute-addGrpB.h similarity index 100% rename from j2735codec/core/202409/include/LaneDataAttribute-addGrpB.h rename to j2735codec/core/j2735_202409/include/LaneDataAttribute-addGrpB.h diff --git a/j2735codec/core/202409/include/LaneDataAttribute.h b/j2735codec/core/j2735_202409/include/LaneDataAttribute.h similarity index 100% rename from j2735codec/core/202409/include/LaneDataAttribute.h rename to j2735codec/core/j2735_202409/include/LaneDataAttribute.h diff --git a/j2735codec/core/202409/include/LaneDataAttributeList.h b/j2735codec/core/j2735_202409/include/LaneDataAttributeList.h similarity index 100% rename from j2735codec/core/202409/include/LaneDataAttributeList.h rename to j2735codec/core/j2735_202409/include/LaneDataAttributeList.h diff --git a/j2735codec/core/202409/include/LaneDirection.h b/j2735codec/core/j2735_202409/include/LaneDirection.h similarity index 100% rename from j2735codec/core/202409/include/LaneDirection.h rename to j2735codec/core/j2735_202409/include/LaneDirection.h diff --git a/j2735codec/core/202409/include/LaneID.h b/j2735codec/core/j2735_202409/include/LaneID.h similarity index 100% rename from j2735codec/core/202409/include/LaneID.h rename to j2735codec/core/j2735_202409/include/LaneID.h diff --git a/j2735codec/core/202409/include/LaneInfo.h b/j2735codec/core/j2735_202409/include/LaneInfo.h similarity index 100% rename from j2735codec/core/202409/include/LaneInfo.h rename to j2735codec/core/j2735_202409/include/LaneInfo.h diff --git a/j2735codec/core/202409/include/LaneList.h b/j2735codec/core/j2735_202409/include/LaneList.h similarity index 100% rename from j2735codec/core/202409/include/LaneList.h rename to j2735codec/core/j2735_202409/include/LaneList.h diff --git a/j2735codec/core/202409/include/LaneOffset.h b/j2735codec/core/j2735_202409/include/LaneOffset.h similarity index 100% rename from j2735codec/core/202409/include/LaneOffset.h rename to j2735codec/core/j2735_202409/include/LaneOffset.h diff --git a/j2735codec/core/202409/include/LaneRoadway.h b/j2735codec/core/j2735_202409/include/LaneRoadway.h similarity index 100% rename from j2735codec/core/202409/include/LaneRoadway.h rename to j2735codec/core/j2735_202409/include/LaneRoadway.h diff --git a/j2735codec/core/202409/include/LaneSharing.h b/j2735codec/core/j2735_202409/include/LaneSharing.h similarity index 100% rename from j2735codec/core/202409/include/LaneSharing.h rename to j2735codec/core/j2735_202409/include/LaneSharing.h diff --git a/j2735codec/core/202409/include/LaneTypeAttributes.h b/j2735codec/core/j2735_202409/include/LaneTypeAttributes.h similarity index 100% rename from j2735codec/core/202409/include/LaneTypeAttributes.h rename to j2735codec/core/j2735_202409/include/LaneTypeAttributes.h diff --git a/j2735codec/core/202409/include/LaneWidth.h b/j2735codec/core/j2735_202409/include/LaneWidth.h similarity index 100% rename from j2735codec/core/202409/include/LaneWidth.h rename to j2735codec/core/j2735_202409/include/LaneWidth.h diff --git a/j2735codec/core/202409/include/LargeNumbers.h b/j2735codec/core/j2735_202409/include/LargeNumbers.h similarity index 100% rename from j2735codec/core/202409/include/LargeNumbers.h rename to j2735codec/core/j2735_202409/include/LargeNumbers.h diff --git a/j2735codec/core/202409/include/LastTollPointInfo.h b/j2735codec/core/j2735_202409/include/LastTollPointInfo.h similarity index 100% rename from j2735codec/core/202409/include/LastTollPointInfo.h rename to j2735codec/core/j2735_202409/include/LastTollPointInfo.h diff --git a/j2735codec/core/202409/include/LastTollPointInfos.h b/j2735codec/core/j2735_202409/include/LastTollPointInfos.h similarity index 100% rename from j2735codec/core/202409/include/LastTollPointInfos.h rename to j2735codec/core/j2735_202409/include/LastTollPointInfos.h diff --git a/j2735codec/core/202409/include/LatOffset.h b/j2735codec/core/j2735_202409/include/LatOffset.h similarity index 100% rename from j2735codec/core/202409/include/LatOffset.h rename to j2735codec/core/j2735_202409/include/LatOffset.h diff --git a/j2735codec/core/202409/include/LatitudeDMS.h b/j2735codec/core/j2735_202409/include/LatitudeDMS.h similarity index 100% rename from j2735codec/core/202409/include/LatitudeDMS.h rename to j2735codec/core/j2735_202409/include/LatitudeDMS.h diff --git a/j2735codec/core/202409/include/LatitudeDMS2.h b/j2735codec/core/j2735_202409/include/LatitudeDMS2.h similarity index 100% rename from j2735codec/core/202409/include/LatitudeDMS2.h rename to j2735codec/core/j2735_202409/include/LatitudeDMS2.h diff --git a/j2735codec/core/202409/include/LayerID.h b/j2735codec/core/j2735_202409/include/LayerID.h similarity index 100% rename from j2735codec/core/202409/include/LayerID.h rename to j2735codec/core/j2735_202409/include/LayerID.h diff --git a/j2735codec/core/202409/include/LayerType.h b/j2735codec/core/j2735_202409/include/LayerType.h similarity index 100% rename from j2735codec/core/202409/include/LayerType.h rename to j2735codec/core/j2735_202409/include/LayerType.h diff --git a/j2735codec/core/202409/include/LightVehicleCCMExtensions.h b/j2735codec/core/j2735_202409/include/LightVehicleCCMExtensions.h similarity index 100% rename from j2735codec/core/202409/include/LightVehicleCCMExtensions.h rename to j2735codec/core/j2735_202409/include/LightVehicleCCMExtensions.h diff --git a/j2735codec/core/202409/include/LightbarInUse.h b/j2735codec/core/j2735_202409/include/LightbarInUse.h similarity index 100% rename from j2735codec/core/202409/include/LightbarInUse.h rename to j2735codec/core/j2735_202409/include/LightbarInUse.h diff --git a/j2735codec/core/202409/include/LocAndTimeStamp.h b/j2735codec/core/j2735_202409/include/LocAndTimeStamp.h similarity index 100% rename from j2735codec/core/202409/include/LocAndTimeStamp.h rename to j2735codec/core/j2735_202409/include/LocAndTimeStamp.h diff --git a/j2735codec/core/202409/include/LocAndTimeStamps.h b/j2735codec/core/j2735_202409/include/LocAndTimeStamps.h similarity index 100% rename from j2735codec/core/202409/include/LocAndTimeStamps.h rename to j2735codec/core/j2735_202409/include/LocAndTimeStamps.h diff --git a/j2735codec/core/202409/include/LocalVehicleClassId.h b/j2735codec/core/j2735_202409/include/LocalVehicleClassId.h similarity index 100% rename from j2735codec/core/202409/include/LocalVehicleClassId.h rename to j2735codec/core/j2735_202409/include/LocalVehicleClassId.h diff --git a/j2735codec/core/202409/include/Location-quality.h b/j2735codec/core/j2735_202409/include/Location-quality.h similarity index 100% rename from j2735codec/core/202409/include/Location-quality.h rename to j2735codec/core/j2735_202409/include/Location-quality.h diff --git a/j2735codec/core/202409/include/Location-tech.h b/j2735codec/core/j2735_202409/include/Location-tech.h similarity index 100% rename from j2735codec/core/202409/include/Location-tech.h rename to j2735codec/core/j2735_202409/include/Location-tech.h diff --git a/j2735codec/core/202409/include/LocationClassId.h b/j2735codec/core/j2735_202409/include/LocationClassId.h similarity index 100% rename from j2735codec/core/202409/include/LocationClassId.h rename to j2735codec/core/j2735_202409/include/LocationClassId.h diff --git a/j2735codec/core/202409/include/LongOffset.h b/j2735codec/core/j2735_202409/include/LongOffset.h similarity index 100% rename from j2735codec/core/202409/include/LongOffset.h rename to j2735codec/core/j2735_202409/include/LongOffset.h diff --git a/j2735codec/core/202409/include/LongitudeDMS.h b/j2735codec/core/j2735_202409/include/LongitudeDMS.h similarity index 100% rename from j2735codec/core/202409/include/LongitudeDMS.h rename to j2735codec/core/j2735_202409/include/LongitudeDMS.h diff --git a/j2735codec/core/202409/include/LongitudeDMS2.h b/j2735codec/core/j2735_202409/include/LongitudeDMS2.h similarity index 100% rename from j2735codec/core/202409/include/LongitudeDMS2.h rename to j2735codec/core/j2735_202409/include/LongitudeDMS2.h diff --git a/j2735codec/core/202409/include/LongitudinalControlState.h b/j2735codec/core/j2735_202409/include/LongitudinalControlState.h similarity index 100% rename from j2735codec/core/202409/include/LongitudinalControlState.h rename to j2735codec/core/j2735_202409/include/LongitudinalControlState.h diff --git a/j2735codec/core/202409/include/Lpn.h b/j2735codec/core/j2735_202409/include/Lpn.h similarity index 100% rename from j2735codec/core/202409/include/Lpn.h rename to j2735codec/core/j2735_202409/include/Lpn.h diff --git a/j2735codec/core/202409/include/MSCMType.h b/j2735codec/core/j2735_202409/include/MSCMType.h similarity index 100% rename from j2735codec/core/202409/include/MSCMType.h rename to j2735codec/core/j2735_202409/include/MSCMType.h diff --git a/j2735codec/core/202409/include/MUTCDCode.h b/j2735codec/core/j2735_202409/include/MUTCDCode.h similarity index 100% rename from j2735codec/core/202409/include/MUTCDCode.h rename to j2735codec/core/j2735_202409/include/MUTCDCode.h diff --git a/j2735codec/core/202409/include/MUTCDLocations.h b/j2735codec/core/j2735_202409/include/MUTCDLocations.h similarity index 100% rename from j2735codec/core/202409/include/MUTCDLocations.h rename to j2735codec/core/j2735_202409/include/MUTCDLocations.h diff --git a/j2735codec/core/202409/include/Maneuver.h b/j2735codec/core/j2735_202409/include/Maneuver.h similarity index 100% rename from j2735codec/core/202409/include/Maneuver.h rename to j2735codec/core/j2735_202409/include/Maneuver.h diff --git a/j2735codec/core/202409/include/ManeuverAssistList.h b/j2735codec/core/j2735_202409/include/ManeuverAssistList.h similarity index 100% rename from j2735codec/core/202409/include/ManeuverAssistList.h rename to j2735codec/core/j2735_202409/include/ManeuverAssistList.h diff --git a/j2735codec/core/202409/include/ManeuverExecutionStatus.h b/j2735codec/core/j2735_202409/include/ManeuverExecutionStatus.h similarity index 100% rename from j2735codec/core/202409/include/ManeuverExecutionStatus.h rename to j2735codec/core/j2735_202409/include/ManeuverExecutionStatus.h diff --git a/j2735codec/core/202409/include/ManeuverSharingAndCoordinatingMessage.h b/j2735codec/core/j2735_202409/include/ManeuverSharingAndCoordinatingMessage.h similarity index 100% rename from j2735codec/core/202409/include/ManeuverSharingAndCoordinatingMessage.h rename to j2735codec/core/j2735_202409/include/ManeuverSharingAndCoordinatingMessage.h diff --git a/j2735codec/core/202409/include/ManeuverSharingAndCoordinatingMessage_ManeuverID.h b/j2735codec/core/j2735_202409/include/ManeuverSharingAndCoordinatingMessage_ManeuverID.h similarity index 100% rename from j2735codec/core/202409/include/ManeuverSharingAndCoordinatingMessage_ManeuverID.h rename to j2735codec/core/j2735_202409/include/ManeuverSharingAndCoordinatingMessage_ManeuverID.h diff --git a/j2735codec/core/202409/include/ManeuverSharingAndCoordinatingMessage_ObjectDistance.h b/j2735codec/core/j2735_202409/include/ManeuverSharingAndCoordinatingMessage_ObjectDistance.h similarity index 100% rename from j2735codec/core/202409/include/ManeuverSharingAndCoordinatingMessage_ObjectDistance.h rename to j2735codec/core/j2735_202409/include/ManeuverSharingAndCoordinatingMessage_ObjectDistance.h diff --git a/j2735codec/core/202409/include/ManeuverSharingAndCoordinatingMessage_PositionOffsetXYZ.h b/j2735codec/core/j2735_202409/include/ManeuverSharingAndCoordinatingMessage_PositionOffsetXYZ.h similarity index 100% rename from j2735codec/core/202409/include/ManeuverSharingAndCoordinatingMessage_PositionOffsetXYZ.h rename to j2735codec/core/j2735_202409/include/ManeuverSharingAndCoordinatingMessage_PositionOffsetXYZ.h diff --git a/j2735codec/core/202409/include/MapData-addGrpC.h b/j2735codec/core/j2735_202409/include/MapData-addGrpC.h similarity index 100% rename from j2735codec/core/202409/include/MapData-addGrpC.h rename to j2735codec/core/j2735_202409/include/MapData-addGrpC.h diff --git a/j2735codec/core/202409/include/MapData.h b/j2735codec/core/j2735_202409/include/MapData.h similarity index 100% rename from j2735codec/core/202409/include/MapData.h rename to j2735codec/core/j2735_202409/include/MapData.h diff --git a/j2735codec/core/202409/include/MaxAvailableAcceleration.h b/j2735codec/core/j2735_202409/include/MaxAvailableAcceleration.h similarity index 100% rename from j2735codec/core/202409/include/MaxAvailableAcceleration.h rename to j2735codec/core/j2735_202409/include/MaxAvailableAcceleration.h diff --git a/j2735codec/core/202409/include/MaxAvailableDeceleration.h b/j2735codec/core/j2735_202409/include/MaxAvailableDeceleration.h similarity index 100% rename from j2735codec/core/202409/include/MaxAvailableDeceleration.h rename to j2735codec/core/j2735_202409/include/MaxAvailableDeceleration.h diff --git a/j2735codec/core/202409/include/MaxTimetoChange.h b/j2735codec/core/j2735_202409/include/MaxTimetoChange.h similarity index 100% rename from j2735codec/core/202409/include/MaxTimetoChange.h rename to j2735codec/core/j2735_202409/include/MaxTimetoChange.h diff --git a/j2735codec/core/202409/include/MeasurementTimeOffset.h b/j2735codec/core/j2735_202409/include/MeasurementTimeOffset.h similarity index 100% rename from j2735codec/core/202409/include/MeasurementTimeOffset.h rename to j2735codec/core/j2735_202409/include/MeasurementTimeOffset.h diff --git a/j2735codec/core/202409/include/MergeDivergeNodeAngle.h b/j2735codec/core/j2735_202409/include/MergeDivergeNodeAngle.h similarity index 100% rename from j2735codec/core/202409/include/MergeDivergeNodeAngle.h rename to j2735codec/core/j2735_202409/include/MergeDivergeNodeAngle.h diff --git a/j2735codec/core/202409/include/MessageBLOB.h b/j2735codec/core/j2735_202409/include/MessageBLOB.h similarity index 100% rename from j2735codec/core/202409/include/MessageBLOB.h rename to j2735codec/core/j2735_202409/include/MessageBLOB.h diff --git a/j2735codec/core/202409/include/MessageFrame.h b/j2735codec/core/j2735_202409/include/MessageFrame.h similarity index 100% rename from j2735codec/core/202409/include/MessageFrame.h rename to j2735codec/core/j2735_202409/include/MessageFrame.h diff --git a/j2735codec/core/202409/include/MinTimetoChange.h b/j2735codec/core/j2735_202409/include/MinTimetoChange.h similarity index 100% rename from j2735codec/core/202409/include/MinTimetoChange.h rename to j2735codec/core/j2735_202409/include/MinTimetoChange.h diff --git a/j2735codec/core/202409/include/Minute.h b/j2735codec/core/j2735_202409/include/Minute.h similarity index 100% rename from j2735codec/core/202409/include/Minute.h rename to j2735codec/core/j2735_202409/include/Minute.h diff --git a/j2735codec/core/202409/include/MinuteOfTheYear.h b/j2735codec/core/j2735_202409/include/MinuteOfTheYear.h similarity index 100% rename from j2735codec/core/202409/include/MinuteOfTheYear.h rename to j2735codec/core/j2735_202409/include/MinuteOfTheYear.h diff --git a/j2735codec/core/202409/include/MinutesAngle.h b/j2735codec/core/j2735_202409/include/MinutesAngle.h similarity index 100% rename from j2735codec/core/202409/include/MinutesAngle.h rename to j2735codec/core/j2735_202409/include/MinutesAngle.h diff --git a/j2735codec/core/202409/include/MinutesDuration.h b/j2735codec/core/j2735_202409/include/MinutesDuration.h similarity index 100% rename from j2735codec/core/202409/include/MinutesDuration.h rename to j2735codec/core/j2735_202409/include/MinutesDuration.h diff --git a/j2735codec/core/202409/include/MobileSituation.h b/j2735codec/core/j2735_202409/include/MobileSituation.h similarity index 100% rename from j2735codec/core/202409/include/MobileSituation.h rename to j2735codec/core/j2735_202409/include/MobileSituation.h diff --git a/j2735codec/core/202409/include/Month.h b/j2735codec/core/j2735_202409/include/Month.h similarity index 100% rename from j2735codec/core/202409/include/Month.h rename to j2735codec/core/j2735_202409/include/Month.h diff --git a/j2735codec/core/202409/include/MotorizedPropelledType.h b/j2735codec/core/j2735_202409/include/MotorizedPropelledType.h similarity index 100% rename from j2735codec/core/202409/include/MotorizedPropelledType.h rename to j2735codec/core/j2735_202409/include/MotorizedPropelledType.h diff --git a/j2735codec/core/202409/include/MovementEvent-addGrpB.h b/j2735codec/core/j2735_202409/include/MovementEvent-addGrpB.h similarity index 100% rename from j2735codec/core/202409/include/MovementEvent-addGrpB.h rename to j2735codec/core/j2735_202409/include/MovementEvent-addGrpB.h diff --git a/j2735codec/core/202409/include/MovementEvent.h b/j2735codec/core/j2735_202409/include/MovementEvent.h similarity index 100% rename from j2735codec/core/202409/include/MovementEvent.h rename to j2735codec/core/j2735_202409/include/MovementEvent.h diff --git a/j2735codec/core/202409/include/MovementEventList.h b/j2735codec/core/j2735_202409/include/MovementEventList.h similarity index 100% rename from j2735codec/core/202409/include/MovementEventList.h rename to j2735codec/core/j2735_202409/include/MovementEventList.h diff --git a/j2735codec/core/202409/include/MovementList.h b/j2735codec/core/j2735_202409/include/MovementList.h similarity index 100% rename from j2735codec/core/202409/include/MovementList.h rename to j2735codec/core/j2735_202409/include/MovementList.h diff --git a/j2735codec/core/202409/include/MovementPhaseState.h b/j2735codec/core/j2735_202409/include/MovementPhaseState.h similarity index 100% rename from j2735codec/core/202409/include/MovementPhaseState.h rename to j2735codec/core/j2735_202409/include/MovementPhaseState.h diff --git a/j2735codec/core/202409/include/MovementState.h b/j2735codec/core/j2735_202409/include/MovementState.h similarity index 100% rename from j2735codec/core/202409/include/MovementState.h rename to j2735codec/core/j2735_202409/include/MovementState.h diff --git a/j2735codec/core/202409/include/MsgCRC.h b/j2735codec/core/j2735_202409/include/MsgCRC.h similarity index 100% rename from j2735codec/core/202409/include/MsgCRC.h rename to j2735codec/core/j2735_202409/include/MsgCRC.h diff --git a/j2735codec/core/202409/include/MultiVehicleResponse.h b/j2735codec/core/j2735_202409/include/MultiVehicleResponse.h similarity index 100% rename from j2735codec/core/202409/include/MultiVehicleResponse.h rename to j2735codec/core/j2735_202409/include/MultiVehicleResponse.h diff --git a/j2735codec/core/202409/include/NMEA-MsgType.h b/j2735codec/core/j2735_202409/include/NMEA-MsgType.h similarity index 100% rename from j2735codec/core/202409/include/NMEA-MsgType.h rename to j2735codec/core/j2735_202409/include/NMEA-MsgType.h diff --git a/j2735codec/core/202409/include/NMEA-Payload.h b/j2735codec/core/j2735_202409/include/NMEA-Payload.h similarity index 100% rename from j2735codec/core/202409/include/NMEA-Payload.h rename to j2735codec/core/j2735_202409/include/NMEA-Payload.h diff --git a/j2735codec/core/202409/include/NMEA-Revision.h b/j2735codec/core/j2735_202409/include/NMEA-Revision.h similarity index 100% rename from j2735codec/core/202409/include/NMEA-Revision.h rename to j2735codec/core/j2735_202409/include/NMEA-Revision.h diff --git a/j2735codec/core/202409/include/NMEAcorrections.h b/j2735codec/core/j2735_202409/include/NMEAcorrections.h similarity index 100% rename from j2735codec/core/202409/include/NMEAcorrections.h rename to j2735codec/core/j2735_202409/include/NMEAcorrections.h diff --git a/j2735codec/core/202409/include/NTCIPEssAirTemperature.h b/j2735codec/core/j2735_202409/include/NTCIPEssAirTemperature.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPEssAirTemperature.h rename to j2735codec/core/j2735_202409/include/NTCIPEssAirTemperature.h diff --git a/j2735codec/core/202409/include/NTCIPEssCloudSituationV4.h b/j2735codec/core/j2735_202409/include/NTCIPEssCloudSituationV4.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPEssCloudSituationV4.h rename to j2735codec/core/j2735_202409/include/NTCIPEssCloudSituationV4.h diff --git a/j2735codec/core/202409/include/NTCIPEssDewpointTemp.h b/j2735codec/core/j2735_202409/include/NTCIPEssDewpointTemp.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPEssDewpointTemp.h rename to j2735codec/core/j2735_202409/include/NTCIPEssDewpointTemp.h diff --git a/j2735codec/core/202409/include/NTCIPEssPaveTreatProductForm.h b/j2735codec/core/j2735_202409/include/NTCIPEssPaveTreatProductForm.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPEssPaveTreatProductForm.h rename to j2735codec/core/j2735_202409/include/NTCIPEssPaveTreatProductForm.h diff --git a/j2735codec/core/202409/include/NTCIPEssPaveTreatProductType.h b/j2735codec/core/j2735_202409/include/NTCIPEssPaveTreatProductType.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPEssPaveTreatProductType.h rename to j2735codec/core/j2735_202409/include/NTCIPEssPaveTreatProductType.h diff --git a/j2735codec/core/202409/include/NTCIPEssPaveTreatmentAmount.h b/j2735codec/core/j2735_202409/include/NTCIPEssPaveTreatmentAmount.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPEssPaveTreatmentAmount.h rename to j2735codec/core/j2735_202409/include/NTCIPEssPaveTreatmentAmount.h diff --git a/j2735codec/core/202409/include/NTCIPEssPaveTreatmentWidth.h b/j2735codec/core/j2735_202409/include/NTCIPEssPaveTreatmentWidth.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPEssPaveTreatmentWidth.h rename to j2735codec/core/j2735_202409/include/NTCIPEssPaveTreatmentWidth.h diff --git a/j2735codec/core/202409/include/NTCIPEssPavementTreatmentLatitude.h b/j2735codec/core/j2735_202409/include/NTCIPEssPavementTreatmentLatitude.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPEssPavementTreatmentLatitude.h rename to j2735codec/core/j2735_202409/include/NTCIPEssPavementTreatmentLatitude.h diff --git a/j2735codec/core/202409/include/NTCIPEssPavementTreatmentLocation.h b/j2735codec/core/j2735_202409/include/NTCIPEssPavementTreatmentLocation.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPEssPavementTreatmentLocation.h rename to j2735codec/core/j2735_202409/include/NTCIPEssPavementTreatmentLocation.h diff --git a/j2735codec/core/202409/include/NTCIPEssPavementTreatmentLongitude.h b/j2735codec/core/j2735_202409/include/NTCIPEssPavementTreatmentLongitude.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPEssPavementTreatmentLongitude.h rename to j2735codec/core/j2735_202409/include/NTCIPEssPavementTreatmentLongitude.h diff --git a/j2735codec/core/202409/include/NTCIPEssPercentProductMix.h b/j2735codec/core/j2735_202409/include/NTCIPEssPercentProductMix.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPEssPercentProductMix.h rename to j2735codec/core/j2735_202409/include/NTCIPEssPercentProductMix.h diff --git a/j2735codec/core/202409/include/NTCIPEssPressureSensorAtmosphericPressure.h b/j2735codec/core/j2735_202409/include/NTCIPEssPressureSensorAtmosphericPressure.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPEssPressureSensorAtmosphericPressure.h rename to j2735codec/core/j2735_202409/include/NTCIPEssPressureSensorAtmosphericPressure.h diff --git a/j2735codec/core/202409/include/NTCIPEssSurfaceIceOrWaterDepth.h b/j2735codec/core/j2735_202409/include/NTCIPEssSurfaceIceOrWaterDepth.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPEssSurfaceIceOrWaterDepth.h rename to j2735codec/core/j2735_202409/include/NTCIPEssSurfaceIceOrWaterDepth.h diff --git a/j2735codec/core/202409/include/NTCIPEssSurfaceTemperature.h b/j2735codec/core/j2735_202409/include/NTCIPEssSurfaceTemperature.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPEssSurfaceTemperature.h rename to j2735codec/core/j2735_202409/include/NTCIPEssSurfaceTemperature.h diff --git a/j2735codec/core/202409/include/NTCIPEssTemperatureSensorHeight.h b/j2735codec/core/j2735_202409/include/NTCIPEssTemperatureSensorHeight.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPEssTemperatureSensorHeight.h rename to j2735codec/core/j2735_202409/include/NTCIPEssTemperatureSensorHeight.h diff --git a/j2735codec/core/202409/include/NTCIPEssTotalRadiationPeriod.h b/j2735codec/core/j2735_202409/include/NTCIPEssTotalRadiationPeriod.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPEssTotalRadiationPeriod.h rename to j2735codec/core/j2735_202409/include/NTCIPEssTotalRadiationPeriod.h diff --git a/j2735codec/core/202409/include/NTCIPEssTotalRadiationV4.h b/j2735codec/core/j2735_202409/include/NTCIPEssTotalRadiationV4.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPEssTotalRadiationV4.h rename to j2735codec/core/j2735_202409/include/NTCIPEssTotalRadiationV4.h diff --git a/j2735codec/core/202409/include/NTCIPEssVisibility.h b/j2735codec/core/j2735_202409/include/NTCIPEssVisibility.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPEssVisibility.h rename to j2735codec/core/j2735_202409/include/NTCIPEssVisibility.h diff --git a/j2735codec/core/202409/include/NTCIPEssVisibilitySituation.h b/j2735codec/core/j2735_202409/include/NTCIPEssVisibilitySituation.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPEssVisibilitySituation.h rename to j2735codec/core/j2735_202409/include/NTCIPEssVisibilitySituation.h diff --git a/j2735codec/core/202409/include/NTCIPHumiditySensorRelativeHumidity.h b/j2735codec/core/j2735_202409/include/NTCIPHumiditySensorRelativeHumidity.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPHumiditySensorRelativeHumidity.h rename to j2735codec/core/j2735_202409/include/NTCIPHumiditySensorRelativeHumidity.h diff --git a/j2735codec/core/202409/include/NTCIPPavementSensorSurfaceCondition.h b/j2735codec/core/j2735_202409/include/NTCIPPavementSensorSurfaceCondition.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPPavementSensorSurfaceCondition.h rename to j2735codec/core/j2735_202409/include/NTCIPPavementSensorSurfaceCondition.h diff --git a/j2735codec/core/202409/include/NTCIPPrecipitationSensorPrecipSituation.h b/j2735codec/core/j2735_202409/include/NTCIPPrecipitationSensorPrecipSituation.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPPrecipitationSensorPrecipSituation.h rename to j2735codec/core/j2735_202409/include/NTCIPPrecipitationSensorPrecipSituation.h diff --git a/j2735codec/core/202409/include/NTCIPWindSensorAvgDirection.h b/j2735codec/core/j2735_202409/include/NTCIPWindSensorAvgDirection.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPWindSensorAvgDirection.h rename to j2735codec/core/j2735_202409/include/NTCIPWindSensorAvgDirection.h diff --git a/j2735codec/core/202409/include/NTCIPWindSensorAvgSpeed.h b/j2735codec/core/j2735_202409/include/NTCIPWindSensorAvgSpeed.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPWindSensorAvgSpeed.h rename to j2735codec/core/j2735_202409/include/NTCIPWindSensorAvgSpeed.h diff --git a/j2735codec/core/202409/include/NTCIPWindSensorGustDirection.h b/j2735codec/core/j2735_202409/include/NTCIPWindSensorGustDirection.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPWindSensorGustDirection.h rename to j2735codec/core/j2735_202409/include/NTCIPWindSensorGustDirection.h diff --git a/j2735codec/core/202409/include/NTCIPWindSensorGustSpeed.h b/j2735codec/core/j2735_202409/include/NTCIPWindSensorGustSpeed.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPWindSensorGustSpeed.h rename to j2735codec/core/j2735_202409/include/NTCIPWindSensorGustSpeed.h diff --git a/j2735codec/core/202409/include/NTCIPWindSensorSpotDirection.h b/j2735codec/core/j2735_202409/include/NTCIPWindSensorSpotDirection.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPWindSensorSpotDirection.h rename to j2735codec/core/j2735_202409/include/NTCIPWindSensorSpotDirection.h diff --git a/j2735codec/core/202409/include/NTCIPWindSensorSpotSpeed.h b/j2735codec/core/j2735_202409/include/NTCIPWindSensorSpotSpeed.h similarity index 100% rename from j2735codec/core/202409/include/NTCIPWindSensorSpotSpeed.h rename to j2735codec/core/j2735_202409/include/NTCIPWindSensorSpotSpeed.h diff --git a/j2735codec/core/202409/include/NULL.h b/j2735codec/core/j2735_202409/include/NULL.h similarity index 100% rename from j2735codec/core/202409/include/NULL.h rename to j2735codec/core/j2735_202409/include/NULL.h diff --git a/j2735codec/core/202409/include/NamedObjects.h b/j2735codec/core/j2735_202409/include/NamedObjects.h similarity index 100% rename from j2735codec/core/202409/include/NamedObjects.h rename to j2735codec/core/j2735_202409/include/NamedObjects.h diff --git a/j2735codec/core/202409/include/NativeEnumerated.h b/j2735codec/core/j2735_202409/include/NativeEnumerated.h similarity index 100% rename from j2735codec/core/202409/include/NativeEnumerated.h rename to j2735codec/core/j2735_202409/include/NativeEnumerated.h diff --git a/j2735codec/core/202409/include/NativeInteger.h b/j2735codec/core/j2735_202409/include/NativeInteger.h similarity index 100% rename from j2735codec/core/202409/include/NativeInteger.h rename to j2735codec/core/j2735_202409/include/NativeInteger.h diff --git a/j2735codec/core/202409/include/Node-LL-24B.h b/j2735codec/core/j2735_202409/include/Node-LL-24B.h similarity index 100% rename from j2735codec/core/202409/include/Node-LL-24B.h rename to j2735codec/core/j2735_202409/include/Node-LL-24B.h diff --git a/j2735codec/core/202409/include/Node-LL-28B.h b/j2735codec/core/j2735_202409/include/Node-LL-28B.h similarity index 100% rename from j2735codec/core/202409/include/Node-LL-28B.h rename to j2735codec/core/j2735_202409/include/Node-LL-28B.h diff --git a/j2735codec/core/202409/include/Node-LL-32B.h b/j2735codec/core/j2735_202409/include/Node-LL-32B.h similarity index 100% rename from j2735codec/core/202409/include/Node-LL-32B.h rename to j2735codec/core/j2735_202409/include/Node-LL-32B.h diff --git a/j2735codec/core/202409/include/Node-LL-36B.h b/j2735codec/core/j2735_202409/include/Node-LL-36B.h similarity index 100% rename from j2735codec/core/202409/include/Node-LL-36B.h rename to j2735codec/core/j2735_202409/include/Node-LL-36B.h diff --git a/j2735codec/core/202409/include/Node-LL-44B.h b/j2735codec/core/j2735_202409/include/Node-LL-44B.h similarity index 100% rename from j2735codec/core/202409/include/Node-LL-44B.h rename to j2735codec/core/j2735_202409/include/Node-LL-44B.h diff --git a/j2735codec/core/202409/include/Node-LL-48B.h b/j2735codec/core/j2735_202409/include/Node-LL-48B.h similarity index 100% rename from j2735codec/core/202409/include/Node-LL-48B.h rename to j2735codec/core/j2735_202409/include/Node-LL-48B.h diff --git a/j2735codec/core/202409/include/Node-LLdms-48b.h b/j2735codec/core/j2735_202409/include/Node-LLdms-48b.h similarity index 100% rename from j2735codec/core/202409/include/Node-LLdms-48b.h rename to j2735codec/core/j2735_202409/include/Node-LLdms-48b.h diff --git a/j2735codec/core/202409/include/Node-LLdms-80b.h b/j2735codec/core/j2735_202409/include/Node-LLdms-80b.h similarity index 100% rename from j2735codec/core/202409/include/Node-LLdms-80b.h rename to j2735codec/core/j2735_202409/include/Node-LLdms-80b.h diff --git a/j2735codec/core/202409/include/Node-LLmD-64b.h b/j2735codec/core/j2735_202409/include/Node-LLmD-64b.h similarity index 100% rename from j2735codec/core/202409/include/Node-LLmD-64b.h rename to j2735codec/core/j2735_202409/include/Node-LLmD-64b.h diff --git a/j2735codec/core/202409/include/Node-XY-20b.h b/j2735codec/core/j2735_202409/include/Node-XY-20b.h similarity index 100% rename from j2735codec/core/202409/include/Node-XY-20b.h rename to j2735codec/core/j2735_202409/include/Node-XY-20b.h diff --git a/j2735codec/core/202409/include/Node-XY-22b.h b/j2735codec/core/j2735_202409/include/Node-XY-22b.h similarity index 100% rename from j2735codec/core/202409/include/Node-XY-22b.h rename to j2735codec/core/j2735_202409/include/Node-XY-22b.h diff --git a/j2735codec/core/202409/include/Node-XY-24b.h b/j2735codec/core/j2735_202409/include/Node-XY-24b.h similarity index 100% rename from j2735codec/core/202409/include/Node-XY-24b.h rename to j2735codec/core/j2735_202409/include/Node-XY-24b.h diff --git a/j2735codec/core/202409/include/Node-XY-26b.h b/j2735codec/core/j2735_202409/include/Node-XY-26b.h similarity index 100% rename from j2735codec/core/202409/include/Node-XY-26b.h rename to j2735codec/core/j2735_202409/include/Node-XY-26b.h diff --git a/j2735codec/core/202409/include/Node-XY-28b.h b/j2735codec/core/j2735_202409/include/Node-XY-28b.h similarity index 100% rename from j2735codec/core/202409/include/Node-XY-28b.h rename to j2735codec/core/j2735_202409/include/Node-XY-28b.h diff --git a/j2735codec/core/202409/include/Node-XY-32b.h b/j2735codec/core/j2735_202409/include/Node-XY-32b.h similarity index 100% rename from j2735codec/core/202409/include/Node-XY-32b.h rename to j2735codec/core/j2735_202409/include/Node-XY-32b.h diff --git a/j2735codec/core/202409/include/NodeAttributeLL.h b/j2735codec/core/j2735_202409/include/NodeAttributeLL.h similarity index 100% rename from j2735codec/core/202409/include/NodeAttributeLL.h rename to j2735codec/core/j2735_202409/include/NodeAttributeLL.h diff --git a/j2735codec/core/202409/include/NodeAttributeLLList.h b/j2735codec/core/j2735_202409/include/NodeAttributeLLList.h similarity index 100% rename from j2735codec/core/202409/include/NodeAttributeLLList.h rename to j2735codec/core/j2735_202409/include/NodeAttributeLLList.h diff --git a/j2735codec/core/202409/include/NodeAttributeSetLL.h b/j2735codec/core/j2735_202409/include/NodeAttributeSetLL.h similarity index 100% rename from j2735codec/core/202409/include/NodeAttributeSetLL.h rename to j2735codec/core/j2735_202409/include/NodeAttributeSetLL.h diff --git a/j2735codec/core/202409/include/NodeAttributeSetXY.h b/j2735codec/core/j2735_202409/include/NodeAttributeSetXY.h similarity index 100% rename from j2735codec/core/202409/include/NodeAttributeSetXY.h rename to j2735codec/core/j2735_202409/include/NodeAttributeSetXY.h diff --git a/j2735codec/core/202409/include/NodeAttributeXY.h b/j2735codec/core/j2735_202409/include/NodeAttributeXY.h similarity index 100% rename from j2735codec/core/202409/include/NodeAttributeXY.h rename to j2735codec/core/j2735_202409/include/NodeAttributeXY.h diff --git a/j2735codec/core/202409/include/NodeAttributeXYList.h b/j2735codec/core/j2735_202409/include/NodeAttributeXYList.h similarity index 100% rename from j2735codec/core/202409/include/NodeAttributeXYList.h rename to j2735codec/core/j2735_202409/include/NodeAttributeXYList.h diff --git a/j2735codec/core/202409/include/NodeLL.h b/j2735codec/core/j2735_202409/include/NodeLL.h similarity index 100% rename from j2735codec/core/202409/include/NodeLL.h rename to j2735codec/core/j2735_202409/include/NodeLL.h diff --git a/j2735codec/core/202409/include/NodeListLL.h b/j2735codec/core/j2735_202409/include/NodeListLL.h similarity index 100% rename from j2735codec/core/202409/include/NodeListLL.h rename to j2735codec/core/j2735_202409/include/NodeListLL.h diff --git a/j2735codec/core/202409/include/NodeListXY.h b/j2735codec/core/j2735_202409/include/NodeListXY.h similarity index 100% rename from j2735codec/core/202409/include/NodeListXY.h rename to j2735codec/core/j2735_202409/include/NodeListXY.h diff --git a/j2735codec/core/202409/include/NodeOffsetPointLL.h b/j2735codec/core/j2735_202409/include/NodeOffsetPointLL.h similarity index 100% rename from j2735codec/core/202409/include/NodeOffsetPointLL.h rename to j2735codec/core/j2735_202409/include/NodeOffsetPointLL.h diff --git a/j2735codec/core/202409/include/NodeOffsetPointXY-addGrpB.h b/j2735codec/core/j2735_202409/include/NodeOffsetPointXY-addGrpB.h similarity index 100% rename from j2735codec/core/202409/include/NodeOffsetPointXY-addGrpB.h rename to j2735codec/core/j2735_202409/include/NodeOffsetPointXY-addGrpB.h diff --git a/j2735codec/core/202409/include/NodeOffsetPointXY.h b/j2735codec/core/j2735_202409/include/NodeOffsetPointXY.h similarity index 100% rename from j2735codec/core/202409/include/NodeOffsetPointXY.h rename to j2735codec/core/j2735_202409/include/NodeOffsetPointXY.h diff --git a/j2735codec/core/202409/include/NodePointLLE.h b/j2735codec/core/j2735_202409/include/NodePointLLE.h similarity index 100% rename from j2735codec/core/202409/include/NodePointLLE.h rename to j2735codec/core/j2735_202409/include/NodePointLLE.h diff --git a/j2735codec/core/202409/include/NodeSetLL.h b/j2735codec/core/j2735_202409/include/NodeSetLL.h similarity index 100% rename from j2735codec/core/202409/include/NodeSetLL.h rename to j2735codec/core/j2735_202409/include/NodeSetLL.h diff --git a/j2735codec/core/202409/include/NodeSetXY.h b/j2735codec/core/j2735_202409/include/NodeSetXY.h similarity index 100% rename from j2735codec/core/202409/include/NodeSetXY.h rename to j2735codec/core/j2735_202409/include/NodeSetXY.h diff --git a/j2735codec/core/202409/include/NodeXY.h b/j2735codec/core/j2735_202409/include/NodeXY.h similarity index 100% rename from j2735codec/core/202409/include/NodeXY.h rename to j2735codec/core/j2735_202409/include/NodeXY.h diff --git a/j2735codec/core/202409/include/NtcipAirTemperature.h b/j2735codec/core/j2735_202409/include/NtcipAirTemperature.h similarity index 100% rename from j2735codec/core/202409/include/NtcipAirTemperature.h rename to j2735codec/core/j2735_202409/include/NtcipAirTemperature.h diff --git a/j2735codec/core/202409/include/NtcipAtmosphericPressure.h b/j2735codec/core/j2735_202409/include/NtcipAtmosphericPressure.h similarity index 100% rename from j2735codec/core/202409/include/NtcipAtmosphericPressure.h rename to j2735codec/core/j2735_202409/include/NtcipAtmosphericPressure.h diff --git a/j2735codec/core/202409/include/NtcipCloudSituation.h b/j2735codec/core/j2735_202409/include/NtcipCloudSituation.h similarity index 100% rename from j2735codec/core/202409/include/NtcipCloudSituation.h rename to j2735codec/core/j2735_202409/include/NtcipCloudSituation.h diff --git a/j2735codec/core/202409/include/NtcipDewPoint.h b/j2735codec/core/j2735_202409/include/NtcipDewPoint.h similarity index 100% rename from j2735codec/core/202409/include/NtcipDewPoint.h rename to j2735codec/core/j2735_202409/include/NtcipDewPoint.h diff --git a/j2735codec/core/202409/include/NtcipEssData.h b/j2735codec/core/j2735_202409/include/NtcipEssData.h similarity index 100% rename from j2735codec/core/202409/include/NtcipEssData.h rename to j2735codec/core/j2735_202409/include/NtcipEssData.h diff --git a/j2735codec/core/202409/include/NtcipPavement.h b/j2735codec/core/j2735_202409/include/NtcipPavement.h similarity index 100% rename from j2735codec/core/202409/include/NtcipPavement.h rename to j2735codec/core/j2735_202409/include/NtcipPavement.h diff --git a/j2735codec/core/202409/include/NtcipPavementTreatment.h b/j2735codec/core/j2735_202409/include/NtcipPavementTreatment.h similarity index 100% rename from j2735codec/core/202409/include/NtcipPavementTreatment.h rename to j2735codec/core/j2735_202409/include/NtcipPavementTreatment.h diff --git a/j2735codec/core/202409/include/NtcipPrecipitation.h b/j2735codec/core/j2735_202409/include/NtcipPrecipitation.h similarity index 100% rename from j2735codec/core/202409/include/NtcipPrecipitation.h rename to j2735codec/core/j2735_202409/include/NtcipPrecipitation.h diff --git a/j2735codec/core/202409/include/NtcipRelativeHumidity.h b/j2735codec/core/j2735_202409/include/NtcipRelativeHumidity.h similarity index 100% rename from j2735codec/core/202409/include/NtcipRelativeHumidity.h rename to j2735codec/core/j2735_202409/include/NtcipRelativeHumidity.h diff --git a/j2735codec/core/202409/include/NtcipSolarRadiation.h b/j2735codec/core/j2735_202409/include/NtcipSolarRadiation.h similarity index 100% rename from j2735codec/core/202409/include/NtcipSolarRadiation.h rename to j2735codec/core/j2735_202409/include/NtcipSolarRadiation.h diff --git a/j2735codec/core/202409/include/NtcipVisibility.h b/j2735codec/core/j2735_202409/include/NtcipVisibility.h similarity index 100% rename from j2735codec/core/202409/include/NtcipVisibility.h rename to j2735codec/core/j2735_202409/include/NtcipVisibility.h diff --git a/j2735codec/core/202409/include/NtcipVisibilitySituation.h b/j2735codec/core/j2735_202409/include/NtcipVisibilitySituation.h similarity index 100% rename from j2735codec/core/202409/include/NtcipVisibilitySituation.h rename to j2735codec/core/j2735_202409/include/NtcipVisibilitySituation.h diff --git a/j2735codec/core/202409/include/NtcipWind.h b/j2735codec/core/j2735_202409/include/NtcipWind.h similarity index 100% rename from j2735codec/core/202409/include/NtcipWind.h rename to j2735codec/core/j2735_202409/include/NtcipWind.h diff --git a/j2735codec/core/202409/include/NumberOfAxles.h b/j2735codec/core/j2735_202409/include/NumberOfAxles.h similarity index 100% rename from j2735codec/core/202409/include/NumberOfAxles.h rename to j2735codec/core/j2735_202409/include/NumberOfAxles.h diff --git a/j2735codec/core/202409/include/NumberOfParticipantsInCluster.h b/j2735codec/core/j2735_202409/include/NumberOfParticipantsInCluster.h similarity index 100% rename from j2735codec/core/202409/include/NumberOfParticipantsInCluster.h rename to j2735codec/core/j2735_202409/include/NumberOfParticipantsInCluster.h diff --git a/j2735codec/core/202409/include/OBJECT_IDENTIFIER.h b/j2735codec/core/j2735_202409/include/OBJECT_IDENTIFIER.h similarity index 100% rename from j2735codec/core/202409/include/OBJECT_IDENTIFIER.h rename to j2735codec/core/j2735_202409/include/OBJECT_IDENTIFIER.h diff --git a/j2735codec/core/202409/include/OCTET_STRING.h b/j2735codec/core/j2735_202409/include/OCTET_STRING.h similarity index 100% rename from j2735codec/core/202409/include/OCTET_STRING.h rename to j2735codec/core/j2735_202409/include/OCTET_STRING.h diff --git a/j2735codec/core/202409/include/OPEN_TYPE.h b/j2735codec/core/j2735_202409/include/OPEN_TYPE.h similarity index 100% rename from j2735codec/core/202409/include/OPEN_TYPE.h rename to j2735codec/core/j2735_202409/include/OPEN_TYPE.h diff --git a/j2735codec/core/202409/include/ObeId.h b/j2735codec/core/j2735_202409/include/ObeId.h similarity index 100% rename from j2735codec/core/202409/include/ObeId.h rename to j2735codec/core/j2735_202409/include/ObeId.h diff --git a/j2735codec/core/202409/include/ObjectCount.h b/j2735codec/core/j2735_202409/include/ObjectCount.h similarity index 100% rename from j2735codec/core/202409/include/ObjectCount.h rename to j2735codec/core/j2735_202409/include/ObjectCount.h diff --git a/j2735codec/core/202409/include/ObjectDescriptor.h b/j2735codec/core/j2735_202409/include/ObjectDescriptor.h similarity index 100% rename from j2735codec/core/202409/include/ObjectDescriptor.h rename to j2735codec/core/j2735_202409/include/ObjectDescriptor.h diff --git a/j2735codec/core/202409/include/ObjectID.h b/j2735codec/core/j2735_202409/include/ObjectID.h similarity index 100% rename from j2735codec/core/202409/include/ObjectID.h rename to j2735codec/core/j2735_202409/include/ObjectID.h diff --git a/j2735codec/core/202409/include/ObjectType.h b/j2735codec/core/j2735_202409/include/ObjectType.h similarity index 100% rename from j2735codec/core/202409/include/ObjectType.h rename to j2735codec/core/j2735_202409/include/ObjectType.h diff --git a/j2735codec/core/202409/include/Objects.h b/j2735codec/core/j2735_202409/include/Objects.h similarity index 100% rename from j2735codec/core/202409/include/Objects.h rename to j2735codec/core/j2735_202409/include/Objects.h diff --git a/j2735codec/core/202409/include/ObstacleDetection.h b/j2735codec/core/j2735_202409/include/ObstacleDetection.h similarity index 100% rename from j2735codec/core/202409/include/ObstacleDetection.h rename to j2735codec/core/j2735_202409/include/ObstacleDetection.h diff --git a/j2735codec/core/202409/include/ObstacleDirection.h b/j2735codec/core/j2735_202409/include/ObstacleDirection.h similarity index 100% rename from j2735codec/core/202409/include/ObstacleDirection.h rename to j2735codec/core/j2735_202409/include/ObstacleDirection.h diff --git a/j2735codec/core/202409/include/ObstacleDistance.h b/j2735codec/core/j2735_202409/include/ObstacleDistance.h similarity index 100% rename from j2735codec/core/202409/include/ObstacleDistance.h rename to j2735codec/core/j2735_202409/include/ObstacleDistance.h diff --git a/j2735codec/core/202409/include/ObstacleSize.h b/j2735codec/core/j2735_202409/include/ObstacleSize.h similarity index 100% rename from j2735codec/core/202409/include/ObstacleSize.h rename to j2735codec/core/j2735_202409/include/ObstacleSize.h diff --git a/j2735codec/core/202409/include/ObstacleSizeConfidence.h b/j2735codec/core/j2735_202409/include/ObstacleSizeConfidence.h similarity index 100% rename from j2735codec/core/202409/include/ObstacleSizeConfidence.h rename to j2735codec/core/j2735_202409/include/ObstacleSizeConfidence.h diff --git a/j2735codec/core/202409/include/Obstruction.h b/j2735codec/core/j2735_202409/include/Obstruction.h similarity index 100% rename from j2735codec/core/202409/include/Obstruction.h rename to j2735codec/core/j2735_202409/include/Obstruction.h diff --git a/j2735codec/core/202409/include/Obstructions.h b/j2735codec/core/j2735_202409/include/Obstructions.h similarity index 100% rename from j2735codec/core/202409/include/Obstructions.h rename to j2735codec/core/j2735_202409/include/Obstructions.h diff --git a/j2735codec/core/202409/include/Offset-B09.h b/j2735codec/core/j2735_202409/include/Offset-B09.h similarity index 100% rename from j2735codec/core/202409/include/Offset-B09.h rename to j2735codec/core/j2735_202409/include/Offset-B09.h diff --git a/j2735codec/core/202409/include/Offset-B10.h b/j2735codec/core/j2735_202409/include/Offset-B10.h similarity index 100% rename from j2735codec/core/202409/include/Offset-B10.h rename to j2735codec/core/j2735_202409/include/Offset-B10.h diff --git a/j2735codec/core/202409/include/Offset-B11.h b/j2735codec/core/j2735_202409/include/Offset-B11.h similarity index 100% rename from j2735codec/core/202409/include/Offset-B11.h rename to j2735codec/core/j2735_202409/include/Offset-B11.h diff --git a/j2735codec/core/202409/include/Offset-B12.h b/j2735codec/core/j2735_202409/include/Offset-B12.h similarity index 100% rename from j2735codec/core/202409/include/Offset-B12.h rename to j2735codec/core/j2735_202409/include/Offset-B12.h diff --git a/j2735codec/core/202409/include/Offset-B13.h b/j2735codec/core/j2735_202409/include/Offset-B13.h similarity index 100% rename from j2735codec/core/202409/include/Offset-B13.h rename to j2735codec/core/j2735_202409/include/Offset-B13.h diff --git a/j2735codec/core/202409/include/Offset-B14.h b/j2735codec/core/j2735_202409/include/Offset-B14.h similarity index 100% rename from j2735codec/core/202409/include/Offset-B14.h rename to j2735codec/core/j2735_202409/include/Offset-B14.h diff --git a/j2735codec/core/202409/include/Offset-B16.h b/j2735codec/core/j2735_202409/include/Offset-B16.h similarity index 100% rename from j2735codec/core/202409/include/Offset-B16.h rename to j2735codec/core/j2735_202409/include/Offset-B16.h diff --git a/j2735codec/core/202409/include/Offset3D.h b/j2735codec/core/j2735_202409/include/Offset3D.h similarity index 100% rename from j2735codec/core/202409/include/Offset3D.h rename to j2735codec/core/j2735_202409/include/Offset3D.h diff --git a/j2735codec/core/202409/include/OffsetLL-B12.h b/j2735codec/core/j2735_202409/include/OffsetLL-B12.h similarity index 100% rename from j2735codec/core/202409/include/OffsetLL-B12.h rename to j2735codec/core/j2735_202409/include/OffsetLL-B12.h diff --git a/j2735codec/core/202409/include/OffsetLL-B14.h b/j2735codec/core/j2735_202409/include/OffsetLL-B14.h similarity index 100% rename from j2735codec/core/202409/include/OffsetLL-B14.h rename to j2735codec/core/j2735_202409/include/OffsetLL-B14.h diff --git a/j2735codec/core/202409/include/OffsetLL-B16.h b/j2735codec/core/j2735_202409/include/OffsetLL-B16.h similarity index 100% rename from j2735codec/core/202409/include/OffsetLL-B16.h rename to j2735codec/core/j2735_202409/include/OffsetLL-B16.h diff --git a/j2735codec/core/202409/include/OffsetLL-B18.h b/j2735codec/core/j2735_202409/include/OffsetLL-B18.h similarity index 100% rename from j2735codec/core/202409/include/OffsetLL-B18.h rename to j2735codec/core/j2735_202409/include/OffsetLL-B18.h diff --git a/j2735codec/core/202409/include/OffsetLL-B22.h b/j2735codec/core/j2735_202409/include/OffsetLL-B22.h similarity index 100% rename from j2735codec/core/202409/include/OffsetLL-B22.h rename to j2735codec/core/j2735_202409/include/OffsetLL-B22.h diff --git a/j2735codec/core/202409/include/OffsetLL-B24.h b/j2735codec/core/j2735_202409/include/OffsetLL-B24.h similarity index 100% rename from j2735codec/core/202409/include/OffsetLL-B24.h rename to j2735codec/core/j2735_202409/include/OffsetLL-B24.h diff --git a/j2735codec/core/202409/include/OffsetSystem.h b/j2735codec/core/j2735_202409/include/OffsetSystem.h similarity index 100% rename from j2735codec/core/202409/include/OffsetSystem.h rename to j2735codec/core/j2735_202409/include/OffsetSystem.h diff --git a/j2735codec/core/202409/include/OperatorDefined.h b/j2735codec/core/j2735_202409/include/OperatorDefined.h similarity index 100% rename from j2735codec/core/202409/include/OperatorDefined.h rename to j2735codec/core/j2735_202409/include/OperatorDefined.h diff --git a/j2735codec/core/202409/include/OverlayLaneList.h b/j2735codec/core/j2735_202409/include/OverlayLaneList.h similarity index 100% rename from j2735codec/core/202409/include/OverlayLaneList.h rename to j2735codec/core/j2735_202409/include/OverlayLaneList.h diff --git a/j2735codec/core/202409/include/Parked.h b/j2735codec/core/j2735_202409/include/Parked.h similarity index 100% rename from j2735codec/core/202409/include/Parked.h rename to j2735codec/core/j2735_202409/include/Parked.h diff --git a/j2735codec/core/202409/include/ParkingInformation.h b/j2735codec/core/j2735_202409/include/ParkingInformation.h similarity index 100% rename from j2735codec/core/202409/include/ParkingInformation.h rename to j2735codec/core/j2735_202409/include/ParkingInformation.h diff --git a/j2735codec/core/202409/include/PartIIcontent.h b/j2735codec/core/j2735_202409/include/PartIIcontent.h similarity index 100% rename from j2735codec/core/202409/include/PartIIcontent.h rename to j2735codec/core/j2735_202409/include/PartIIcontent.h diff --git a/j2735codec/core/202409/include/Particulate.h b/j2735codec/core/j2735_202409/include/Particulate.h similarity index 100% rename from j2735codec/core/202409/include/Particulate.h rename to j2735codec/core/j2735_202409/include/Particulate.h diff --git a/j2735codec/core/202409/include/PassengerCapacity.h b/j2735codec/core/j2735_202409/include/PassengerCapacity.h similarity index 100% rename from j2735codec/core/202409/include/PassengerCapacity.h rename to j2735codec/core/j2735_202409/include/PassengerCapacity.h diff --git a/j2735codec/core/202409/include/Path.h b/j2735codec/core/j2735_202409/include/Path.h similarity index 100% rename from j2735codec/core/202409/include/Path.h rename to j2735codec/core/j2735_202409/include/Path.h diff --git a/j2735codec/core/202409/include/PathHistory.h b/j2735codec/core/j2735_202409/include/PathHistory.h similarity index 100% rename from j2735codec/core/202409/include/PathHistory.h rename to j2735codec/core/j2735_202409/include/PathHistory.h diff --git a/j2735codec/core/202409/include/PathHistoryPoint.h b/j2735codec/core/j2735_202409/include/PathHistoryPoint.h similarity index 100% rename from j2735codec/core/202409/include/PathHistoryPoint.h rename to j2735codec/core/j2735_202409/include/PathHistoryPoint.h diff --git a/j2735codec/core/202409/include/PathHistoryPointList.h b/j2735codec/core/j2735_202409/include/PathHistoryPointList.h similarity index 100% rename from j2735codec/core/202409/include/PathHistoryPointList.h rename to j2735codec/core/j2735_202409/include/PathHistoryPointList.h diff --git a/j2735codec/core/202409/include/PathList.h b/j2735codec/core/j2735_202409/include/PathList.h similarity index 100% rename from j2735codec/core/202409/include/PathList.h rename to j2735codec/core/j2735_202409/include/PathList.h diff --git a/j2735codec/core/202409/include/PathPoints.h b/j2735codec/core/j2735_202409/include/PathPoints.h similarity index 100% rename from j2735codec/core/202409/include/PathPoints.h rename to j2735codec/core/j2735_202409/include/PathPoints.h diff --git a/j2735codec/core/202409/include/PathPrediction.h b/j2735codec/core/j2735_202409/include/PathPrediction.h similarity index 100% rename from j2735codec/core/202409/include/PathPrediction.h rename to j2735codec/core/j2735_202409/include/PathPrediction.h diff --git a/j2735codec/core/202409/include/PavementConditions.h b/j2735codec/core/j2735_202409/include/PavementConditions.h similarity index 100% rename from j2735codec/core/202409/include/PavementConditions.h rename to j2735codec/core/j2735_202409/include/PavementConditions.h diff --git a/j2735codec/core/202409/include/PayUnit.h b/j2735codec/core/j2735_202409/include/PayUnit.h similarity index 100% rename from j2735codec/core/202409/include/PayUnit.h rename to j2735codec/core/j2735_202409/include/PayUnit.h diff --git a/j2735codec/core/202409/include/PayloadData.h b/j2735codec/core/j2735_202409/include/PayloadData.h similarity index 100% rename from j2735codec/core/202409/include/PayloadData.h rename to j2735codec/core/j2735_202409/include/PayloadData.h diff --git a/j2735codec/core/202409/include/PaymentFee.h b/j2735codec/core/j2735_202409/include/PaymentFee.h similarity index 100% rename from j2735codec/core/202409/include/PaymentFee.h rename to j2735codec/core/j2735_202409/include/PaymentFee.h diff --git a/j2735codec/core/202409/include/PaymentMeans.h b/j2735codec/core/j2735_202409/include/PaymentMeans.h similarity index 100% rename from j2735codec/core/202409/include/PaymentMeans.h rename to j2735codec/core/j2735_202409/include/PaymentMeans.h diff --git a/j2735codec/core/202409/include/PaymentMeansBalance.h b/j2735codec/core/j2735_202409/include/PaymentMeansBalance.h similarity index 100% rename from j2735codec/core/202409/include/PaymentMeansBalance.h rename to j2735codec/core/j2735_202409/include/PaymentMeansBalance.h diff --git a/j2735codec/core/202409/include/PaymentSecurityData.h b/j2735codec/core/j2735_202409/include/PaymentSecurityData.h similarity index 100% rename from j2735codec/core/202409/include/PaymentSecurityData.h rename to j2735codec/core/j2735_202409/include/PaymentSecurityData.h diff --git a/j2735codec/core/202409/include/PedestrianBicycleDetect.h b/j2735codec/core/j2735_202409/include/PedestrianBicycleDetect.h similarity index 100% rename from j2735codec/core/202409/include/PedestrianBicycleDetect.h rename to j2735codec/core/j2735_202409/include/PedestrianBicycleDetect.h diff --git a/j2735codec/core/202409/include/PedestrianCall.h b/j2735codec/core/j2735_202409/include/PedestrianCall.h similarity index 100% rename from j2735codec/core/202409/include/PedestrianCall.h rename to j2735codec/core/j2735_202409/include/PedestrianCall.h diff --git a/j2735codec/core/202409/include/PerAxleWeightCharges.h b/j2735codec/core/j2735_202409/include/PerAxleWeightCharges.h similarity index 100% rename from j2735codec/core/202409/include/PerAxleWeightCharges.h rename to j2735codec/core/j2735_202409/include/PerAxleWeightCharges.h diff --git a/j2735codec/core/202409/include/Period.h b/j2735codec/core/j2735_202409/include/Period.h similarity index 100% rename from j2735codec/core/202409/include/Period.h rename to j2735codec/core/j2735_202409/include/Period.h diff --git a/j2735codec/core/202409/include/PermissiveNonProtected.h b/j2735codec/core/j2735_202409/include/PermissiveNonProtected.h similarity index 100% rename from j2735codec/core/202409/include/PermissiveNonProtected.h rename to j2735codec/core/j2735_202409/include/PermissiveNonProtected.h diff --git a/j2735codec/core/202409/include/PersonalAccountNumber.h b/j2735codec/core/j2735_202409/include/PersonalAccountNumber.h similarity index 100% rename from j2735codec/core/202409/include/PersonalAccountNumber.h rename to j2735codec/core/j2735_202409/include/PersonalAccountNumber.h diff --git a/j2735codec/core/202409/include/PersonalAssistive.h b/j2735codec/core/j2735_202409/include/PersonalAssistive.h similarity index 100% rename from j2735codec/core/202409/include/PersonalAssistive.h rename to j2735codec/core/j2735_202409/include/PersonalAssistive.h diff --git a/j2735codec/core/202409/include/PersonalClusterRadius.h b/j2735codec/core/j2735_202409/include/PersonalClusterRadius.h similarity index 100% rename from j2735codec/core/202409/include/PersonalClusterRadius.h rename to j2735codec/core/j2735_202409/include/PersonalClusterRadius.h diff --git a/j2735codec/core/202409/include/PersonalCrossingInProgress.h b/j2735codec/core/j2735_202409/include/PersonalCrossingInProgress.h similarity index 100% rename from j2735codec/core/202409/include/PersonalCrossingInProgress.h rename to j2735codec/core/j2735_202409/include/PersonalCrossingInProgress.h diff --git a/j2735codec/core/202409/include/PersonalCrossingRequest.h b/j2735codec/core/j2735_202409/include/PersonalCrossingRequest.h similarity index 100% rename from j2735codec/core/202409/include/PersonalCrossingRequest.h rename to j2735codec/core/j2735_202409/include/PersonalCrossingRequest.h diff --git a/j2735codec/core/202409/include/PersonalDeviceUsageState.h b/j2735codec/core/j2735_202409/include/PersonalDeviceUsageState.h similarity index 100% rename from j2735codec/core/202409/include/PersonalDeviceUsageState.h rename to j2735codec/core/j2735_202409/include/PersonalDeviceUsageState.h diff --git a/j2735codec/core/202409/include/PersonalDeviceUserType.h b/j2735codec/core/j2735_202409/include/PersonalDeviceUserType.h similarity index 100% rename from j2735codec/core/202409/include/PersonalDeviceUserType.h rename to j2735codec/core/j2735_202409/include/PersonalDeviceUserType.h diff --git a/j2735codec/core/202409/include/PersonalSafetyMessage.h b/j2735codec/core/j2735_202409/include/PersonalSafetyMessage.h similarity index 100% rename from j2735codec/core/202409/include/PersonalSafetyMessage.h rename to j2735codec/core/j2735_202409/include/PersonalSafetyMessage.h diff --git a/j2735codec/core/202409/include/PersonalSafetyMessage2.h b/j2735codec/core/j2735_202409/include/PersonalSafetyMessage2.h similarity index 100% rename from j2735codec/core/202409/include/PersonalSafetyMessage2.h rename to j2735codec/core/j2735_202409/include/PersonalSafetyMessage2.h diff --git a/j2735codec/core/202409/include/Pitch.h b/j2735codec/core/j2735_202409/include/Pitch.h similarity index 100% rename from j2735codec/core/202409/include/Pitch.h rename to j2735codec/core/j2735_202409/include/Pitch.h diff --git a/j2735codec/core/202409/include/PitchDetected.h b/j2735codec/core/j2735_202409/include/PitchDetected.h similarity index 100% rename from j2735codec/core/202409/include/PitchDetected.h rename to j2735codec/core/j2735_202409/include/PitchDetected.h diff --git a/j2735codec/core/202409/include/PitchRateConfidence.h b/j2735codec/core/j2735_202409/include/PitchRateConfidence.h similarity index 100% rename from j2735codec/core/202409/include/PitchRateConfidence.h rename to j2735codec/core/j2735_202409/include/PitchRateConfidence.h diff --git a/j2735codec/core/202409/include/PivotPointDescription.h b/j2735codec/core/j2735_202409/include/PivotPointDescription.h similarity index 100% rename from j2735codec/core/202409/include/PivotPointDescription.h rename to j2735codec/core/j2735_202409/include/PivotPointDescription.h diff --git a/j2735codec/core/202409/include/PivotingAllowed.h b/j2735codec/core/j2735_202409/include/PivotingAllowed.h similarity index 100% rename from j2735codec/core/202409/include/PivotingAllowed.h rename to j2735codec/core/j2735_202409/include/PivotingAllowed.h diff --git a/j2735codec/core/202409/include/Point.h b/j2735codec/core/j2735_202409/include/Point.h similarity index 100% rename from j2735codec/core/202409/include/Point.h rename to j2735codec/core/j2735_202409/include/Point.h diff --git a/j2735codec/core/202409/include/PortlandCement.h b/j2735codec/core/j2735_202409/include/PortlandCement.h similarity index 100% rename from j2735codec/core/202409/include/PortlandCement.h rename to j2735codec/core/j2735_202409/include/PortlandCement.h diff --git a/j2735codec/core/202409/include/PortlandCementType.h b/j2735codec/core/j2735_202409/include/PortlandCementType.h similarity index 100% rename from j2735codec/core/202409/include/PortlandCementType.h rename to j2735codec/core/j2735_202409/include/PortlandCementType.h diff --git a/j2735codec/core/202409/include/Position3D-addGrpB.h b/j2735codec/core/j2735_202409/include/Position3D-addGrpB.h similarity index 100% rename from j2735codec/core/202409/include/Position3D-addGrpB.h rename to j2735codec/core/j2735_202409/include/Position3D-addGrpB.h diff --git a/j2735codec/core/202409/include/Position3D-addGrpC.h b/j2735codec/core/j2735_202409/include/Position3D-addGrpC.h similarity index 100% rename from j2735codec/core/202409/include/Position3D-addGrpC.h rename to j2735codec/core/j2735_202409/include/Position3D-addGrpC.h diff --git a/j2735codec/core/202409/include/Position3D.h b/j2735codec/core/j2735_202409/include/Position3D.h similarity index 100% rename from j2735codec/core/202409/include/Position3D.h rename to j2735codec/core/j2735_202409/include/Position3D.h diff --git a/j2735codec/core/202409/include/PositionConfidence.h b/j2735codec/core/j2735_202409/include/PositionConfidence.h similarity index 100% rename from j2735codec/core/202409/include/PositionConfidence.h rename to j2735codec/core/j2735_202409/include/PositionConfidence.h diff --git a/j2735codec/core/202409/include/PositionConfidenceSet.h b/j2735codec/core/j2735_202409/include/PositionConfidenceSet.h similarity index 100% rename from j2735codec/core/202409/include/PositionConfidenceSet.h rename to j2735codec/core/j2735_202409/include/PositionConfidenceSet.h diff --git a/j2735codec/core/202409/include/PositionalAccuracy.h b/j2735codec/core/j2735_202409/include/PositionalAccuracy.h similarity index 100% rename from j2735codec/core/202409/include/PositionalAccuracy.h rename to j2735codec/core/j2735_202409/include/PositionalAccuracy.h diff --git a/j2735codec/core/202409/include/Precipitation.h b/j2735codec/core/j2735_202409/include/Precipitation.h similarity index 100% rename from j2735codec/core/202409/include/Precipitation.h rename to j2735codec/core/j2735_202409/include/Precipitation.h diff --git a/j2735codec/core/202409/include/PreemptPriorityList.h b/j2735codec/core/j2735_202409/include/PreemptPriorityList.h similarity index 100% rename from j2735codec/core/202409/include/PreemptPriorityList.h rename to j2735codec/core/j2735_202409/include/PreemptPriorityList.h diff --git a/j2735codec/core/202409/include/PrimaryRegionChargingInfo.h b/j2735codec/core/j2735_202409/include/PrimaryRegionChargingInfo.h similarity index 100% rename from j2735codec/core/202409/include/PrimaryRegionChargingInfo.h rename to j2735codec/core/j2735_202409/include/PrimaryRegionChargingInfo.h diff --git a/j2735codec/core/202409/include/PrimaryRegionState.h b/j2735codec/core/j2735_202409/include/PrimaryRegionState.h similarity index 100% rename from j2735codec/core/202409/include/PrimaryRegionState.h rename to j2735codec/core/j2735_202409/include/PrimaryRegionState.h diff --git a/j2735codec/core/202409/include/PrioritizationResponse.h b/j2735codec/core/j2735_202409/include/PrioritizationResponse.h similarity index 100% rename from j2735codec/core/202409/include/PrioritizationResponse.h rename to j2735codec/core/j2735_202409/include/PrioritizationResponse.h diff --git a/j2735codec/core/202409/include/PrioritizationResponseList.h b/j2735codec/core/j2735_202409/include/PrioritizationResponseList.h similarity index 100% rename from j2735codec/core/202409/include/PrioritizationResponseList.h rename to j2735codec/core/j2735_202409/include/PrioritizationResponseList.h diff --git a/j2735codec/core/202409/include/PrioritizationResponseStatus.h b/j2735codec/core/j2735_202409/include/PrioritizationResponseStatus.h similarity index 100% rename from j2735codec/core/202409/include/PrioritizationResponseStatus.h rename to j2735codec/core/j2735_202409/include/PrioritizationResponseStatus.h diff --git a/j2735codec/core/202409/include/Priority.h b/j2735codec/core/j2735_202409/include/Priority.h similarity index 100% rename from j2735codec/core/202409/include/Priority.h rename to j2735codec/core/j2735_202409/include/Priority.h diff --git a/j2735codec/core/202409/include/PriorityRequestType.h b/j2735codec/core/j2735_202409/include/PriorityRequestType.h similarity index 100% rename from j2735codec/core/202409/include/PriorityRequestType.h rename to j2735codec/core/j2735_202409/include/PriorityRequestType.h diff --git a/j2735codec/core/202409/include/PrivilegedEventFlags.h b/j2735codec/core/j2735_202409/include/PrivilegedEventFlags.h similarity index 100% rename from j2735codec/core/202409/include/PrivilegedEventFlags.h rename to j2735codec/core/j2735_202409/include/PrivilegedEventFlags.h diff --git a/j2735codec/core/202409/include/PrivilegedEvents.h b/j2735codec/core/j2735_202409/include/PrivilegedEvents.h similarity index 100% rename from j2735codec/core/202409/include/PrivilegedEvents.h rename to j2735codec/core/j2735_202409/include/PrivilegedEvents.h diff --git a/j2735codec/core/202409/include/ProbeDataConfig.h b/j2735codec/core/j2735_202409/include/ProbeDataConfig.h similarity index 100% rename from j2735codec/core/202409/include/ProbeDataConfig.h rename to j2735codec/core/j2735_202409/include/ProbeDataConfig.h diff --git a/j2735codec/core/202409/include/ProbeDataConfigMessage.h b/j2735codec/core/j2735_202409/include/ProbeDataConfigMessage.h similarity index 100% rename from j2735codec/core/202409/include/ProbeDataConfigMessage.h rename to j2735codec/core/j2735_202409/include/ProbeDataConfigMessage.h diff --git a/j2735codec/core/202409/include/ProbeDataManagement.h b/j2735codec/core/j2735_202409/include/ProbeDataManagement.h similarity index 100% rename from j2735codec/core/202409/include/ProbeDataManagement.h rename to j2735codec/core/j2735_202409/include/ProbeDataManagement.h diff --git a/j2735codec/core/202409/include/ProbeDataReportMessage.h b/j2735codec/core/j2735_202409/include/ProbeDataReportMessage.h similarity index 100% rename from j2735codec/core/202409/include/ProbeDataReportMessage.h rename to j2735codec/core/j2735_202409/include/ProbeDataReportMessage.h diff --git a/j2735codec/core/202409/include/ProbeDataReport_MeanVariation.h b/j2735codec/core/j2735_202409/include/ProbeDataReport_MeanVariation.h similarity index 100% rename from j2735codec/core/202409/include/ProbeDataReport_MeanVariation.h rename to j2735codec/core/j2735_202409/include/ProbeDataReport_MeanVariation.h diff --git a/j2735codec/core/202409/include/ProbeSegmentNumber.h b/j2735codec/core/j2735_202409/include/ProbeSegmentNumber.h similarity index 100% rename from j2735codec/core/202409/include/ProbeSegmentNumber.h rename to j2735codec/core/j2735_202409/include/ProbeSegmentNumber.h diff --git a/j2735codec/core/202409/include/ProbeVehicleData.h b/j2735codec/core/j2735_202409/include/ProbeVehicleData.h similarity index 100% rename from j2735codec/core/202409/include/ProbeVehicleData.h rename to j2735codec/core/j2735_202409/include/ProbeVehicleData.h diff --git a/j2735codec/core/202409/include/PropelledInformation.h b/j2735codec/core/j2735_202409/include/PropelledInformation.h similarity index 100% rename from j2735codec/core/202409/include/PropelledInformation.h rename to j2735codec/core/j2735_202409/include/PropelledInformation.h diff --git a/j2735codec/core/202409/include/Provider.h b/j2735codec/core/j2735_202409/include/Provider.h similarity index 100% rename from j2735codec/core/202409/include/Provider.h rename to j2735codec/core/j2735_202409/include/Provider.h diff --git a/j2735codec/core/202409/include/PublicSafetyAndRoadWorkerActivity.h b/j2735codec/core/j2735_202409/include/PublicSafetyAndRoadWorkerActivity.h similarity index 100% rename from j2735codec/core/202409/include/PublicSafetyAndRoadWorkerActivity.h rename to j2735codec/core/j2735_202409/include/PublicSafetyAndRoadWorkerActivity.h diff --git a/j2735codec/core/202409/include/PublicSafetyDirectingTrafficSubType.h b/j2735codec/core/j2735_202409/include/PublicSafetyDirectingTrafficSubType.h similarity index 100% rename from j2735codec/core/202409/include/PublicSafetyDirectingTrafficSubType.h rename to j2735codec/core/j2735_202409/include/PublicSafetyDirectingTrafficSubType.h diff --git a/j2735codec/core/202409/include/PublicSafetyEventResponderWorkerType.h b/j2735codec/core/j2735_202409/include/PublicSafetyEventResponderWorkerType.h similarity index 100% rename from j2735codec/core/202409/include/PublicSafetyEventResponderWorkerType.h rename to j2735codec/core/j2735_202409/include/PublicSafetyEventResponderWorkerType.h diff --git a/j2735codec/core/202409/include/PurseBalance.h b/j2735codec/core/j2735_202409/include/PurseBalance.h similarity index 100% rename from j2735codec/core/202409/include/PurseBalance.h rename to j2735codec/core/j2735_202409/include/PurseBalance.h diff --git a/j2735codec/core/202409/include/Qualifiers.h b/j2735codec/core/j2735_202409/include/Qualifiers.h similarity index 100% rename from j2735codec/core/202409/include/Qualifiers.h rename to j2735codec/core/j2735_202409/include/Qualifiers.h diff --git a/j2735codec/core/202409/include/RELATIVE-OID.h b/j2735codec/core/j2735_202409/include/RELATIVE-OID.h similarity index 100% rename from j2735codec/core/202409/include/RELATIVE-OID.h rename to j2735codec/core/j2735_202409/include/RELATIVE-OID.h diff --git a/j2735codec/core/202409/include/RSMLanePosition.h b/j2735codec/core/j2735_202409/include/RSMLanePosition.h similarity index 100% rename from j2735codec/core/202409/include/RSMLanePosition.h rename to j2735codec/core/j2735_202409/include/RSMLanePosition.h diff --git a/j2735codec/core/202409/include/RSMPolygon.h b/j2735codec/core/j2735_202409/include/RSMPolygon.h similarity index 100% rename from j2735codec/core/202409/include/RSMPolygon.h rename to j2735codec/core/j2735_202409/include/RSMPolygon.h diff --git a/j2735codec/core/202409/include/RTCM-Revision.h b/j2735codec/core/j2735_202409/include/RTCM-Revision.h similarity index 100% rename from j2735codec/core/202409/include/RTCM-Revision.h rename to j2735codec/core/j2735_202409/include/RTCM-Revision.h diff --git a/j2735codec/core/202409/include/RTCMPackage.h b/j2735codec/core/j2735_202409/include/RTCMPackage.h similarity index 100% rename from j2735codec/core/202409/include/RTCMPackage.h rename to j2735codec/core/j2735_202409/include/RTCMPackage.h diff --git a/j2735codec/core/202409/include/RTCMcorrections.h b/j2735codec/core/j2735_202409/include/RTCMcorrections.h similarity index 100% rename from j2735codec/core/202409/include/RTCMcorrections.h rename to j2735codec/core/j2735_202409/include/RTCMcorrections.h diff --git a/j2735codec/core/202409/include/RTCMheader.h b/j2735codec/core/j2735_202409/include/RTCMheader.h similarity index 100% rename from j2735codec/core/202409/include/RTCMheader.h rename to j2735codec/core/j2735_202409/include/RTCMheader.h diff --git a/j2735codec/core/202409/include/RTCMmessage.h b/j2735codec/core/j2735_202409/include/RTCMmessage.h similarity index 100% rename from j2735codec/core/202409/include/RTCMmessage.h rename to j2735codec/core/j2735_202409/include/RTCMmessage.h diff --git a/j2735codec/core/202409/include/RTCMmessageList.h b/j2735codec/core/j2735_202409/include/RTCMmessageList.h similarity index 100% rename from j2735codec/core/202409/include/RTCMmessageList.h rename to j2735codec/core/j2735_202409/include/RTCMmessageList.h diff --git a/j2735codec/core/202409/include/Radius-B12.h b/j2735codec/core/j2735_202409/include/Radius-B12.h similarity index 100% rename from j2735codec/core/202409/include/Radius-B12.h rename to j2735codec/core/j2735_202409/include/Radius-B12.h diff --git a/j2735codec/core/202409/include/Radius.h b/j2735codec/core/j2735_202409/include/Radius.h similarity index 100% rename from j2735codec/core/202409/include/Radius.h rename to j2735codec/core/j2735_202409/include/Radius.h diff --git a/j2735codec/core/202409/include/RadiusOfCurvature.h b/j2735codec/core/j2735_202409/include/RadiusOfCurvature.h similarity index 100% rename from j2735codec/core/202409/include/RadiusOfCurvature.h rename to j2735codec/core/j2735_202409/include/RadiusOfCurvature.h diff --git a/j2735codec/core/202409/include/RainSensor.h b/j2735codec/core/j2735_202409/include/RainSensor.h similarity index 100% rename from j2735codec/core/202409/include/RainSensor.h rename to j2735codec/core/j2735_202409/include/RainSensor.h diff --git a/j2735codec/core/202409/include/ReasonCode.h b/j2735codec/core/j2735_202409/include/ReasonCode.h similarity index 100% rename from j2735codec/core/202409/include/ReasonCode.h rename to j2735codec/core/j2735_202409/include/ReasonCode.h diff --git a/j2735codec/core/202409/include/ReceiptAuthenticator.h b/j2735codec/core/j2735_202409/include/ReceiptAuthenticator.h similarity index 100% rename from j2735codec/core/202409/include/ReceiptAuthenticator.h rename to j2735codec/core/j2735_202409/include/ReceiptAuthenticator.h diff --git a/j2735codec/core/202409/include/ReceiptContract.h b/j2735codec/core/j2735_202409/include/ReceiptContract.h similarity index 100% rename from j2735codec/core/202409/include/ReceiptContract.h rename to j2735codec/core/j2735_202409/include/ReceiptContract.h diff --git a/j2735codec/core/202409/include/ReceiptData.h b/j2735codec/core/j2735_202409/include/ReceiptData.h similarity index 100% rename from j2735codec/core/202409/include/ReceiptData.h rename to j2735codec/core/j2735_202409/include/ReceiptData.h diff --git a/j2735codec/core/202409/include/ReceiptDistance.h b/j2735codec/core/j2735_202409/include/ReceiptDistance.h similarity index 100% rename from j2735codec/core/202409/include/ReceiptDistance.h rename to j2735codec/core/j2735_202409/include/ReceiptDistance.h diff --git a/j2735codec/core/202409/include/ReceiptFinancialPart.h b/j2735codec/core/j2735_202409/include/ReceiptFinancialPart.h similarity index 100% rename from j2735codec/core/202409/include/ReceiptFinancialPart.h rename to j2735codec/core/j2735_202409/include/ReceiptFinancialPart.h diff --git a/j2735codec/core/202409/include/ReceiptIccId.h b/j2735codec/core/j2735_202409/include/ReceiptIccId.h similarity index 100% rename from j2735codec/core/202409/include/ReceiptIccId.h rename to j2735codec/core/j2735_202409/include/ReceiptIccId.h diff --git a/j2735codec/core/202409/include/ReceiptObuId.h b/j2735codec/core/j2735_202409/include/ReceiptObuId.h similarity index 100% rename from j2735codec/core/202409/include/ReceiptObuId.h rename to j2735codec/core/j2735_202409/include/ReceiptObuId.h diff --git a/j2735codec/core/202409/include/ReceiptServicePart.h b/j2735codec/core/j2735_202409/include/ReceiptServicePart.h similarity index 100% rename from j2735codec/core/202409/include/ReceiptServicePart.h rename to j2735codec/core/j2735_202409/include/ReceiptServicePart.h diff --git a/j2735codec/core/202409/include/ReceiptServiceSerialNumber.h b/j2735codec/core/j2735_202409/include/ReceiptServiceSerialNumber.h similarity index 100% rename from j2735codec/core/202409/include/ReceiptServiceSerialNumber.h rename to j2735codec/core/j2735_202409/include/ReceiptServiceSerialNumber.h diff --git a/j2735codec/core/202409/include/ReceiptText.h b/j2735codec/core/j2735_202409/include/ReceiptText.h similarity index 100% rename from j2735codec/core/202409/include/ReceiptText.h rename to j2735codec/core/j2735_202409/include/ReceiptText.h diff --git a/j2735codec/core/202409/include/RecreationalObjectsAndActivities.h b/j2735codec/core/j2735_202409/include/RecreationalObjectsAndActivities.h similarity index 100% rename from j2735codec/core/202409/include/RecreationalObjectsAndActivities.h rename to j2735codec/core/j2735_202409/include/RecreationalObjectsAndActivities.h diff --git a/j2735codec/core/202409/include/ReducedSpeedZoneContainer.h b/j2735codec/core/j2735_202409/include/ReducedSpeedZoneContainer.h similarity index 100% rename from j2735codec/core/202409/include/ReducedSpeedZoneContainer.h rename to j2735codec/core/j2735_202409/include/ReducedSpeedZoneContainer.h diff --git a/j2735codec/core/202409/include/ReferencePointType.h b/j2735codec/core/j2735_202409/include/ReferencePointType.h similarity index 100% rename from j2735codec/core/202409/include/ReferencePointType.h rename to j2735codec/core/j2735_202409/include/ReferencePointType.h diff --git a/j2735codec/core/202409/include/RegionId.h b/j2735codec/core/j2735_202409/include/RegionId.h similarity index 100% rename from j2735codec/core/202409/include/RegionId.h rename to j2735codec/core/j2735_202409/include/RegionId.h diff --git a/j2735codec/core/202409/include/RegionInfo.h b/j2735codec/core/j2735_202409/include/RegionInfo.h similarity index 100% rename from j2735codec/core/202409/include/RegionInfo.h rename to j2735codec/core/j2735_202409/include/RegionInfo.h diff --git a/j2735codec/core/202409/include/RegionList.h b/j2735codec/core/j2735_202409/include/RegionList.h similarity index 100% rename from j2735codec/core/202409/include/RegionList.h rename to j2735codec/core/j2735_202409/include/RegionList.h diff --git a/j2735codec/core/202409/include/RegionOffsets.h b/j2735codec/core/j2735_202409/include/RegionOffsets.h similarity index 100% rename from j2735codec/core/202409/include/RegionOffsets.h rename to j2735codec/core/j2735_202409/include/RegionOffsets.h diff --git a/j2735codec/core/202409/include/RegionPointSet.h b/j2735codec/core/j2735_202409/include/RegionPointSet.h similarity index 100% rename from j2735codec/core/202409/include/RegionPointSet.h rename to j2735codec/core/j2735_202409/include/RegionPointSet.h diff --git a/j2735codec/core/202409/include/RegionUncertainty.h b/j2735codec/core/j2735_202409/include/RegionUncertainty.h similarity index 100% rename from j2735codec/core/202409/include/RegionUncertainty.h rename to j2735codec/core/j2735_202409/include/RegionUncertainty.h diff --git a/j2735codec/core/202409/include/RegionalExtension.h b/j2735codec/core/j2735_202409/include/RegionalExtension.h similarity index 100% rename from j2735codec/core/202409/include/RegionalExtension.h rename to j2735codec/core/j2735_202409/include/RegionalExtension.h diff --git a/j2735codec/core/202409/include/RegulatoryAndWarningSigns.h b/j2735codec/core/j2735_202409/include/RegulatoryAndWarningSigns.h similarity index 100% rename from j2735codec/core/202409/include/RegulatoryAndWarningSigns.h rename to j2735codec/core/j2735_202409/include/RegulatoryAndWarningSigns.h diff --git a/j2735codec/core/202409/include/RegulatorySpeedLimit.h b/j2735codec/core/j2735_202409/include/RegulatorySpeedLimit.h similarity index 100% rename from j2735codec/core/202409/include/RegulatorySpeedLimit.h rename to j2735codec/core/j2735_202409/include/RegulatorySpeedLimit.h diff --git a/j2735codec/core/202409/include/RelativePosition3d.h b/j2735codec/core/j2735_202409/include/RelativePosition3d.h similarity index 100% rename from j2735codec/core/202409/include/RelativePosition3d.h rename to j2735codec/core/j2735_202409/include/RelativePosition3d.h diff --git a/j2735codec/core/202409/include/RelativeRoadAuthorityID.h b/j2735codec/core/j2735_202409/include/RelativeRoadAuthorityID.h similarity index 100% rename from j2735codec/core/202409/include/RelativeRoadAuthorityID.h rename to j2735codec/core/j2735_202409/include/RelativeRoadAuthorityID.h diff --git a/j2735codec/core/202409/include/ReportCharacteristics.h b/j2735codec/core/j2735_202409/include/ReportCharacteristics.h similarity index 100% rename from j2735codec/core/202409/include/ReportCharacteristics.h rename to j2735codec/core/j2735_202409/include/ReportCharacteristics.h diff --git a/j2735codec/core/202409/include/RequestID.h b/j2735codec/core/j2735_202409/include/RequestID.h similarity index 100% rename from j2735codec/core/202409/include/RequestID.h rename to j2735codec/core/j2735_202409/include/RequestID.h diff --git a/j2735codec/core/202409/include/RequestImportanceLevel.h b/j2735codec/core/j2735_202409/include/RequestImportanceLevel.h similarity index 100% rename from j2735codec/core/202409/include/RequestImportanceLevel.h rename to j2735codec/core/j2735_202409/include/RequestImportanceLevel.h diff --git a/j2735codec/core/202409/include/RequestSubRole.h b/j2735codec/core/j2735_202409/include/RequestSubRole.h similarity index 100% rename from j2735codec/core/202409/include/RequestSubRole.h rename to j2735codec/core/j2735_202409/include/RequestSubRole.h diff --git a/j2735codec/core/202409/include/RequestedItem.h b/j2735codec/core/j2735_202409/include/RequestedItem.h similarity index 100% rename from j2735codec/core/202409/include/RequestedItem.h rename to j2735codec/core/j2735_202409/include/RequestedItem.h diff --git a/j2735codec/core/202409/include/RequestedItemList.h b/j2735codec/core/j2735_202409/include/RequestedItemList.h similarity index 100% rename from j2735codec/core/202409/include/RequestedItemList.h rename to j2735codec/core/j2735_202409/include/RequestedItemList.h diff --git a/j2735codec/core/202409/include/RequestorDescription.h b/j2735codec/core/j2735_202409/include/RequestorDescription.h similarity index 100% rename from j2735codec/core/202409/include/RequestorDescription.h rename to j2735codec/core/j2735_202409/include/RequestorDescription.h diff --git a/j2735codec/core/202409/include/RequestorPositionVector.h b/j2735codec/core/j2735_202409/include/RequestorPositionVector.h similarity index 100% rename from j2735codec/core/202409/include/RequestorPositionVector.h rename to j2735codec/core/j2735_202409/include/RequestorPositionVector.h diff --git a/j2735codec/core/202409/include/RequestorType.h b/j2735codec/core/j2735_202409/include/RequestorType.h similarity index 100% rename from j2735codec/core/202409/include/RequestorType.h rename to j2735codec/core/j2735_202409/include/RequestorType.h diff --git a/j2735codec/core/202409/include/ReservedBit.h b/j2735codec/core/j2735_202409/include/ReservedBit.h similarity index 100% rename from j2735codec/core/202409/include/ReservedBit.h rename to j2735codec/core/j2735_202409/include/ReservedBit.h diff --git a/j2735codec/core/202409/include/ResponseFlag.h b/j2735codec/core/j2735_202409/include/ResponseFlag.h similarity index 100% rename from j2735codec/core/202409/include/ResponseFlag.h rename to j2735codec/core/j2735_202409/include/ResponseFlag.h diff --git a/j2735codec/core/202409/include/ResponseType.h b/j2735codec/core/j2735_202409/include/ResponseType.h similarity index 100% rename from j2735codec/core/202409/include/ResponseType.h rename to j2735codec/core/j2735_202409/include/ResponseType.h diff --git a/j2735codec/core/202409/include/RestrictionAppliesTo.h b/j2735codec/core/j2735_202409/include/RestrictionAppliesTo.h similarity index 100% rename from j2735codec/core/202409/include/RestrictionAppliesTo.h rename to j2735codec/core/j2735_202409/include/RestrictionAppliesTo.h diff --git a/j2735codec/core/202409/include/RestrictionClass.h b/j2735codec/core/j2735_202409/include/RestrictionClass.h similarity index 100% rename from j2735codec/core/202409/include/RestrictionClass.h rename to j2735codec/core/j2735_202409/include/RestrictionClass.h diff --git a/j2735codec/core/202409/include/RestrictionClassAssignment.h b/j2735codec/core/j2735_202409/include/RestrictionClassAssignment.h similarity index 100% rename from j2735codec/core/202409/include/RestrictionClassAssignment.h rename to j2735codec/core/j2735_202409/include/RestrictionClassAssignment.h diff --git a/j2735codec/core/202409/include/RestrictionClassID.h b/j2735codec/core/j2735_202409/include/RestrictionClassID.h similarity index 100% rename from j2735codec/core/202409/include/RestrictionClassID.h rename to j2735codec/core/j2735_202409/include/RestrictionClassID.h diff --git a/j2735codec/core/202409/include/RestrictionClassList.h b/j2735codec/core/j2735_202409/include/RestrictionClassList.h similarity index 100% rename from j2735codec/core/202409/include/RestrictionClassList.h rename to j2735codec/core/j2735_202409/include/RestrictionClassList.h diff --git a/j2735codec/core/202409/include/RestrictionUserType-addGrpC.h b/j2735codec/core/j2735_202409/include/RestrictionUserType-addGrpC.h similarity index 100% rename from j2735codec/core/202409/include/RestrictionUserType-addGrpC.h rename to j2735codec/core/j2735_202409/include/RestrictionUserType-addGrpC.h diff --git a/j2735codec/core/202409/include/RestrictionUserType.h b/j2735codec/core/j2735_202409/include/RestrictionUserType.h similarity index 100% rename from j2735codec/core/202409/include/RestrictionUserType.h rename to j2735codec/core/j2735_202409/include/RestrictionUserType.h diff --git a/j2735codec/core/202409/include/RestrictionUserTypeList.h b/j2735codec/core/j2735_202409/include/RestrictionUserTypeList.h similarity index 100% rename from j2735codec/core/202409/include/RestrictionUserTypeList.h rename to j2735codec/core/j2735_202409/include/RestrictionUserTypeList.h diff --git a/j2735codec/core/202409/include/ResultFin.h b/j2735codec/core/j2735_202409/include/ResultFin.h similarity index 100% rename from j2735codec/core/202409/include/ResultFin.h rename to j2735codec/core/j2735_202409/include/ResultFin.h diff --git a/j2735codec/core/202409/include/ResultOp.h b/j2735codec/core/j2735_202409/include/ResultOp.h similarity index 100% rename from j2735codec/core/202409/include/ResultOp.h rename to j2735codec/core/j2735_202409/include/ResultOp.h diff --git a/j2735codec/core/202409/include/RoadAuthorityID.h b/j2735codec/core/j2735_202409/include/RoadAuthorityID.h similarity index 100% rename from j2735codec/core/202409/include/RoadAuthorityID.h rename to j2735codec/core/j2735_202409/include/RoadAuthorityID.h diff --git a/j2735codec/core/202409/include/RoadGeometryAndAttributes.h b/j2735codec/core/j2735_202409/include/RoadGeometryAndAttributes.h similarity index 100% rename from j2735codec/core/202409/include/RoadGeometryAndAttributes.h rename to j2735codec/core/j2735_202409/include/RoadGeometryAndAttributes.h diff --git a/j2735codec/core/202409/include/RoadGrade.h b/j2735codec/core/j2735_202409/include/RoadGrade.h similarity index 100% rename from j2735codec/core/202409/include/RoadGrade.h rename to j2735codec/core/j2735_202409/include/RoadGrade.h diff --git a/j2735codec/core/202409/include/RoadLaneSetList.h b/j2735codec/core/j2735_202409/include/RoadLaneSetList.h similarity index 100% rename from j2735codec/core/202409/include/RoadLaneSetList.h rename to j2735codec/core/j2735_202409/include/RoadLaneSetList.h diff --git a/j2735codec/core/202409/include/RoadRegulatorID.h b/j2735codec/core/j2735_202409/include/RoadRegulatorID.h similarity index 100% rename from j2735codec/core/202409/include/RoadRegulatorID.h rename to j2735codec/core/j2735_202409/include/RoadRegulatorID.h diff --git a/j2735codec/core/202409/include/RoadRoughness.h b/j2735codec/core/j2735_202409/include/RoadRoughness.h similarity index 100% rename from j2735codec/core/202409/include/RoadRoughness.h rename to j2735codec/core/j2735_202409/include/RoadRoughness.h diff --git a/j2735codec/core/202409/include/RoadSafetyMessage.h b/j2735codec/core/j2735_202409/include/RoadSafetyMessage.h similarity index 100% rename from j2735codec/core/202409/include/RoadSafetyMessage.h rename to j2735codec/core/j2735_202409/include/RoadSafetyMessage.h diff --git a/j2735codec/core/202409/include/RoadSegment.h b/j2735codec/core/j2735_202409/include/RoadSegment.h similarity index 100% rename from j2735codec/core/202409/include/RoadSegment.h rename to j2735codec/core/j2735_202409/include/RoadSegment.h diff --git a/j2735codec/core/202409/include/RoadSegmentID.h b/j2735codec/core/j2735_202409/include/RoadSegmentID.h similarity index 100% rename from j2735codec/core/202409/include/RoadSegmentID.h rename to j2735codec/core/j2735_202409/include/RoadSegmentID.h diff --git a/j2735codec/core/202409/include/RoadSegmentList.h b/j2735codec/core/j2735_202409/include/RoadSegmentList.h similarity index 100% rename from j2735codec/core/202409/include/RoadSegmentList.h rename to j2735codec/core/j2735_202409/include/RoadSegmentList.h diff --git a/j2735codec/core/202409/include/RoadSegmentReferenceID.h b/j2735codec/core/j2735_202409/include/RoadSegmentReferenceID.h similarity index 100% rename from j2735codec/core/202409/include/RoadSegmentReferenceID.h rename to j2735codec/core/j2735_202409/include/RoadSegmentReferenceID.h diff --git a/j2735codec/core/202409/include/RoadSideAlert.h b/j2735codec/core/j2735_202409/include/RoadSideAlert.h similarity index 100% rename from j2735codec/core/202409/include/RoadSideAlert.h rename to j2735codec/core/j2735_202409/include/RoadSideAlert.h diff --git a/j2735codec/core/202409/include/RoadSignID.h b/j2735codec/core/j2735_202409/include/RoadSignID.h similarity index 100% rename from j2735codec/core/202409/include/RoadSignID.h rename to j2735codec/core/j2735_202409/include/RoadSignID.h diff --git a/j2735codec/core/202409/include/RoadSnapShot.h b/j2735codec/core/j2735_202409/include/RoadSnapShot.h similarity index 100% rename from j2735codec/core/202409/include/RoadSnapShot.h rename to j2735codec/core/j2735_202409/include/RoadSnapShot.h diff --git a/j2735codec/core/202409/include/RoadSurfaceCondition.h b/j2735codec/core/j2735_202409/include/RoadSurfaceCondition.h similarity index 100% rename from j2735codec/core/202409/include/RoadSurfaceCondition.h rename to j2735codec/core/j2735_202409/include/RoadSurfaceCondition.h diff --git a/j2735codec/core/202409/include/RoadUserChargingConfigMessage.h b/j2735codec/core/j2735_202409/include/RoadUserChargingConfigMessage.h similarity index 100% rename from j2735codec/core/202409/include/RoadUserChargingConfigMessage.h rename to j2735codec/core/j2735_202409/include/RoadUserChargingConfigMessage.h diff --git a/j2735codec/core/202409/include/RoadUserChargingReportMessage.h b/j2735codec/core/j2735_202409/include/RoadUserChargingReportMessage.h similarity index 100% rename from j2735codec/core/202409/include/RoadUserChargingReportMessage.h rename to j2735codec/core/j2735_202409/include/RoadUserChargingReportMessage.h diff --git a/j2735codec/core/202409/include/RoadWeatherDownload.h b/j2735codec/core/j2735_202409/include/RoadWeatherDownload.h similarity index 100% rename from j2735codec/core/202409/include/RoadWeatherDownload.h rename to j2735codec/core/j2735_202409/include/RoadWeatherDownload.h diff --git a/j2735codec/core/202409/include/RoadWeatherMessage.h b/j2735codec/core/j2735_202409/include/RoadWeatherMessage.h similarity index 100% rename from j2735codec/core/202409/include/RoadWeatherMessage.h rename to j2735codec/core/j2735_202409/include/RoadWeatherMessage.h diff --git a/j2735codec/core/202409/include/RoadWeatherUpload.h b/j2735codec/core/j2735_202409/include/RoadWeatherUpload.h similarity index 100% rename from j2735codec/core/202409/include/RoadWeatherUpload.h rename to j2735codec/core/j2735_202409/include/RoadWeatherUpload.h diff --git a/j2735codec/core/202409/include/RoadsideAssets.h b/j2735codec/core/j2735_202409/include/RoadsideAssets.h similarity index 100% rename from j2735codec/core/202409/include/RoadsideAssets.h rename to j2735codec/core/j2735_202409/include/RoadsideAssets.h diff --git a/j2735codec/core/202409/include/RoadwayCrownAngle.h b/j2735codec/core/j2735_202409/include/RoadwayCrownAngle.h similarity index 100% rename from j2735codec/core/202409/include/RoadwayCrownAngle.h rename to j2735codec/core/j2735_202409/include/RoadwayCrownAngle.h diff --git a/j2735codec/core/202409/include/Roadwork.h b/j2735codec/core/j2735_202409/include/Roadwork.h similarity index 100% rename from j2735codec/core/202409/include/Roadwork.h rename to j2735codec/core/j2735_202409/include/Roadwork.h diff --git a/j2735codec/core/202409/include/Rock.h b/j2735codec/core/j2735_202409/include/Rock.h similarity index 100% rename from j2735codec/core/202409/include/Rock.h rename to j2735codec/core/j2735_202409/include/Rock.h diff --git a/j2735codec/core/202409/include/RockType.h b/j2735codec/core/j2735_202409/include/RockType.h similarity index 100% rename from j2735codec/core/202409/include/RockType.h rename to j2735codec/core/j2735_202409/include/RockType.h diff --git a/j2735codec/core/202409/include/Roll.h b/j2735codec/core/j2735_202409/include/Roll.h similarity index 100% rename from j2735codec/core/202409/include/Roll.h rename to j2735codec/core/j2735_202409/include/Roll.h diff --git a/j2735codec/core/202409/include/RollDetected.h b/j2735codec/core/j2735_202409/include/RollDetected.h similarity index 100% rename from j2735codec/core/202409/include/RollDetected.h rename to j2735codec/core/j2735_202409/include/RollDetected.h diff --git a/j2735codec/core/202409/include/RollRateConfidence.h b/j2735codec/core/j2735_202409/include/RollRateConfidence.h similarity index 100% rename from j2735codec/core/202409/include/RollRateConfidence.h rename to j2735codec/core/j2735_202409/include/RollRateConfidence.h diff --git a/j2735codec/core/202409/include/RptAveragedAndSummaryRecord.h b/j2735codec/core/j2735_202409/include/RptAveragedAndSummaryRecord.h similarity index 100% rename from j2735codec/core/202409/include/RptAveragedAndSummaryRecord.h rename to j2735codec/core/j2735_202409/include/RptAveragedAndSummaryRecord.h diff --git a/j2735codec/core/202409/include/RptAveragedRecord.h b/j2735codec/core/j2735_202409/include/RptAveragedRecord.h similarity index 100% rename from j2735codec/core/202409/include/RptAveragedRecord.h rename to j2735codec/core/j2735_202409/include/RptAveragedRecord.h diff --git a/j2735codec/core/202409/include/RptAvgAndSummaryRecordData.h b/j2735codec/core/j2735_202409/include/RptAvgAndSummaryRecordData.h similarity index 100% rename from j2735codec/core/202409/include/RptAvgAndSummaryRecordData.h rename to j2735codec/core/j2735_202409/include/RptAvgAndSummaryRecordData.h diff --git a/j2735codec/core/202409/include/RptCommSysPerfEvents.h b/j2735codec/core/j2735_202409/include/RptCommSysPerfEvents.h similarity index 100% rename from j2735codec/core/202409/include/RptCommSysPerfEvents.h rename to j2735codec/core/j2735_202409/include/RptCommSysPerfEvents.h diff --git a/j2735codec/core/202409/include/RptDevType.h b/j2735codec/core/j2735_202409/include/RptDevType.h similarity index 100% rename from j2735codec/core/202409/include/RptDevType.h rename to j2735codec/core/j2735_202409/include/RptDevType.h diff --git a/j2735codec/core/202409/include/RptDriverAlertsAndWarnings.h b/j2735codec/core/j2735_202409/include/RptDriverAlertsAndWarnings.h similarity index 100% rename from j2735codec/core/202409/include/RptDriverAlertsAndWarnings.h rename to j2735codec/core/j2735_202409/include/RptDriverAlertsAndWarnings.h diff --git a/j2735codec/core/202409/include/RptEmissions.h b/j2735codec/core/j2735_202409/include/RptEmissions.h similarity index 100% rename from j2735codec/core/202409/include/RptEmissions.h rename to j2735codec/core/j2735_202409/include/RptEmissions.h diff --git a/j2735codec/core/202409/include/RptEvents.h b/j2735codec/core/j2735_202409/include/RptEvents.h similarity index 100% rename from j2735codec/core/202409/include/RptEvents.h rename to j2735codec/core/j2735_202409/include/RptEvents.h diff --git a/j2735codec/core/202409/include/RptHysteresis.h b/j2735codec/core/j2735_202409/include/RptHysteresis.h similarity index 100% rename from j2735codec/core/202409/include/RptHysteresis.h rename to j2735codec/core/j2735_202409/include/RptHysteresis.h diff --git a/j2735codec/core/202409/include/RptHysteresisRecord.h b/j2735codec/core/j2735_202409/include/RptHysteresisRecord.h similarity index 100% rename from j2735codec/core/202409/include/RptHysteresisRecord.h rename to j2735codec/core/j2735_202409/include/RptHysteresisRecord.h diff --git a/j2735codec/core/202409/include/RptInstantaneousRecord.h b/j2735codec/core/j2735_202409/include/RptInstantaneousRecord.h similarity index 100% rename from j2735codec/core/202409/include/RptInstantaneousRecord.h rename to j2735codec/core/j2735_202409/include/RptInstantaneousRecord.h diff --git a/j2735codec/core/202409/include/RptInstantaneousRecordData.h b/j2735codec/core/j2735_202409/include/RptInstantaneousRecordData.h similarity index 100% rename from j2735codec/core/202409/include/RptInstantaneousRecordData.h rename to j2735codec/core/j2735_202409/include/RptInstantaneousRecordData.h diff --git a/j2735codec/core/202409/include/RptInstantaneousRecords.h b/j2735codec/core/j2735_202409/include/RptInstantaneousRecords.h similarity index 100% rename from j2735codec/core/202409/include/RptInstantaneousRecords.h rename to j2735codec/core/j2735_202409/include/RptInstantaneousRecords.h diff --git a/j2735codec/core/202409/include/RptIntervalEvents.h b/j2735codec/core/j2735_202409/include/RptIntervalEvents.h similarity index 100% rename from j2735codec/core/202409/include/RptIntervalEvents.h rename to j2735codec/core/j2735_202409/include/RptIntervalEvents.h diff --git a/j2735codec/core/202409/include/RptKinematicEvents.h b/j2735codec/core/j2735_202409/include/RptKinematicEvents.h similarity index 100% rename from j2735codec/core/202409/include/RptKinematicEvents.h rename to j2735codec/core/j2735_202409/include/RptKinematicEvents.h diff --git a/j2735codec/core/202409/include/RptLocOfStops.h b/j2735codec/core/j2735_202409/include/RptLocOfStops.h similarity index 100% rename from j2735codec/core/202409/include/RptLocOfStops.h rename to j2735codec/core/j2735_202409/include/RptLocOfStops.h diff --git a/j2735codec/core/202409/include/RptRoadRoughness.h b/j2735codec/core/j2735_202409/include/RptRoadRoughness.h similarity index 100% rename from j2735codec/core/202409/include/RptRoadRoughness.h rename to j2735codec/core/j2735_202409/include/RptRoadRoughness.h diff --git a/j2735codec/core/202409/include/RptRoadwayEvents.h b/j2735codec/core/j2735_202409/include/RptRoadwayEvents.h similarity index 100% rename from j2735codec/core/202409/include/RptRoadwayEvents.h rename to j2735codec/core/j2735_202409/include/RptRoadwayEvents.h diff --git a/j2735codec/core/202409/include/RptSummaryRecord.h b/j2735codec/core/j2735_202409/include/RptSummaryRecord.h similarity index 100% rename from j2735codec/core/202409/include/RptSummaryRecord.h rename to j2735codec/core/j2735_202409/include/RptSummaryRecord.h diff --git a/j2735codec/core/202409/include/RptTrafficMetrics.h b/j2735codec/core/j2735_202409/include/RptTrafficMetrics.h similarity index 100% rename from j2735codec/core/202409/include/RptTrafficMetrics.h rename to j2735codec/core/j2735_202409/include/RptTrafficMetrics.h diff --git a/j2735codec/core/202409/include/RptTrafficSigEncounters.h b/j2735codec/core/j2735_202409/include/RptTrafficSigEncounters.h similarity index 100% rename from j2735codec/core/202409/include/RptTrafficSigEncounters.h rename to j2735codec/core/j2735_202409/include/RptTrafficSigEncounters.h diff --git a/j2735codec/core/202409/include/RptTransitVehData.h b/j2735codec/core/j2735_202409/include/RptTransitVehData.h similarity index 100% rename from j2735codec/core/202409/include/RptTransitVehData.h rename to j2735codec/core/j2735_202409/include/RptTransitVehData.h diff --git a/j2735codec/core/202409/include/RptVehicleClass.h b/j2735codec/core/j2735_202409/include/RptVehicleClass.h similarity index 100% rename from j2735codec/core/202409/include/RptVehicleClass.h rename to j2735codec/core/j2735_202409/include/RptVehicleClass.h diff --git a/j2735codec/core/202409/include/RptVehicleEvents.h b/j2735codec/core/j2735_202409/include/RptVehicleEvents.h similarity index 100% rename from j2735codec/core/202409/include/RptVehicleEvents.h rename to j2735codec/core/j2735_202409/include/RptVehicleEvents.h diff --git a/j2735codec/core/202409/include/RptVehicleReport.h b/j2735codec/core/j2735_202409/include/RptVehicleReport.h similarity index 100% rename from j2735codec/core/202409/include/RptVehicleReport.h rename to j2735codec/core/j2735_202409/include/RptVehicleReport.h diff --git a/j2735codec/core/202409/include/RptVelocity.h b/j2735codec/core/j2735_202409/include/RptVelocity.h similarity index 100% rename from j2735codec/core/202409/include/RptVelocity.h rename to j2735codec/core/j2735_202409/include/RptVelocity.h diff --git a/j2735codec/core/202409/include/RptWiperStatus.h b/j2735codec/core/j2735_202409/include/RptWiperStatus.h similarity index 100% rename from j2735codec/core/202409/include/RptWiperStatus.h rename to j2735codec/core/j2735_202409/include/RptWiperStatus.h diff --git a/j2735codec/core/202409/include/SPAT.h b/j2735codec/core/j2735_202409/include/SPAT.h similarity index 100% rename from j2735codec/core/202409/include/SPAT.h rename to j2735codec/core/j2735_202409/include/SPAT.h diff --git a/j2735codec/core/202409/include/SPAT_TimeMark.h b/j2735codec/core/j2735_202409/include/SPAT_TimeMark.h similarity index 100% rename from j2735codec/core/202409/include/SPAT_TimeMark.h rename to j2735codec/core/j2735_202409/include/SPAT_TimeMark.h diff --git a/j2735codec/core/202409/include/SSPindex.h b/j2735codec/core/j2735_202409/include/SSPindex.h similarity index 100% rename from j2735codec/core/202409/include/SSPindex.h rename to j2735codec/core/j2735_202409/include/SSPindex.h diff --git a/j2735codec/core/202409/include/Sample.h b/j2735codec/core/j2735_202409/include/Sample.h similarity index 100% rename from j2735codec/core/202409/include/Sample.h rename to j2735codec/core/j2735_202409/include/Sample.h diff --git a/j2735codec/core/202409/include/Scale-B12.h b/j2735codec/core/j2735_202409/include/Scale-B12.h similarity index 100% rename from j2735codec/core/202409/include/Scale-B12.h rename to j2735codec/core/j2735_202409/include/Scale-B12.h diff --git a/j2735codec/core/202409/include/SchoolBusJ2945Slash1C.h b/j2735codec/core/j2735_202409/include/SchoolBusJ2945Slash1C.h similarity index 100% rename from j2735codec/core/202409/include/SchoolBusJ2945Slash1C.h rename to j2735codec/core/j2735_202409/include/SchoolBusJ2945Slash1C.h diff --git a/j2735codec/core/202409/include/Second.h b/j2735codec/core/j2735_202409/include/Second.h similarity index 100% rename from j2735codec/core/202409/include/Second.h rename to j2735codec/core/j2735_202409/include/Second.h diff --git a/j2735codec/core/202409/include/SecondOfTime.h b/j2735codec/core/j2735_202409/include/SecondOfTime.h similarity index 100% rename from j2735codec/core/202409/include/SecondOfTime.h rename to j2735codec/core/j2735_202409/include/SecondOfTime.h diff --git a/j2735codec/core/202409/include/SecondsAngle.h b/j2735codec/core/j2735_202409/include/SecondsAngle.h similarity index 100% rename from j2735codec/core/202409/include/SecondsAngle.h rename to j2735codec/core/j2735_202409/include/SecondsAngle.h diff --git a/j2735codec/core/202409/include/Segment.h b/j2735codec/core/j2735_202409/include/Segment.h similarity index 100% rename from j2735codec/core/202409/include/Segment.h rename to j2735codec/core/j2735_202409/include/Segment.h diff --git a/j2735codec/core/202409/include/SegmentAttributeLL.h b/j2735codec/core/j2735_202409/include/SegmentAttributeLL.h similarity index 100% rename from j2735codec/core/202409/include/SegmentAttributeLL.h rename to j2735codec/core/j2735_202409/include/SegmentAttributeLL.h diff --git a/j2735codec/core/202409/include/SegmentAttributeLLList.h b/j2735codec/core/j2735_202409/include/SegmentAttributeLLList.h similarity index 100% rename from j2735codec/core/202409/include/SegmentAttributeLLList.h rename to j2735codec/core/j2735_202409/include/SegmentAttributeLLList.h diff --git a/j2735codec/core/202409/include/SegmentAttributeXY.h b/j2735codec/core/j2735_202409/include/SegmentAttributeXY.h similarity index 100% rename from j2735codec/core/202409/include/SegmentAttributeXY.h rename to j2735codec/core/j2735_202409/include/SegmentAttributeXY.h diff --git a/j2735codec/core/202409/include/SegmentAttributeXYList.h b/j2735codec/core/j2735_202409/include/SegmentAttributeXYList.h similarity index 100% rename from j2735codec/core/202409/include/SegmentAttributeXYList.h rename to j2735codec/core/j2735_202409/include/SegmentAttributeXYList.h diff --git a/j2735codec/core/202409/include/SemiMajorAxisAccuracy.h b/j2735codec/core/j2735_202409/include/SemiMajorAxisAccuracy.h similarity index 100% rename from j2735codec/core/202409/include/SemiMajorAxisAccuracy.h rename to j2735codec/core/j2735_202409/include/SemiMajorAxisAccuracy.h diff --git a/j2735codec/core/202409/include/SemiMajorAxisOrientation.h b/j2735codec/core/j2735_202409/include/SemiMajorAxisOrientation.h similarity index 100% rename from j2735codec/core/202409/include/SemiMajorAxisOrientation.h rename to j2735codec/core/j2735_202409/include/SemiMajorAxisOrientation.h diff --git a/j2735codec/core/202409/include/SemiMinorAxisAccuracy.h b/j2735codec/core/j2735_202409/include/SemiMinorAxisAccuracy.h similarity index 100% rename from j2735codec/core/202409/include/SemiMinorAxisAccuracy.h rename to j2735codec/core/j2735_202409/include/SemiMinorAxisAccuracy.h diff --git a/j2735codec/core/202409/include/SensorDataSharingMessage.h b/j2735codec/core/j2735_202409/include/SensorDataSharingMessage.h similarity index 100% rename from j2735codec/core/202409/include/SensorDataSharingMessage.h rename to j2735codec/core/j2735_202409/include/SensorDataSharingMessage.h diff --git a/j2735codec/core/202409/include/SensorDataSharingMessage_ObjectDistance.h b/j2735codec/core/j2735_202409/include/SensorDataSharingMessage_ObjectDistance.h similarity index 100% rename from j2735codec/core/202409/include/SensorDataSharingMessage_ObjectDistance.h rename to j2735codec/core/j2735_202409/include/SensorDataSharingMessage_ObjectDistance.h diff --git a/j2735codec/core/202409/include/SensorDataSharingMessage_PitchRate.h b/j2735codec/core/j2735_202409/include/SensorDataSharingMessage_PitchRate.h similarity index 100% rename from j2735codec/core/202409/include/SensorDataSharingMessage_PitchRate.h rename to j2735codec/core/j2735_202409/include/SensorDataSharingMessage_PitchRate.h diff --git a/j2735codec/core/202409/include/SensorDataSharingMessage_PositionOffsetXYZ.h b/j2735codec/core/j2735_202409/include/SensorDataSharingMessage_PositionOffsetXYZ.h similarity index 100% rename from j2735codec/core/202409/include/SensorDataSharingMessage_PositionOffsetXYZ.h rename to j2735codec/core/j2735_202409/include/SensorDataSharingMessage_PositionOffsetXYZ.h diff --git a/j2735codec/core/202409/include/SensorDataSharingMessage_RollRate.h b/j2735codec/core/j2735_202409/include/SensorDataSharingMessage_RollRate.h similarity index 100% rename from j2735codec/core/202409/include/SensorDataSharingMessage_RollRate.h rename to j2735codec/core/j2735_202409/include/SensorDataSharingMessage_RollRate.h diff --git a/j2735codec/core/202409/include/SeparationDistance.h b/j2735codec/core/j2735_202409/include/SeparationDistance.h similarity index 100% rename from j2735codec/core/202409/include/SeparationDistance.h rename to j2735codec/core/j2735_202409/include/SeparationDistance.h diff --git a/j2735codec/core/202409/include/SessionClass.h b/j2735codec/core/j2735_202409/include/SessionClass.h similarity index 100% rename from j2735codec/core/202409/include/SessionClass.h rename to j2735codec/core/j2735_202409/include/SessionClass.h diff --git a/j2735codec/core/202409/include/SessionLocation.h b/j2735codec/core/j2735_202409/include/SessionLocation.h similarity index 100% rename from j2735codec/core/202409/include/SessionLocation.h rename to j2735codec/core/j2735_202409/include/SessionLocation.h diff --git a/j2735codec/core/202409/include/ShapePointSet.h b/j2735codec/core/j2735_202409/include/ShapePointSet.h similarity index 100% rename from j2735codec/core/202409/include/ShapePointSet.h rename to j2735codec/core/j2735_202409/include/ShapePointSet.h diff --git a/j2735codec/core/202409/include/ShortString.h b/j2735codec/core/j2735_202409/include/ShortString.h similarity index 100% rename from j2735codec/core/202409/include/ShortString.h rename to j2735codec/core/j2735_202409/include/ShortString.h diff --git a/j2735codec/core/202409/include/SignPriority.h b/j2735codec/core/j2735_202409/include/SignPriority.h similarity index 100% rename from j2735codec/core/202409/include/SignPriority.h rename to j2735codec/core/j2735_202409/include/SignPriority.h diff --git a/j2735codec/core/202409/include/SignalControlAndPrioritizationRequest.h b/j2735codec/core/j2735_202409/include/SignalControlAndPrioritizationRequest.h similarity index 100% rename from j2735codec/core/202409/include/SignalControlAndPrioritizationRequest.h rename to j2735codec/core/j2735_202409/include/SignalControlAndPrioritizationRequest.h diff --git a/j2735codec/core/202409/include/SignalControlAndPrioritizationStatus.h b/j2735codec/core/j2735_202409/include/SignalControlAndPrioritizationStatus.h similarity index 100% rename from j2735codec/core/202409/include/SignalControlAndPrioritizationStatus.h rename to j2735codec/core/j2735_202409/include/SignalControlAndPrioritizationStatus.h diff --git a/j2735codec/core/202409/include/SignalControlZone.h b/j2735codec/core/j2735_202409/include/SignalControlZone.h similarity index 100% rename from j2735codec/core/202409/include/SignalControlZone.h rename to j2735codec/core/j2735_202409/include/SignalControlZone.h diff --git a/j2735codec/core/202409/include/SignalGroupID.h b/j2735codec/core/j2735_202409/include/SignalGroupID.h similarity index 100% rename from j2735codec/core/202409/include/SignalGroupID.h rename to j2735codec/core/j2735_202409/include/SignalGroupID.h diff --git a/j2735codec/core/202409/include/SignalHeadLocation.h b/j2735codec/core/j2735_202409/include/SignalHeadLocation.h similarity index 100% rename from j2735codec/core/202409/include/SignalHeadLocation.h rename to j2735codec/core/j2735_202409/include/SignalHeadLocation.h diff --git a/j2735codec/core/202409/include/SignalHeadLocationList.h b/j2735codec/core/j2735_202409/include/SignalHeadLocationList.h similarity index 100% rename from j2735codec/core/202409/include/SignalHeadLocationList.h rename to j2735codec/core/j2735_202409/include/SignalHeadLocationList.h diff --git a/j2735codec/core/202409/include/SignalReqScheme.h b/j2735codec/core/j2735_202409/include/SignalReqScheme.h similarity index 100% rename from j2735codec/core/202409/include/SignalReqScheme.h rename to j2735codec/core/j2735_202409/include/SignalReqScheme.h diff --git a/j2735codec/core/202409/include/SignalRequest.h b/j2735codec/core/j2735_202409/include/SignalRequest.h similarity index 100% rename from j2735codec/core/202409/include/SignalRequest.h rename to j2735codec/core/j2735_202409/include/SignalRequest.h diff --git a/j2735codec/core/202409/include/SignalRequestList.h b/j2735codec/core/j2735_202409/include/SignalRequestList.h similarity index 100% rename from j2735codec/core/202409/include/SignalRequestList.h rename to j2735codec/core/j2735_202409/include/SignalRequestList.h diff --git a/j2735codec/core/202409/include/SignalRequestMessage.h b/j2735codec/core/j2735_202409/include/SignalRequestMessage.h similarity index 100% rename from j2735codec/core/202409/include/SignalRequestMessage.h rename to j2735codec/core/j2735_202409/include/SignalRequestMessage.h diff --git a/j2735codec/core/202409/include/SignalRequestPackage.h b/j2735codec/core/j2735_202409/include/SignalRequestPackage.h similarity index 100% rename from j2735codec/core/202409/include/SignalRequestPackage.h rename to j2735codec/core/j2735_202409/include/SignalRequestPackage.h diff --git a/j2735codec/core/202409/include/SignalRequesterInfo.h b/j2735codec/core/j2735_202409/include/SignalRequesterInfo.h similarity index 100% rename from j2735codec/core/202409/include/SignalRequesterInfo.h rename to j2735codec/core/j2735_202409/include/SignalRequesterInfo.h diff --git a/j2735codec/core/202409/include/SignalStatus.h b/j2735codec/core/j2735_202409/include/SignalStatus.h similarity index 100% rename from j2735codec/core/202409/include/SignalStatus.h rename to j2735codec/core/j2735_202409/include/SignalStatus.h diff --git a/j2735codec/core/202409/include/SignalStatusList.h b/j2735codec/core/j2735_202409/include/SignalStatusList.h similarity index 100% rename from j2735codec/core/202409/include/SignalStatusList.h rename to j2735codec/core/j2735_202409/include/SignalStatusList.h diff --git a/j2735codec/core/202409/include/SignalStatusMessage.h b/j2735codec/core/j2735_202409/include/SignalStatusMessage.h similarity index 100% rename from j2735codec/core/202409/include/SignalStatusMessage.h rename to j2735codec/core/j2735_202409/include/SignalStatusMessage.h diff --git a/j2735codec/core/202409/include/SignalStatusPackage.h b/j2735codec/core/j2735_202409/include/SignalStatusPackage.h similarity index 100% rename from j2735codec/core/202409/include/SignalStatusPackage.h rename to j2735codec/core/j2735_202409/include/SignalStatusPackage.h diff --git a/j2735codec/core/202409/include/SignalStatusPackageList.h b/j2735codec/core/j2735_202409/include/SignalStatusPackageList.h similarity index 100% rename from j2735codec/core/202409/include/SignalStatusPackageList.h rename to j2735codec/core/j2735_202409/include/SignalStatusPackageList.h diff --git a/j2735codec/core/202409/include/SignedValue.h b/j2735codec/core/j2735_202409/include/SignedValue.h similarity index 100% rename from j2735codec/core/202409/include/SignedValue.h rename to j2735codec/core/j2735_202409/include/SignedValue.h diff --git a/j2735codec/core/202409/include/SirenInUse.h b/j2735codec/core/j2735_202409/include/SirenInUse.h similarity index 100% rename from j2735codec/core/202409/include/SirenInUse.h rename to j2735codec/core/j2735_202409/include/SirenInUse.h diff --git a/j2735codec/core/202409/include/SituationalContainer.h b/j2735codec/core/j2735_202409/include/SituationalContainer.h similarity index 100% rename from j2735codec/core/202409/include/SituationalContainer.h rename to j2735codec/core/j2735_202409/include/SituationalContainer.h diff --git a/j2735codec/core/202409/include/SizeValue.h b/j2735codec/core/j2735_202409/include/SizeValue.h similarity index 100% rename from j2735codec/core/202409/include/SizeValue.h rename to j2735codec/core/j2735_202409/include/SizeValue.h diff --git a/j2735codec/core/202409/include/SizeValueConfidence.h b/j2735codec/core/j2735_202409/include/SizeValueConfidence.h similarity index 100% rename from j2735codec/core/202409/include/SizeValueConfidence.h rename to j2735codec/core/j2735_202409/include/SizeValueConfidence.h diff --git a/j2735codec/core/202409/include/SmallNumbers.h b/j2735codec/core/j2735_202409/include/SmallNumbers.h similarity index 100% rename from j2735codec/core/202409/include/SmallNumbers.h rename to j2735codec/core/j2735_202409/include/SmallNumbers.h diff --git a/j2735codec/core/202409/include/Snapshot.h b/j2735codec/core/j2735_202409/include/Snapshot.h similarity index 100% rename from j2735codec/core/202409/include/Snapshot.h rename to j2735codec/core/j2735_202409/include/Snapshot.h diff --git a/j2735codec/core/202409/include/SnapshotDistance.h b/j2735codec/core/j2735_202409/include/SnapshotDistance.h similarity index 100% rename from j2735codec/core/202409/include/SnapshotDistance.h rename to j2735codec/core/j2735_202409/include/SnapshotDistance.h diff --git a/j2735codec/core/202409/include/SnapshotTime.h b/j2735codec/core/j2735_202409/include/SnapshotTime.h similarity index 100% rename from j2735codec/core/202409/include/SnapshotTime.h rename to j2735codec/core/j2735_202409/include/SnapshotTime.h diff --git a/j2735codec/core/202409/include/Snow.h b/j2735codec/core/j2735_202409/include/Snow.h similarity index 100% rename from j2735codec/core/202409/include/Snow.h rename to j2735codec/core/j2735_202409/include/Snow.h diff --git a/j2735codec/core/202409/include/SnowType.h b/j2735codec/core/j2735_202409/include/SnowType.h similarity index 100% rename from j2735codec/core/202409/include/SnowType.h rename to j2735codec/core/j2735_202409/include/SnowType.h diff --git a/j2735codec/core/202409/include/SoundLevel.h b/j2735codec/core/j2735_202409/include/SoundLevel.h similarity index 100% rename from j2735codec/core/202409/include/SoundLevel.h rename to j2735codec/core/j2735_202409/include/SoundLevel.h diff --git a/j2735codec/core/202409/include/SpecialCharges.h b/j2735codec/core/j2735_202409/include/SpecialCharges.h similarity index 100% rename from j2735codec/core/202409/include/SpecialCharges.h rename to j2735codec/core/j2735_202409/include/SpecialCharges.h diff --git a/j2735codec/core/202409/include/SpecialEvents.h b/j2735codec/core/j2735_202409/include/SpecialEvents.h similarity index 100% rename from j2735codec/core/202409/include/SpecialEvents.h rename to j2735codec/core/j2735_202409/include/SpecialEvents.h diff --git a/j2735codec/core/202409/include/SpecialVehicleExtensions.h b/j2735codec/core/j2735_202409/include/SpecialVehicleExtensions.h similarity index 100% rename from j2735codec/core/202409/include/SpecialVehicleExtensions.h rename to j2735codec/core/j2735_202409/include/SpecialVehicleExtensions.h diff --git a/j2735codec/core/202409/include/Speed.h b/j2735codec/core/j2735_202409/include/Speed.h similarity index 100% rename from j2735codec/core/202409/include/Speed.h rename to j2735codec/core/j2735_202409/include/Speed.h diff --git a/j2735codec/core/202409/include/SpeedAdvice.h b/j2735codec/core/j2735_202409/include/SpeedAdvice.h similarity index 100% rename from j2735codec/core/202409/include/SpeedAdvice.h rename to j2735codec/core/j2735_202409/include/SpeedAdvice.h diff --git a/j2735codec/core/202409/include/SpeedConfidence.h b/j2735codec/core/j2735_202409/include/SpeedConfidence.h similarity index 100% rename from j2735codec/core/202409/include/SpeedConfidence.h rename to j2735codec/core/j2735_202409/include/SpeedConfidence.h diff --git a/j2735codec/core/202409/include/SpeedLimit.h b/j2735codec/core/j2735_202409/include/SpeedLimit.h similarity index 100% rename from j2735codec/core/202409/include/SpeedLimit.h rename to j2735codec/core/j2735_202409/include/SpeedLimit.h diff --git a/j2735codec/core/202409/include/SpeedLimitList.h b/j2735codec/core/j2735_202409/include/SpeedLimitList.h similarity index 100% rename from j2735codec/core/202409/include/SpeedLimitList.h rename to j2735codec/core/j2735_202409/include/SpeedLimitList.h diff --git a/j2735codec/core/202409/include/SpeedLimitType.h b/j2735codec/core/j2735_202409/include/SpeedLimitType.h similarity index 100% rename from j2735codec/core/202409/include/SpeedLimitType.h rename to j2735codec/core/j2735_202409/include/SpeedLimitType.h diff --git a/j2735codec/core/202409/include/SpeedProfile.h b/j2735codec/core/j2735_202409/include/SpeedProfile.h similarity index 100% rename from j2735codec/core/202409/include/SpeedProfile.h rename to j2735codec/core/j2735_202409/include/SpeedProfile.h diff --git a/j2735codec/core/202409/include/SpeedProfileMeasurement.h b/j2735codec/core/j2735_202409/include/SpeedProfileMeasurement.h similarity index 100% rename from j2735codec/core/202409/include/SpeedProfileMeasurement.h rename to j2735codec/core/j2735_202409/include/SpeedProfileMeasurement.h diff --git a/j2735codec/core/202409/include/SpeedProfileMeasurementList.h b/j2735codec/core/j2735_202409/include/SpeedProfileMeasurementList.h similarity index 100% rename from j2735codec/core/202409/include/SpeedProfileMeasurementList.h rename to j2735codec/core/j2735_202409/include/SpeedProfileMeasurementList.h diff --git a/j2735codec/core/202409/include/SpeedandHeadingandThrottleConfidence.h b/j2735codec/core/j2735_202409/include/SpeedandHeadingandThrottleConfidence.h similarity index 100% rename from j2735codec/core/202409/include/SpeedandHeadingandThrottleConfidence.h rename to j2735codec/core/j2735_202409/include/SpeedandHeadingandThrottleConfidence.h diff --git a/j2735codec/core/202409/include/SportingEvents.h b/j2735codec/core/j2735_202409/include/SportingEvents.h similarity index 100% rename from j2735codec/core/202409/include/SportingEvents.h rename to j2735codec/core/j2735_202409/include/SportingEvents.h diff --git a/j2735codec/core/202409/include/StabilityControlStatus.h b/j2735codec/core/j2735_202409/include/StabilityControlStatus.h similarity index 100% rename from j2735codec/core/202409/include/StabilityControlStatus.h rename to j2735codec/core/j2735_202409/include/StabilityControlStatus.h diff --git a/j2735codec/core/202409/include/StatesAndTerritories.h b/j2735codec/core/j2735_202409/include/StatesAndTerritories.h similarity index 100% rename from j2735codec/core/202409/include/StatesAndTerritories.h rename to j2735codec/core/j2735_202409/include/StatesAndTerritories.h diff --git a/j2735codec/core/202409/include/StationID.h b/j2735codec/core/j2735_202409/include/StationID.h similarity index 100% rename from j2735codec/core/202409/include/StationID.h rename to j2735codec/core/j2735_202409/include/StationID.h diff --git a/j2735codec/core/202409/include/StationType.h b/j2735codec/core/j2735_202409/include/StationType.h similarity index 100% rename from j2735codec/core/202409/include/StationType.h rename to j2735codec/core/j2735_202409/include/StationType.h diff --git a/j2735codec/core/202409/include/StdDev.h b/j2735codec/core/j2735_202409/include/StdDev.h similarity index 100% rename from j2735codec/core/202409/include/StdDev.h rename to j2735codec/core/j2735_202409/include/StdDev.h diff --git a/j2735codec/core/202409/include/SteeringAxleLubePressure.h b/j2735codec/core/j2735_202409/include/SteeringAxleLubePressure.h similarity index 100% rename from j2735codec/core/202409/include/SteeringAxleLubePressure.h rename to j2735codec/core/j2735_202409/include/SteeringAxleLubePressure.h diff --git a/j2735codec/core/202409/include/SteeringAxleTemperature.h b/j2735codec/core/j2735_202409/include/SteeringAxleTemperature.h similarity index 100% rename from j2735codec/core/202409/include/SteeringAxleTemperature.h rename to j2735codec/core/j2735_202409/include/SteeringAxleTemperature.h diff --git a/j2735codec/core/202409/include/SteeringWheelAngle.h b/j2735codec/core/j2735_202409/include/SteeringWheelAngle.h similarity index 100% rename from j2735codec/core/202409/include/SteeringWheelAngle.h rename to j2735codec/core/j2735_202409/include/SteeringWheelAngle.h diff --git a/j2735codec/core/202409/include/SteeringWheelAngleConfidence.h b/j2735codec/core/j2735_202409/include/SteeringWheelAngleConfidence.h similarity index 100% rename from j2735codec/core/202409/include/SteeringWheelAngleConfidence.h rename to j2735codec/core/j2735_202409/include/SteeringWheelAngleConfidence.h diff --git a/j2735codec/core/202409/include/SteeringWheelAngleRateOfChange.h b/j2735codec/core/j2735_202409/include/SteeringWheelAngleRateOfChange.h similarity index 100% rename from j2735codec/core/202409/include/SteeringWheelAngleRateOfChange.h rename to j2735codec/core/j2735_202409/include/SteeringWheelAngleRateOfChange.h diff --git a/j2735codec/core/202409/include/StreetSuffixes.h b/j2735codec/core/j2735_202409/include/StreetSuffixes.h similarity index 100% rename from j2735codec/core/202409/include/StreetSuffixes.h rename to j2735codec/core/j2735_202409/include/StreetSuffixes.h diff --git a/j2735codec/core/202409/include/Structures.h b/j2735codec/core/j2735_202409/include/Structures.h similarity index 100% rename from j2735codec/core/202409/include/Structures.h rename to j2735codec/core/j2735_202409/include/Structures.h diff --git a/j2735codec/core/202409/include/SubManeuver.h b/j2735codec/core/j2735_202409/include/SubManeuver.h similarity index 100% rename from j2735codec/core/202409/include/SubManeuver.h rename to j2735codec/core/j2735_202409/include/SubManeuver.h diff --git a/j2735codec/core/202409/include/SubManeuverList.h b/j2735codec/core/j2735_202409/include/SubManeuverList.h similarity index 100% rename from j2735codec/core/202409/include/SubManeuverList.h rename to j2735codec/core/j2735_202409/include/SubManeuverList.h diff --git a/j2735codec/core/202409/include/SubRegionChargingInfo.h b/j2735codec/core/j2735_202409/include/SubRegionChargingInfo.h similarity index 100% rename from j2735codec/core/202409/include/SubRegionChargingInfo.h rename to j2735codec/core/j2735_202409/include/SubRegionChargingInfo.h diff --git a/j2735codec/core/202409/include/SuggestionAdvice.h b/j2735codec/core/j2735_202409/include/SuggestionAdvice.h similarity index 100% rename from j2735codec/core/202409/include/SuggestionAdvice.h rename to j2735codec/core/j2735_202409/include/SuggestionAdvice.h diff --git a/j2735codec/core/202409/include/SummerTime.h b/j2735codec/core/j2735_202409/include/SummerTime.h similarity index 100% rename from j2735codec/core/202409/include/SummerTime.h rename to j2735codec/core/j2735_202409/include/SummerTime.h diff --git a/j2735codec/core/202409/include/SunSensor.h b/j2735codec/core/j2735_202409/include/SunSensor.h similarity index 100% rename from j2735codec/core/202409/include/SunSensor.h rename to j2735codec/core/j2735_202409/include/SunSensor.h diff --git a/j2735codec/core/202409/include/SupplementalVehicleExtensions.h b/j2735codec/core/j2735_202409/include/SupplementalVehicleExtensions.h similarity index 100% rename from j2735codec/core/202409/include/SupplementalVehicleExtensions.h rename to j2735codec/core/j2735_202409/include/SupplementalVehicleExtensions.h diff --git a/j2735codec/core/202409/include/SurfaceTempMeasurementStdDev.h b/j2735codec/core/j2735_202409/include/SurfaceTempMeasurementStdDev.h similarity index 100% rename from j2735codec/core/202409/include/SurfaceTempMeasurementStdDev.h rename to j2735codec/core/j2735_202409/include/SurfaceTempMeasurementStdDev.h diff --git a/j2735codec/core/202409/include/SurroundingVehicleInfo.h b/j2735codec/core/j2735_202409/include/SurroundingVehicleInfo.h similarity index 100% rename from j2735codec/core/202409/include/SurroundingVehicleInfo.h rename to j2735codec/core/j2735_202409/include/SurroundingVehicleInfo.h diff --git a/j2735codec/core/202409/include/SystemInformation.h b/j2735codec/core/j2735_202409/include/SystemInformation.h similarity index 100% rename from j2735codec/core/202409/include/SystemInformation.h rename to j2735codec/core/j2735_202409/include/SystemInformation.h diff --git a/j2735codec/core/202409/include/TRRLength.h b/j2735codec/core/j2735_202409/include/TRRLength.h similarity index 100% rename from j2735codec/core/202409/include/TRRLength.h rename to j2735codec/core/j2735_202409/include/TRRLength.h diff --git a/j2735codec/core/202409/include/TRRLocation.h b/j2735codec/core/j2735_202409/include/TRRLocation.h similarity index 100% rename from j2735codec/core/202409/include/TRRLocation.h rename to j2735codec/core/j2735_202409/include/TRRLocation.h diff --git a/j2735codec/core/202409/include/TRRLocationType1.h b/j2735codec/core/j2735_202409/include/TRRLocationType1.h similarity index 100% rename from j2735codec/core/202409/include/TRRLocationType1.h rename to j2735codec/core/j2735_202409/include/TRRLocationType1.h diff --git a/j2735codec/core/202409/include/TRRLocationType2.h b/j2735codec/core/j2735_202409/include/TRRLocationType2.h similarity index 100% rename from j2735codec/core/202409/include/TRRLocationType2.h rename to j2735codec/core/j2735_202409/include/TRRLocationType2.h diff --git a/j2735codec/core/202409/include/TRRLocationType3.h b/j2735codec/core/j2735_202409/include/TRRLocationType3.h similarity index 100% rename from j2735codec/core/202409/include/TRRLocationType3.h rename to j2735codec/core/j2735_202409/include/TRRLocationType3.h diff --git a/j2735codec/core/202409/include/TRRType.h b/j2735codec/core/j2735_202409/include/TRRType.h similarity index 100% rename from j2735codec/core/202409/include/TRRType.h rename to j2735codec/core/j2735_202409/include/TRRType.h diff --git a/j2735codec/core/202409/include/TargetRoadResource.h b/j2735codec/core/j2735_202409/include/TargetRoadResource.h similarity index 100% rename from j2735codec/core/202409/include/TargetRoadResource.h rename to j2735codec/core/j2735_202409/include/TargetRoadResource.h diff --git a/j2735codec/core/202409/include/TariffClassDescription.h b/j2735codec/core/j2735_202409/include/TariffClassDescription.h similarity index 100% rename from j2735codec/core/202409/include/TariffClassDescription.h rename to j2735codec/core/j2735_202409/include/TariffClassDescription.h diff --git a/j2735codec/core/202409/include/TariffClassId.h b/j2735codec/core/j2735_202409/include/TariffClassId.h similarity index 100% rename from j2735codec/core/202409/include/TariffClassId.h rename to j2735codec/core/j2735_202409/include/TariffClassId.h diff --git a/j2735codec/core/202409/include/Temperature.h b/j2735codec/core/j2735_202409/include/Temperature.h similarity index 100% rename from j2735codec/core/202409/include/Temperature.h rename to j2735codec/core/j2735_202409/include/Temperature.h diff --git a/j2735codec/core/202409/include/TemperatureMeasurementStdDev.h b/j2735codec/core/j2735_202409/include/TemperatureMeasurementStdDev.h similarity index 100% rename from j2735codec/core/202409/include/TemperatureMeasurementStdDev.h rename to j2735codec/core/j2735_202409/include/TemperatureMeasurementStdDev.h diff --git a/j2735codec/core/202409/include/TemporaryID.h b/j2735codec/core/j2735_202409/include/TemporaryID.h similarity index 100% rename from j2735codec/core/202409/include/TemporaryID.h rename to j2735codec/core/j2735_202409/include/TemporaryID.h diff --git a/j2735codec/core/202409/include/TemporaryIDList.h b/j2735codec/core/j2735_202409/include/TemporaryIDList.h similarity index 100% rename from j2735codec/core/202409/include/TemporaryIDList.h rename to j2735codec/core/j2735_202409/include/TemporaryIDList.h diff --git a/j2735codec/core/202409/include/TemporaryIDPointer.h b/j2735codec/core/j2735_202409/include/TemporaryIDPointer.h similarity index 100% rename from j2735codec/core/202409/include/TemporaryIDPointer.h rename to j2735codec/core/j2735_202409/include/TemporaryIDPointer.h diff --git a/j2735codec/core/202409/include/TenthSecond.h b/j2735codec/core/j2735_202409/include/TenthSecond.h similarity index 100% rename from j2735codec/core/202409/include/TenthSecond.h rename to j2735codec/core/j2735_202409/include/TenthSecond.h diff --git a/j2735codec/core/202409/include/TermDistance.h b/j2735codec/core/j2735_202409/include/TermDistance.h similarity index 100% rename from j2735codec/core/202409/include/TermDistance.h rename to j2735codec/core/j2735_202409/include/TermDistance.h diff --git a/j2735codec/core/202409/include/TermTime.h b/j2735codec/core/j2735_202409/include/TermTime.h similarity index 100% rename from j2735codec/core/202409/include/TermTime.h rename to j2735codec/core/j2735_202409/include/TermTime.h diff --git a/j2735codec/core/202409/include/TestMessage00.h b/j2735codec/core/j2735_202409/include/TestMessage00.h similarity index 100% rename from j2735codec/core/202409/include/TestMessage00.h rename to j2735codec/core/j2735_202409/include/TestMessage00.h diff --git a/j2735codec/core/202409/include/TestMessage01.h b/j2735codec/core/j2735_202409/include/TestMessage01.h similarity index 100% rename from j2735codec/core/202409/include/TestMessage01.h rename to j2735codec/core/j2735_202409/include/TestMessage01.h diff --git a/j2735codec/core/202409/include/TestMessage02.h b/j2735codec/core/j2735_202409/include/TestMessage02.h similarity index 100% rename from j2735codec/core/202409/include/TestMessage02.h rename to j2735codec/core/j2735_202409/include/TestMessage02.h diff --git a/j2735codec/core/202409/include/TestMessage03.h b/j2735codec/core/j2735_202409/include/TestMessage03.h similarity index 100% rename from j2735codec/core/202409/include/TestMessage03.h rename to j2735codec/core/j2735_202409/include/TestMessage03.h diff --git a/j2735codec/core/202409/include/TestMessage04.h b/j2735codec/core/j2735_202409/include/TestMessage04.h similarity index 100% rename from j2735codec/core/202409/include/TestMessage04.h rename to j2735codec/core/j2735_202409/include/TestMessage04.h diff --git a/j2735codec/core/202409/include/TestMessage05.h b/j2735codec/core/j2735_202409/include/TestMessage05.h similarity index 100% rename from j2735codec/core/202409/include/TestMessage05.h rename to j2735codec/core/j2735_202409/include/TestMessage05.h diff --git a/j2735codec/core/202409/include/TestMessage06.h b/j2735codec/core/j2735_202409/include/TestMessage06.h similarity index 100% rename from j2735codec/core/202409/include/TestMessage06.h rename to j2735codec/core/j2735_202409/include/TestMessage06.h diff --git a/j2735codec/core/202409/include/TestMessage07.h b/j2735codec/core/j2735_202409/include/TestMessage07.h similarity index 100% rename from j2735codec/core/202409/include/TestMessage07.h rename to j2735codec/core/j2735_202409/include/TestMessage07.h diff --git a/j2735codec/core/202409/include/TestMessage08.h b/j2735codec/core/j2735_202409/include/TestMessage08.h similarity index 100% rename from j2735codec/core/202409/include/TestMessage08.h rename to j2735codec/core/j2735_202409/include/TestMessage08.h diff --git a/j2735codec/core/202409/include/TestMessage09.h b/j2735codec/core/j2735_202409/include/TestMessage09.h similarity index 100% rename from j2735codec/core/202409/include/TestMessage09.h rename to j2735codec/core/j2735_202409/include/TestMessage09.h diff --git a/j2735codec/core/202409/include/TestMessage10.h b/j2735codec/core/j2735_202409/include/TestMessage10.h similarity index 100% rename from j2735codec/core/202409/include/TestMessage10.h rename to j2735codec/core/j2735_202409/include/TestMessage10.h diff --git a/j2735codec/core/202409/include/TestMessage11.h b/j2735codec/core/j2735_202409/include/TestMessage11.h similarity index 100% rename from j2735codec/core/202409/include/TestMessage11.h rename to j2735codec/core/j2735_202409/include/TestMessage11.h diff --git a/j2735codec/core/202409/include/TestMessage12.h b/j2735codec/core/j2735_202409/include/TestMessage12.h similarity index 100% rename from j2735codec/core/202409/include/TestMessage12.h rename to j2735codec/core/j2735_202409/include/TestMessage12.h diff --git a/j2735codec/core/202409/include/TestMessage13.h b/j2735codec/core/j2735_202409/include/TestMessage13.h similarity index 100% rename from j2735codec/core/202409/include/TestMessage13.h rename to j2735codec/core/j2735_202409/include/TestMessage13.h diff --git a/j2735codec/core/202409/include/TestMessage14.h b/j2735codec/core/j2735_202409/include/TestMessage14.h similarity index 100% rename from j2735codec/core/202409/include/TestMessage14.h rename to j2735codec/core/j2735_202409/include/TestMessage14.h diff --git a/j2735codec/core/202409/include/TestMessage15.h b/j2735codec/core/j2735_202409/include/TestMessage15.h similarity index 100% rename from j2735codec/core/202409/include/TestMessage15.h rename to j2735codec/core/j2735_202409/include/TestMessage15.h diff --git a/j2735codec/core/202409/include/ThrottleConfidence.h b/j2735codec/core/j2735_202409/include/ThrottleConfidence.h similarity index 100% rename from j2735codec/core/202409/include/ThrottleConfidence.h rename to j2735codec/core/j2735_202409/include/ThrottleConfidence.h diff --git a/j2735codec/core/202409/include/ThrottlePosition.h b/j2735codec/core/j2735_202409/include/ThrottlePosition.h similarity index 100% rename from j2735codec/core/202409/include/ThrottlePosition.h rename to j2735codec/core/j2735_202409/include/ThrottlePosition.h diff --git a/j2735codec/core/202409/include/TimeChangeDetails.h b/j2735codec/core/j2735_202409/include/TimeChangeDetails.h similarity index 100% rename from j2735codec/core/202409/include/TimeChangeDetails.h rename to j2735codec/core/j2735_202409/include/TimeChangeDetails.h diff --git a/j2735codec/core/202409/include/TimeChargesTable.h b/j2735codec/core/j2735_202409/include/TimeChargesTable.h similarity index 100% rename from j2735codec/core/202409/include/TimeChargesTable.h rename to j2735codec/core/j2735_202409/include/TimeChargesTable.h diff --git a/j2735codec/core/202409/include/TimeClassId.h b/j2735codec/core/j2735_202409/include/TimeClassId.h similarity index 100% rename from j2735codec/core/202409/include/TimeClassId.h rename to j2735codec/core/j2735_202409/include/TimeClassId.h diff --git a/j2735codec/core/202409/include/TimeCompact.h b/j2735codec/core/j2735_202409/include/TimeCompact.h similarity index 100% rename from j2735codec/core/202409/include/TimeCompact.h rename to j2735codec/core/j2735_202409/include/TimeCompact.h diff --git a/j2735codec/core/202409/include/TimeConfidence.h b/j2735codec/core/j2735_202409/include/TimeConfidence.h similarity index 100% rename from j2735codec/core/202409/include/TimeConfidence.h rename to j2735codec/core/j2735_202409/include/TimeConfidence.h diff --git a/j2735codec/core/202409/include/TimeConstant.h b/j2735codec/core/j2735_202409/include/TimeConstant.h similarity index 100% rename from j2735codec/core/202409/include/TimeConstant.h rename to j2735codec/core/j2735_202409/include/TimeConstant.h diff --git a/j2735codec/core/202409/include/TimeInSecond-B16.h b/j2735codec/core/j2735_202409/include/TimeInSecond-B16.h similarity index 100% rename from j2735codec/core/202409/include/TimeInSecond-B16.h rename to j2735codec/core/j2735_202409/include/TimeInSecond-B16.h diff --git a/j2735codec/core/202409/include/TimeInSecond-B8.h b/j2735codec/core/j2735_202409/include/TimeInSecond-B8.h similarity index 100% rename from j2735codec/core/202409/include/TimeInSecond-B8.h rename to j2735codec/core/j2735_202409/include/TimeInSecond-B8.h diff --git a/j2735codec/core/202409/include/TimeIntervalConfidence.h b/j2735codec/core/j2735_202409/include/TimeIntervalConfidence.h similarity index 100% rename from j2735codec/core/202409/include/TimeIntervalConfidence.h rename to j2735codec/core/j2735_202409/include/TimeIntervalConfidence.h diff --git a/j2735codec/core/202409/include/TimeOffset.h b/j2735codec/core/j2735_202409/include/TimeOffset.h similarity index 100% rename from j2735codec/core/202409/include/TimeOffset.h rename to j2735codec/core/j2735_202409/include/TimeOffset.h diff --git a/j2735codec/core/202409/include/TimePeriod.h b/j2735codec/core/j2735_202409/include/TimePeriod.h similarity index 100% rename from j2735codec/core/202409/include/TimePeriod.h rename to j2735codec/core/j2735_202409/include/TimePeriod.h diff --git a/j2735codec/core/202409/include/TimeRemaining.h b/j2735codec/core/j2735_202409/include/TimeRemaining.h similarity index 100% rename from j2735codec/core/202409/include/TimeRemaining.h rename to j2735codec/core/j2735_202409/include/TimeRemaining.h diff --git a/j2735codec/core/202409/include/TimeUnit.h b/j2735codec/core/j2735_202409/include/TimeUnit.h similarity index 100% rename from j2735codec/core/202409/include/TimeUnit.h rename to j2735codec/core/j2735_202409/include/TimeUnit.h diff --git a/j2735codec/core/202409/include/TireData.h b/j2735codec/core/j2735_202409/include/TireData.h similarity index 100% rename from j2735codec/core/202409/include/TireData.h rename to j2735codec/core/j2735_202409/include/TireData.h diff --git a/j2735codec/core/202409/include/TireDataList.h b/j2735codec/core/j2735_202409/include/TireDataList.h similarity index 100% rename from j2735codec/core/202409/include/TireDataList.h rename to j2735codec/core/j2735_202409/include/TireDataList.h diff --git a/j2735codec/core/202409/include/TireLeakageRate.h b/j2735codec/core/j2735_202409/include/TireLeakageRate.h similarity index 100% rename from j2735codec/core/202409/include/TireLeakageRate.h rename to j2735codec/core/j2735_202409/include/TireLeakageRate.h diff --git a/j2735codec/core/202409/include/TireLocation.h b/j2735codec/core/j2735_202409/include/TireLocation.h similarity index 100% rename from j2735codec/core/202409/include/TireLocation.h rename to j2735codec/core/j2735_202409/include/TireLocation.h diff --git a/j2735codec/core/202409/include/TirePressure.h b/j2735codec/core/j2735_202409/include/TirePressure.h similarity index 100% rename from j2735codec/core/202409/include/TirePressure.h rename to j2735codec/core/j2735_202409/include/TirePressure.h diff --git a/j2735codec/core/202409/include/TirePressureThresholdDetection.h b/j2735codec/core/j2735_202409/include/TirePressureThresholdDetection.h similarity index 100% rename from j2735codec/core/202409/include/TirePressureThresholdDetection.h rename to j2735codec/core/j2735_202409/include/TirePressureThresholdDetection.h diff --git a/j2735codec/core/202409/include/TireTemp.h b/j2735codec/core/j2735_202409/include/TireTemp.h similarity index 100% rename from j2735codec/core/202409/include/TireTemp.h rename to j2735codec/core/j2735_202409/include/TireTemp.h diff --git a/j2735codec/core/202409/include/Tolerance.h b/j2735codec/core/j2735_202409/include/Tolerance.h similarity index 100% rename from j2735codec/core/202409/include/Tolerance.h rename to j2735codec/core/j2735_202409/include/Tolerance.h diff --git a/j2735codec/core/202409/include/TollAdvertisementInfo.h b/j2735codec/core/j2735_202409/include/TollAdvertisementInfo.h similarity index 100% rename from j2735codec/core/202409/include/TollAdvertisementInfo.h rename to j2735codec/core/j2735_202409/include/TollAdvertisementInfo.h diff --git a/j2735codec/core/202409/include/TollAdvertisementMessage.h b/j2735codec/core/j2735_202409/include/TollAdvertisementMessage.h similarity index 100% rename from j2735codec/core/202409/include/TollAdvertisementMessage.h rename to j2735codec/core/j2735_202409/include/TollAdvertisementMessage.h diff --git a/j2735codec/core/202409/include/TollChargerInfo.h b/j2735codec/core/j2735_202409/include/TollChargerInfo.h similarity index 100% rename from j2735codec/core/202409/include/TollChargerInfo.h rename to j2735codec/core/j2735_202409/include/TollChargerInfo.h diff --git a/j2735codec/core/202409/include/TollChargesTable.h b/j2735codec/core/j2735_202409/include/TollChargesTable.h similarity index 100% rename from j2735codec/core/202409/include/TollChargesTable.h rename to j2735codec/core/j2735_202409/include/TollChargesTable.h diff --git a/j2735codec/core/202409/include/TollPointID.h b/j2735codec/core/j2735_202409/include/TollPointID.h similarity index 100% rename from j2735codec/core/202409/include/TollPointID.h rename to j2735codec/core/j2735_202409/include/TollPointID.h diff --git a/j2735codec/core/202409/include/TollPointMap.h b/j2735codec/core/j2735_202409/include/TollPointMap.h similarity index 100% rename from j2735codec/core/202409/include/TollPointMap.h rename to j2735codec/core/j2735_202409/include/TollPointMap.h diff --git a/j2735codec/core/202409/include/TollServiceProviderData.h b/j2735codec/core/j2735_202409/include/TollServiceProviderData.h similarity index 100% rename from j2735codec/core/202409/include/TollServiceProviderData.h rename to j2735codec/core/j2735_202409/include/TollServiceProviderData.h diff --git a/j2735codec/core/202409/include/TollUsageAckMessage.h b/j2735codec/core/j2735_202409/include/TollUsageAckMessage.h similarity index 100% rename from j2735codec/core/202409/include/TollUsageAckMessage.h rename to j2735codec/core/j2735_202409/include/TollUsageAckMessage.h diff --git a/j2735codec/core/202409/include/TollUsageMessage.h b/j2735codec/core/j2735_202409/include/TollUsageMessage.h similarity index 100% rename from j2735codec/core/202409/include/TollUsageMessage.h rename to j2735codec/core/j2735_202409/include/TollUsageMessage.h diff --git a/j2735codec/core/202409/include/TollUserData.h b/j2735codec/core/j2735_202409/include/TollUserData.h similarity index 100% rename from j2735codec/core/202409/include/TollUserData.h rename to j2735codec/core/j2735_202409/include/TollUserData.h diff --git a/j2735codec/core/202409/include/TollVehicleId.h b/j2735codec/core/j2735_202409/include/TollVehicleId.h similarity index 100% rename from j2735codec/core/202409/include/TollVehicleId.h rename to j2735codec/core/j2735_202409/include/TollVehicleId.h diff --git a/j2735codec/core/202409/include/Torque.h b/j2735codec/core/j2735_202409/include/Torque.h similarity index 100% rename from j2735codec/core/202409/include/Torque.h rename to j2735codec/core/j2735_202409/include/Torque.h diff --git a/j2735codec/core/202409/include/TotalMass.h b/j2735codec/core/j2735_202409/include/TotalMass.h similarity index 100% rename from j2735codec/core/202409/include/TotalMass.h rename to j2735codec/core/j2735_202409/include/TotalMass.h diff --git a/j2735codec/core/202409/include/TotalWeightCharges.h b/j2735codec/core/j2735_202409/include/TotalWeightCharges.h similarity index 100% rename from j2735codec/core/202409/include/TotalWeightCharges.h rename to j2735codec/core/j2735_202409/include/TotalWeightCharges.h diff --git a/j2735codec/core/202409/include/TractionControlStatus.h b/j2735codec/core/j2735_202409/include/TractionControlStatus.h similarity index 100% rename from j2735codec/core/202409/include/TractionControlStatus.h rename to j2735codec/core/j2735_202409/include/TractionControlStatus.h diff --git a/j2735codec/core/202409/include/TrafficConditions.h b/j2735codec/core/j2735_202409/include/TrafficConditions.h similarity index 100% rename from j2735codec/core/202409/include/TrafficConditions.h rename to j2735codec/core/j2735_202409/include/TrafficConditions.h diff --git a/j2735codec/core/202409/include/TrafficLightControllerStatus.h b/j2735codec/core/j2735_202409/include/TrafficLightControllerStatus.h similarity index 100% rename from j2735codec/core/202409/include/TrafficLightControllerStatus.h rename to j2735codec/core/j2735_202409/include/TrafficLightControllerStatus.h diff --git a/j2735codec/core/202409/include/TrafficLightDirectionCode.h b/j2735codec/core/j2735_202409/include/TrafficLightDirectionCode.h similarity index 100% rename from j2735codec/core/202409/include/TrafficLightDirectionCode.h rename to j2735codec/core/j2735_202409/include/TrafficLightDirectionCode.h diff --git a/j2735codec/core/202409/include/TrafficLightID.h b/j2735codec/core/j2735_202409/include/TrafficLightID.h similarity index 100% rename from j2735codec/core/202409/include/TrafficLightID.h rename to j2735codec/core/j2735_202409/include/TrafficLightID.h diff --git a/j2735codec/core/202409/include/TrafficLightIntervalType.h b/j2735codec/core/j2735_202409/include/TrafficLightIntervalType.h similarity index 100% rename from j2735codec/core/202409/include/TrafficLightIntervalType.h rename to j2735codec/core/j2735_202409/include/TrafficLightIntervalType.h diff --git a/j2735codec/core/202409/include/TrafficLightOperationStatus.h b/j2735codec/core/j2735_202409/include/TrafficLightOperationStatus.h similarity index 100% rename from j2735codec/core/202409/include/TrafficLightOperationStatus.h rename to j2735codec/core/j2735_202409/include/TrafficLightOperationStatus.h diff --git a/j2735codec/core/202409/include/TrafficLightStatus.h b/j2735codec/core/j2735_202409/include/TrafficLightStatus.h similarity index 100% rename from j2735codec/core/202409/include/TrafficLightStatus.h rename to j2735codec/core/j2735_202409/include/TrafficLightStatus.h diff --git a/j2735codec/core/202409/include/TrafficLightStatusList.h b/j2735codec/core/j2735_202409/include/TrafficLightStatusList.h similarity index 100% rename from j2735codec/core/202409/include/TrafficLightStatusList.h rename to j2735codec/core/j2735_202409/include/TrafficLightStatusList.h diff --git a/j2735codec/core/202409/include/TrafficLightStatusMessage.h b/j2735codec/core/j2735_202409/include/TrafficLightStatusMessage.h similarity index 100% rename from j2735codec/core/202409/include/TrafficLightStatusMessage.h rename to j2735codec/core/j2735_202409/include/TrafficLightStatusMessage.h diff --git a/j2735codec/core/202409/include/TrafficLightType.h b/j2735codec/core/j2735_202409/include/TrafficLightType.h similarity index 100% rename from j2735codec/core/202409/include/TrafficLightType.h rename to j2735codec/core/j2735_202409/include/TrafficLightType.h diff --git a/j2735codec/core/202409/include/TrafficLightingStatus.h b/j2735codec/core/j2735_202409/include/TrafficLightingStatus.h similarity index 100% rename from j2735codec/core/202409/include/TrafficLightingStatus.h rename to j2735codec/core/j2735_202409/include/TrafficLightingStatus.h diff --git a/j2735codec/core/202409/include/TrafficSignalPhaseAndTiming.h b/j2735codec/core/j2735_202409/include/TrafficSignalPhaseAndTiming.h similarity index 100% rename from j2735codec/core/202409/include/TrafficSignalPhaseAndTiming.h rename to j2735codec/core/j2735_202409/include/TrafficSignalPhaseAndTiming.h diff --git a/j2735codec/core/202409/include/TrailerCharacteristics.h b/j2735codec/core/j2735_202409/include/TrailerCharacteristics.h similarity index 100% rename from j2735codec/core/202409/include/TrailerCharacteristics.h rename to j2735codec/core/j2735_202409/include/TrailerCharacteristics.h diff --git a/j2735codec/core/202409/include/TrailerData.h b/j2735codec/core/j2735_202409/include/TrailerData.h similarity index 100% rename from j2735codec/core/202409/include/TrailerData.h rename to j2735codec/core/j2735_202409/include/TrailerData.h diff --git a/j2735codec/core/202409/include/TrailerDetails.h b/j2735codec/core/j2735_202409/include/TrailerDetails.h similarity index 100% rename from j2735codec/core/202409/include/TrailerDetails.h rename to j2735codec/core/j2735_202409/include/TrailerDetails.h diff --git a/j2735codec/core/202409/include/TrailerHistoryPoint.h b/j2735codec/core/j2735_202409/include/TrailerHistoryPoint.h similarity index 100% rename from j2735codec/core/202409/include/TrailerHistoryPoint.h rename to j2735codec/core/j2735_202409/include/TrailerHistoryPoint.h diff --git a/j2735codec/core/202409/include/TrailerHistoryPointList.h b/j2735codec/core/j2735_202409/include/TrailerHistoryPointList.h similarity index 100% rename from j2735codec/core/202409/include/TrailerHistoryPointList.h rename to j2735codec/core/j2735_202409/include/TrailerHistoryPointList.h diff --git a/j2735codec/core/202409/include/TrailerMass.h b/j2735codec/core/j2735_202409/include/TrailerMass.h similarity index 100% rename from j2735codec/core/202409/include/TrailerMass.h rename to j2735codec/core/j2735_202409/include/TrailerMass.h diff --git a/j2735codec/core/202409/include/TrailerType.h b/j2735codec/core/j2735_202409/include/TrailerType.h similarity index 100% rename from j2735codec/core/202409/include/TrailerType.h rename to j2735codec/core/j2735_202409/include/TrailerType.h diff --git a/j2735codec/core/202409/include/TrailerUnitDescJ2945Slash1B.h b/j2735codec/core/j2735_202409/include/TrailerUnitDescJ2945Slash1B.h similarity index 100% rename from j2735codec/core/202409/include/TrailerUnitDescJ2945Slash1B.h rename to j2735codec/core/j2735_202409/include/TrailerUnitDescJ2945Slash1B.h diff --git a/j2735codec/core/202409/include/TrailerUnitDescription.h b/j2735codec/core/j2735_202409/include/TrailerUnitDescription.h similarity index 100% rename from j2735codec/core/202409/include/TrailerUnitDescription.h rename to j2735codec/core/j2735_202409/include/TrailerUnitDescription.h diff --git a/j2735codec/core/202409/include/TrailerUnitDescriptionList.h b/j2735codec/core/j2735_202409/include/TrailerUnitDescriptionList.h similarity index 100% rename from j2735codec/core/202409/include/TrailerUnitDescriptionList.h rename to j2735codec/core/j2735_202409/include/TrailerUnitDescriptionList.h diff --git a/j2735codec/core/202409/include/TrailerWeight.h b/j2735codec/core/j2735_202409/include/TrailerWeight.h similarity index 100% rename from j2735codec/core/202409/include/TrailerWeight.h rename to j2735codec/core/j2735_202409/include/TrailerWeight.h diff --git a/j2735codec/core/202409/include/TrailersJ2945Slash1B.h b/j2735codec/core/j2735_202409/include/TrailersJ2945Slash1B.h similarity index 100% rename from j2735codec/core/202409/include/TrailersJ2945Slash1B.h rename to j2735codec/core/j2735_202409/include/TrailersJ2945Slash1B.h diff --git a/j2735codec/core/202409/include/TransitMode.h b/j2735codec/core/j2735_202409/include/TransitMode.h similarity index 100% rename from j2735codec/core/202409/include/TransitMode.h rename to j2735codec/core/j2735_202409/include/TransitMode.h diff --git a/j2735codec/core/202409/include/TransitOperations.h b/j2735codec/core/j2735_202409/include/TransitOperations.h similarity index 100% rename from j2735codec/core/202409/include/TransitOperations.h rename to j2735codec/core/j2735_202409/include/TransitOperations.h diff --git a/j2735codec/core/202409/include/TransitStatus.h b/j2735codec/core/j2735_202409/include/TransitStatus.h similarity index 100% rename from j2735codec/core/202409/include/TransitStatus.h rename to j2735codec/core/j2735_202409/include/TransitStatus.h diff --git a/j2735codec/core/202409/include/TransitVehicleOccupancy.h b/j2735codec/core/j2735_202409/include/TransitVehicleOccupancy.h similarity index 100% rename from j2735codec/core/202409/include/TransitVehicleOccupancy.h rename to j2735codec/core/j2735_202409/include/TransitVehicleOccupancy.h diff --git a/j2735codec/core/202409/include/TransitVehicleStatus.h b/j2735codec/core/j2735_202409/include/TransitVehicleStatus.h similarity index 100% rename from j2735codec/core/202409/include/TransitVehicleStatus.h rename to j2735codec/core/j2735_202409/include/TransitVehicleStatus.h diff --git a/j2735codec/core/202409/include/TransmissionAndSpeed.h b/j2735codec/core/j2735_202409/include/TransmissionAndSpeed.h similarity index 100% rename from j2735codec/core/202409/include/TransmissionAndSpeed.h rename to j2735codec/core/j2735_202409/include/TransmissionAndSpeed.h diff --git a/j2735codec/core/202409/include/TransmissionState.h b/j2735codec/core/j2735_202409/include/TransmissionState.h similarity index 100% rename from j2735codec/core/202409/include/TransmissionState.h rename to j2735codec/core/j2735_202409/include/TransmissionState.h diff --git a/j2735codec/core/202409/include/TravelerDataFrame.h b/j2735codec/core/j2735_202409/include/TravelerDataFrame.h similarity index 100% rename from j2735codec/core/202409/include/TravelerDataFrame.h rename to j2735codec/core/j2735_202409/include/TravelerDataFrame.h diff --git a/j2735codec/core/202409/include/TravelerDataFrameList.h b/j2735codec/core/j2735_202409/include/TravelerDataFrameList.h similarity index 100% rename from j2735codec/core/202409/include/TravelerDataFrameList.h rename to j2735codec/core/j2735_202409/include/TravelerDataFrameList.h diff --git a/j2735codec/core/202409/include/TravelerDataFrameNewPartIIIContent.h b/j2735codec/core/j2735_202409/include/TravelerDataFrameNewPartIIIContent.h similarity index 100% rename from j2735codec/core/202409/include/TravelerDataFrameNewPartIIIContent.h rename to j2735codec/core/j2735_202409/include/TravelerDataFrameNewPartIIIContent.h diff --git a/j2735codec/core/202409/include/TravelerGroupAffected.h b/j2735codec/core/j2735_202409/include/TravelerGroupAffected.h similarity index 100% rename from j2735codec/core/202409/include/TravelerGroupAffected.h rename to j2735codec/core/j2735_202409/include/TravelerGroupAffected.h diff --git a/j2735codec/core/202409/include/TravelerInfoType.h b/j2735codec/core/j2735_202409/include/TravelerInfoType.h similarity index 100% rename from j2735codec/core/202409/include/TravelerInfoType.h rename to j2735codec/core/j2735_202409/include/TravelerInfoType.h diff --git a/j2735codec/core/202409/include/TravelerInformation.h b/j2735codec/core/j2735_202409/include/TravelerInformation.h similarity index 100% rename from j2735codec/core/202409/include/TravelerInformation.h rename to j2735codec/core/j2735_202409/include/TravelerInformation.h diff --git a/j2735codec/core/202409/include/TripInfo.h b/j2735codec/core/j2735_202409/include/TripInfo.h similarity index 100% rename from j2735codec/core/202409/include/TripInfo.h rename to j2735codec/core/j2735_202409/include/TripInfo.h diff --git a/j2735codec/core/202409/include/TumAck.h b/j2735codec/core/j2735_202409/include/TumAck.h similarity index 100% rename from j2735codec/core/202409/include/TumAck.h rename to j2735codec/core/j2735_202409/include/TumAck.h diff --git a/j2735codec/core/202409/include/TumAckHash.h b/j2735codec/core/j2735_202409/include/TumAckHash.h similarity index 100% rename from j2735codec/core/202409/include/TumAckHash.h rename to j2735codec/core/j2735_202409/include/TumAckHash.h diff --git a/j2735codec/core/202409/include/TumData.h b/j2735codec/core/j2735_202409/include/TumData.h similarity index 100% rename from j2735codec/core/202409/include/TumData.h rename to j2735codec/core/j2735_202409/include/TumData.h diff --git a/j2735codec/core/202409/include/TumHash.h b/j2735codec/core/j2735_202409/include/TumHash.h similarity index 100% rename from j2735codec/core/202409/include/TumHash.h rename to j2735codec/core/j2735_202409/include/TumHash.h diff --git a/j2735codec/core/202409/include/TumInstructions.h b/j2735codec/core/j2735_202409/include/TumInstructions.h similarity index 100% rename from j2735codec/core/202409/include/TumInstructions.h rename to j2735codec/core/j2735_202409/include/TumInstructions.h diff --git a/j2735codec/core/202409/include/TyreConfiguration.h b/j2735codec/core/j2735_202409/include/TyreConfiguration.h similarity index 100% rename from j2735codec/core/202409/include/TyreConfiguration.h rename to j2735codec/core/j2735_202409/include/TyreConfiguration.h diff --git a/j2735codec/core/202409/include/URL-Base.h b/j2735codec/core/j2735_202409/include/URL-Base.h similarity index 100% rename from j2735codec/core/202409/include/URL-Base.h rename to j2735codec/core/j2735_202409/include/URL-Base.h diff --git a/j2735codec/core/202409/include/URL-Link.h b/j2735codec/core/j2735_202409/include/URL-Link.h similarity index 100% rename from j2735codec/core/202409/include/URL-Link.h rename to j2735codec/core/j2735_202409/include/URL-Link.h diff --git a/j2735codec/core/202409/include/URL-Short.h b/j2735codec/core/j2735_202409/include/URL-Short.h similarity index 100% rename from j2735codec/core/202409/include/URL-Short.h rename to j2735codec/core/j2735_202409/include/URL-Short.h diff --git a/j2735codec/core/202409/include/UniqueMSGID.h b/j2735codec/core/j2735_202409/include/UniqueMSGID.h similarity index 100% rename from j2735codec/core/202409/include/UniqueMSGID.h rename to j2735codec/core/j2735_202409/include/UniqueMSGID.h diff --git a/j2735codec/core/202409/include/Units.h b/j2735codec/core/j2735_202409/include/Units.h similarity index 100% rename from j2735codec/core/202409/include/Units.h rename to j2735codec/core/j2735_202409/include/Units.h diff --git a/j2735codec/core/202409/include/UnusualDriving.h b/j2735codec/core/j2735_202409/include/UnusualDriving.h similarity index 100% rename from j2735codec/core/202409/include/UnusualDriving.h rename to j2735codec/core/j2735_202409/include/UnusualDriving.h diff --git a/j2735codec/core/202409/include/UsageReport.h b/j2735codec/core/j2735_202409/include/UsageReport.h similarity index 100% rename from j2735codec/core/202409/include/UsageReport.h rename to j2735codec/core/j2735_202409/include/UsageReport.h diff --git a/j2735codec/core/202409/include/UserClassId.h b/j2735codec/core/j2735_202409/include/UserClassId.h similarity index 100% rename from j2735codec/core/202409/include/UserClassId.h rename to j2735codec/core/j2735_202409/include/UserClassId.h diff --git a/j2735codec/core/202409/include/UserData.h b/j2735codec/core/j2735_202409/include/UserData.h similarity index 100% rename from j2735codec/core/202409/include/UserData.h rename to j2735codec/core/j2735_202409/include/UserData.h diff --git a/j2735codec/core/202409/include/UserFeeInfo.h b/j2735codec/core/j2735_202409/include/UserFeeInfo.h similarity index 100% rename from j2735codec/core/202409/include/UserFeeInfo.h rename to j2735codec/core/j2735_202409/include/UserFeeInfo.h diff --git a/j2735codec/core/202409/include/UserId.h b/j2735codec/core/j2735_202409/include/UserId.h similarity index 100% rename from j2735codec/core/202409/include/UserId.h rename to j2735codec/core/j2735_202409/include/UserId.h diff --git a/j2735codec/core/202409/include/UserSizeAndBehaviour.h b/j2735codec/core/j2735_202409/include/UserSizeAndBehaviour.h similarity index 100% rename from j2735codec/core/202409/include/UserSizeAndBehaviour.h rename to j2735codec/core/j2735_202409/include/UserSizeAndBehaviour.h diff --git a/j2735codec/core/202409/include/VINstring.h b/j2735codec/core/j2735_202409/include/VINstring.h similarity index 100% rename from j2735codec/core/202409/include/VINstring.h rename to j2735codec/core/j2735_202409/include/VINstring.h diff --git a/j2735codec/core/202409/include/ValidManeuvers.h b/j2735codec/core/j2735_202409/include/ValidManeuvers.h similarity index 100% rename from j2735codec/core/202409/include/ValidManeuvers.h rename to j2735codec/core/j2735_202409/include/ValidManeuvers.h diff --git a/j2735codec/core/202409/include/ValidRegion.h b/j2735codec/core/j2735_202409/include/ValidRegion.h similarity index 100% rename from j2735codec/core/202409/include/ValidRegion.h rename to j2735codec/core/j2735_202409/include/ValidRegion.h diff --git a/j2735codec/core/202409/include/ValidityOfContract.h b/j2735codec/core/j2735_202409/include/ValidityOfContract.h similarity index 100% rename from j2735codec/core/202409/include/ValidityOfContract.h rename to j2735codec/core/j2735_202409/include/ValidityOfContract.h diff --git a/j2735codec/core/202409/include/VariationStdDev.h b/j2735codec/core/j2735_202409/include/VariationStdDev.h similarity index 100% rename from j2735codec/core/202409/include/VariationStdDev.h rename to j2735codec/core/j2735_202409/include/VariationStdDev.h diff --git a/j2735codec/core/202409/include/VehTypeCharges.h b/j2735codec/core/j2735_202409/include/VehTypeCharges.h similarity index 100% rename from j2735codec/core/202409/include/VehTypeCharges.h rename to j2735codec/core/j2735_202409/include/VehTypeCharges.h diff --git a/j2735codec/core/202409/include/VehTypeChargesTable.h b/j2735codec/core/j2735_202409/include/VehTypeChargesTable.h similarity index 100% rename from j2735codec/core/202409/include/VehTypeChargesTable.h rename to j2735codec/core/j2735_202409/include/VehTypeChargesTable.h diff --git a/j2735codec/core/202409/include/VehicleAuthenticator.h b/j2735codec/core/j2735_202409/include/VehicleAuthenticator.h similarity index 100% rename from j2735codec/core/202409/include/VehicleAuthenticator.h rename to j2735codec/core/j2735_202409/include/VehicleAuthenticator.h diff --git a/j2735codec/core/202409/include/VehicleAxles.h b/j2735codec/core/j2735_202409/include/VehicleAxles.h similarity index 100% rename from j2735codec/core/202409/include/VehicleAxles.h rename to j2735codec/core/j2735_202409/include/VehicleAxles.h diff --git a/j2735codec/core/202409/include/VehicleAxlesAndWeightInfo.h b/j2735codec/core/j2735_202409/include/VehicleAxlesAndWeightInfo.h similarity index 100% rename from j2735codec/core/202409/include/VehicleAxlesAndWeightInfo.h rename to j2735codec/core/j2735_202409/include/VehicleAxlesAndWeightInfo.h diff --git a/j2735codec/core/202409/include/VehicleAxlesNumber.h b/j2735codec/core/j2735_202409/include/VehicleAxlesNumber.h similarity index 100% rename from j2735codec/core/202409/include/VehicleAxlesNumber.h rename to j2735codec/core/j2735_202409/include/VehicleAxlesNumber.h diff --git a/j2735codec/core/202409/include/VehicleClass.h b/j2735codec/core/j2735_202409/include/VehicleClass.h similarity index 100% rename from j2735codec/core/202409/include/VehicleClass.h rename to j2735codec/core/j2735_202409/include/VehicleClass.h diff --git a/j2735codec/core/202409/include/VehicleClassification.h b/j2735codec/core/j2735_202409/include/VehicleClassification.h similarity index 100% rename from j2735codec/core/202409/include/VehicleClassification.h rename to j2735codec/core/j2735_202409/include/VehicleClassification.h diff --git a/j2735codec/core/202409/include/VehicleCurrentMaxTrainWeight.h b/j2735codec/core/j2735_202409/include/VehicleCurrentMaxTrainWeight.h similarity index 100% rename from j2735codec/core/202409/include/VehicleCurrentMaxTrainWeight.h rename to j2735codec/core/j2735_202409/include/VehicleCurrentMaxTrainWeight.h diff --git a/j2735codec/core/202409/include/VehicleData.h b/j2735codec/core/j2735_202409/include/VehicleData.h similarity index 100% rename from j2735codec/core/202409/include/VehicleData.h rename to j2735codec/core/j2735_202409/include/VehicleData.h diff --git a/j2735codec/core/202409/include/VehicleDescription.h b/j2735codec/core/j2735_202409/include/VehicleDescription.h similarity index 100% rename from j2735codec/core/202409/include/VehicleDescription.h rename to j2735codec/core/j2735_202409/include/VehicleDescription.h diff --git a/j2735codec/core/202409/include/VehicleDimensions.h b/j2735codec/core/j2735_202409/include/VehicleDimensions.h similarity index 100% rename from j2735codec/core/202409/include/VehicleDimensions.h rename to j2735codec/core/j2735_202409/include/VehicleDimensions.h diff --git a/j2735codec/core/202409/include/VehicleEventFlags.h b/j2735codec/core/j2735_202409/include/VehicleEventFlags.h similarity index 100% rename from j2735codec/core/202409/include/VehicleEventFlags.h rename to j2735codec/core/j2735_202409/include/VehicleEventFlags.h diff --git a/j2735codec/core/202409/include/VehicleHeight.h b/j2735codec/core/j2735_202409/include/VehicleHeight.h similarity index 100% rename from j2735codec/core/202409/include/VehicleHeight.h rename to j2735codec/core/j2735_202409/include/VehicleHeight.h diff --git a/j2735codec/core/202409/include/VehicleID.h b/j2735codec/core/j2735_202409/include/VehicleID.h similarity index 100% rename from j2735codec/core/202409/include/VehicleID.h rename to j2735codec/core/j2735_202409/include/VehicleID.h diff --git a/j2735codec/core/202409/include/VehicleIdent.h b/j2735codec/core/j2735_202409/include/VehicleIdent.h similarity index 100% rename from j2735codec/core/202409/include/VehicleIdent.h rename to j2735codec/core/j2735_202409/include/VehicleIdent.h diff --git a/j2735codec/core/202409/include/VehicleLength.h b/j2735codec/core/j2735_202409/include/VehicleLength.h similarity index 100% rename from j2735codec/core/202409/include/VehicleLength.h rename to j2735codec/core/j2735_202409/include/VehicleLength.h diff --git a/j2735codec/core/202409/include/VehicleMass.h b/j2735codec/core/j2735_202409/include/VehicleMass.h similarity index 100% rename from j2735codec/core/202409/include/VehicleMass.h rename to j2735codec/core/j2735_202409/include/VehicleMass.h diff --git a/j2735codec/core/202409/include/VehicleReport.h b/j2735codec/core/j2735_202409/include/VehicleReport.h similarity index 100% rename from j2735codec/core/202409/include/VehicleReport.h rename to j2735codec/core/j2735_202409/include/VehicleReport.h diff --git a/j2735codec/core/202409/include/VehicleSafetyExtensions.h b/j2735codec/core/j2735_202409/include/VehicleSafetyExtensions.h similarity index 100% rename from j2735codec/core/202409/include/VehicleSafetyExtensions.h rename to j2735codec/core/j2735_202409/include/VehicleSafetyExtensions.h diff --git a/j2735codec/core/202409/include/VehicleSize.h b/j2735codec/core/j2735_202409/include/VehicleSize.h similarity index 100% rename from j2735codec/core/202409/include/VehicleSize.h rename to j2735codec/core/j2735_202409/include/VehicleSize.h diff --git a/j2735codec/core/202409/include/VehicleSizeConfidence.h b/j2735codec/core/j2735_202409/include/VehicleSizeConfidence.h similarity index 100% rename from j2735codec/core/202409/include/VehicleSizeConfidence.h rename to j2735codec/core/j2735_202409/include/VehicleSizeConfidence.h diff --git a/j2735codec/core/202409/include/VehicleSpecificCharacteristics.h b/j2735codec/core/j2735_202409/include/VehicleSpecificCharacteristics.h similarity index 100% rename from j2735codec/core/202409/include/VehicleSpecificCharacteristics.h rename to j2735codec/core/j2735_202409/include/VehicleSpecificCharacteristics.h diff --git a/j2735codec/core/202409/include/VehicleStatus.h b/j2735codec/core/j2735_202409/include/VehicleStatus.h similarity index 100% rename from j2735codec/core/202409/include/VehicleStatus.h rename to j2735codec/core/j2735_202409/include/VehicleStatus.h diff --git a/j2735codec/core/202409/include/VehicleStatusDeviceTypeTag.h b/j2735codec/core/j2735_202409/include/VehicleStatusDeviceTypeTag.h similarity index 100% rename from j2735codec/core/202409/include/VehicleStatusDeviceTypeTag.h rename to j2735codec/core/j2735_202409/include/VehicleStatusDeviceTypeTag.h diff --git a/j2735codec/core/202409/include/VehicleStatusRequest.h b/j2735codec/core/j2735_202409/include/VehicleStatusRequest.h similarity index 100% rename from j2735codec/core/202409/include/VehicleStatusRequest.h rename to j2735codec/core/j2735_202409/include/VehicleStatusRequest.h diff --git a/j2735codec/core/202409/include/VehicleStatusRequestList.h b/j2735codec/core/j2735_202409/include/VehicleStatusRequestList.h similarity index 100% rename from j2735codec/core/202409/include/VehicleStatusRequestList.h rename to j2735codec/core/j2735_202409/include/VehicleStatusRequestList.h diff --git a/j2735codec/core/202409/include/VehicleToLanePosition.h b/j2735codec/core/j2735_202409/include/VehicleToLanePosition.h similarity index 100% rename from j2735codec/core/202409/include/VehicleToLanePosition.h rename to j2735codec/core/j2735_202409/include/VehicleToLanePosition.h diff --git a/j2735codec/core/202409/include/VehicleToLanePositionList.h b/j2735codec/core/j2735_202409/include/VehicleToLanePositionList.h similarity index 100% rename from j2735codec/core/202409/include/VehicleToLanePositionList.h rename to j2735codec/core/j2735_202409/include/VehicleToLanePositionList.h diff --git a/j2735codec/core/202409/include/VehicleTotalDistance.h b/j2735codec/core/j2735_202409/include/VehicleTotalDistance.h similarity index 100% rename from j2735codec/core/202409/include/VehicleTotalDistance.h rename to j2735codec/core/j2735_202409/include/VehicleTotalDistance.h diff --git a/j2735codec/core/202409/include/VehicleType.h b/j2735codec/core/j2735_202409/include/VehicleType.h similarity index 100% rename from j2735codec/core/202409/include/VehicleType.h rename to j2735codec/core/j2735_202409/include/VehicleType.h diff --git a/j2735codec/core/202409/include/VehicleTypes.h b/j2735codec/core/j2735_202409/include/VehicleTypes.h similarity index 100% rename from j2735codec/core/202409/include/VehicleTypes.h rename to j2735codec/core/j2735_202409/include/VehicleTypes.h diff --git a/j2735codec/core/202409/include/VehicleWeightLaden.h b/j2735codec/core/j2735_202409/include/VehicleWeightLaden.h similarity index 100% rename from j2735codec/core/202409/include/VehicleWeightLaden.h rename to j2735codec/core/j2735_202409/include/VehicleWeightLaden.h diff --git a/j2735codec/core/202409/include/VehicleWeightLimits.h b/j2735codec/core/j2735_202409/include/VehicleWeightLimits.h similarity index 100% rename from j2735codec/core/202409/include/VehicleWeightLimits.h rename to j2735codec/core/j2735_202409/include/VehicleWeightLimits.h diff --git a/j2735codec/core/202409/include/VehicleWidth.h b/j2735codec/core/j2735_202409/include/VehicleWidth.h similarity index 100% rename from j2735codec/core/202409/include/VehicleWidth.h rename to j2735codec/core/j2735_202409/include/VehicleWidth.h diff --git a/j2735codec/core/202409/include/Velocity.h b/j2735codec/core/j2735_202409/include/Velocity.h similarity index 100% rename from j2735codec/core/202409/include/Velocity.h rename to j2735codec/core/j2735_202409/include/Velocity.h diff --git a/j2735codec/core/202409/include/VertOffset-B07.h b/j2735codec/core/j2735_202409/include/VertOffset-B07.h similarity index 100% rename from j2735codec/core/202409/include/VertOffset-B07.h rename to j2735codec/core/j2735_202409/include/VertOffset-B07.h diff --git a/j2735codec/core/202409/include/VertOffset-B08.h b/j2735codec/core/j2735_202409/include/VertOffset-B08.h similarity index 100% rename from j2735codec/core/202409/include/VertOffset-B08.h rename to j2735codec/core/j2735_202409/include/VertOffset-B08.h diff --git a/j2735codec/core/202409/include/VertOffset-B09.h b/j2735codec/core/j2735_202409/include/VertOffset-B09.h similarity index 100% rename from j2735codec/core/202409/include/VertOffset-B09.h rename to j2735codec/core/j2735_202409/include/VertOffset-B09.h diff --git a/j2735codec/core/202409/include/VertOffset-B10.h b/j2735codec/core/j2735_202409/include/VertOffset-B10.h similarity index 100% rename from j2735codec/core/202409/include/VertOffset-B10.h rename to j2735codec/core/j2735_202409/include/VertOffset-B10.h diff --git a/j2735codec/core/202409/include/VertOffset-B11.h b/j2735codec/core/j2735_202409/include/VertOffset-B11.h similarity index 100% rename from j2735codec/core/202409/include/VertOffset-B11.h rename to j2735codec/core/j2735_202409/include/VertOffset-B11.h diff --git a/j2735codec/core/202409/include/VertOffset-B12.h b/j2735codec/core/j2735_202409/include/VertOffset-B12.h similarity index 100% rename from j2735codec/core/202409/include/VertOffset-B12.h rename to j2735codec/core/j2735_202409/include/VertOffset-B12.h diff --git a/j2735codec/core/202409/include/VerticalAcceleration.h b/j2735codec/core/j2735_202409/include/VerticalAcceleration.h similarity index 100% rename from j2735codec/core/202409/include/VerticalAcceleration.h rename to j2735codec/core/j2735_202409/include/VerticalAcceleration.h diff --git a/j2735codec/core/202409/include/VerticalAccelerationThreshold.h b/j2735codec/core/j2735_202409/include/VerticalAccelerationThreshold.h similarity index 100% rename from j2735codec/core/202409/include/VerticalAccelerationThreshold.h rename to j2735codec/core/j2735_202409/include/VerticalAccelerationThreshold.h diff --git a/j2735codec/core/202409/include/VerticalOffset.h b/j2735codec/core/j2735_202409/include/VerticalOffset.h similarity index 100% rename from j2735codec/core/202409/include/VerticalOffset.h rename to j2735codec/core/j2735_202409/include/VerticalOffset.h diff --git a/j2735codec/core/202409/include/VisibilityAndAirQuality.h b/j2735codec/core/j2735_202409/include/VisibilityAndAirQuality.h similarity index 100% rename from j2735codec/core/202409/include/VisibilityAndAirQuality.h rename to j2735codec/core/j2735_202409/include/VisibilityAndAirQuality.h diff --git a/j2735codec/core/202409/include/VisualLink.h b/j2735codec/core/j2735_202409/include/VisualLink.h similarity index 100% rename from j2735codec/core/202409/include/VisualLink.h rename to j2735codec/core/j2735_202409/include/VisualLink.h diff --git a/j2735codec/core/202409/include/WDMSFleetData.h b/j2735codec/core/j2735_202409/include/WDMSFleetData.h similarity index 100% rename from j2735codec/core/202409/include/WDMSFleetData.h rename to j2735codec/core/j2735_202409/include/WDMSFleetData.h diff --git a/j2735codec/core/202409/include/WaitOnStopline.h b/j2735codec/core/j2735_202409/include/WaitOnStopline.h similarity index 100% rename from j2735codec/core/202409/include/WaitOnStopline.h rename to j2735codec/core/j2735_202409/include/WaitOnStopline.h diff --git a/j2735codec/core/202409/include/WarningAdvice.h b/j2735codec/core/j2735_202409/include/WarningAdvice.h similarity index 100% rename from j2735codec/core/202409/include/WarningAdvice.h rename to j2735codec/core/j2735_202409/include/WarningAdvice.h diff --git a/j2735codec/core/202409/include/WeatherConditions.h b/j2735codec/core/j2735_202409/include/WeatherConditions.h similarity index 100% rename from j2735codec/core/202409/include/WeatherConditions.h rename to j2735codec/core/j2735_202409/include/WeatherConditions.h diff --git a/j2735codec/core/202409/include/WeatherProbe.h b/j2735codec/core/j2735_202409/include/WeatherProbe.h similarity index 100% rename from j2735codec/core/202409/include/WeatherProbe.h rename to j2735codec/core/j2735_202409/include/WeatherProbe.h diff --git a/j2735codec/core/202409/include/WeatherReport.h b/j2735codec/core/j2735_202409/include/WeatherReport.h similarity index 100% rename from j2735codec/core/202409/include/WeatherReport.h rename to j2735codec/core/j2735_202409/include/WeatherReport.h diff --git a/j2735codec/core/202409/include/Weekday.h b/j2735codec/core/j2735_202409/include/Weekday.h similarity index 100% rename from j2735codec/core/202409/include/Weekday.h rename to j2735codec/core/j2735_202409/include/Weekday.h diff --git a/j2735codec/core/202409/include/WeightCharges.h b/j2735codec/core/j2735_202409/include/WeightCharges.h similarity index 100% rename from j2735codec/core/202409/include/WeightCharges.h rename to j2735codec/core/j2735_202409/include/WeightCharges.h diff --git a/j2735codec/core/202409/include/WeightChargesTable.h b/j2735codec/core/j2735_202409/include/WeightChargesTable.h similarity index 100% rename from j2735codec/core/202409/include/WeightChargesTable.h rename to j2735codec/core/j2735_202409/include/WeightChargesTable.h diff --git a/j2735codec/core/202409/include/WheelEndElectFault.h b/j2735codec/core/j2735_202409/include/WheelEndElectFault.h similarity index 100% rename from j2735codec/core/202409/include/WheelEndElectFault.h rename to j2735codec/core/j2735_202409/include/WheelEndElectFault.h diff --git a/j2735codec/core/202409/include/WheelSensorStatus.h b/j2735codec/core/j2735_202409/include/WheelSensorStatus.h similarity index 100% rename from j2735codec/core/202409/include/WheelSensorStatus.h rename to j2735codec/core/j2735_202409/include/WheelSensorStatus.h diff --git a/j2735codec/core/202409/include/Winds.h b/j2735codec/core/j2735_202409/include/Winds.h similarity index 100% rename from j2735codec/core/202409/include/Winds.h rename to j2735codec/core/j2735_202409/include/Winds.h diff --git a/j2735codec/core/202409/include/WinterDrivingIndex.h b/j2735codec/core/j2735_202409/include/WinterDrivingIndex.h similarity index 100% rename from j2735codec/core/202409/include/WinterDrivingIndex.h rename to j2735codec/core/j2735_202409/include/WinterDrivingIndex.h diff --git a/j2735codec/core/202409/include/WinterDrivingRestrictions.h b/j2735codec/core/j2735_202409/include/WinterDrivingRestrictions.h similarity index 100% rename from j2735codec/core/202409/include/WinterDrivingRestrictions.h rename to j2735codec/core/j2735_202409/include/WinterDrivingRestrictions.h diff --git a/j2735codec/core/202409/include/WiperRate.h b/j2735codec/core/j2735_202409/include/WiperRate.h similarity index 100% rename from j2735codec/core/202409/include/WiperRate.h rename to j2735codec/core/j2735_202409/include/WiperRate.h diff --git a/j2735codec/core/202409/include/WiperSet.h b/j2735codec/core/j2735_202409/include/WiperSet.h similarity index 100% rename from j2735codec/core/202409/include/WiperSet.h rename to j2735codec/core/j2735_202409/include/WiperSet.h diff --git a/j2735codec/core/202409/include/WiperStatus.h b/j2735codec/core/j2735_202409/include/WiperStatus.h similarity index 100% rename from j2735codec/core/202409/include/WiperStatus.h rename to j2735codec/core/j2735_202409/include/WiperStatus.h diff --git a/j2735codec/core/202409/include/WorkZone.h b/j2735codec/core/j2735_202409/include/WorkZone.h similarity index 100% rename from j2735codec/core/202409/include/WorkZone.h rename to j2735codec/core/j2735_202409/include/WorkZone.h diff --git a/j2735codec/core/202409/include/Yaw.h b/j2735codec/core/j2735_202409/include/Yaw.h similarity index 100% rename from j2735codec/core/202409/include/Yaw.h rename to j2735codec/core/j2735_202409/include/Yaw.h diff --git a/j2735codec/core/202409/include/YawDetected.h b/j2735codec/core/j2735_202409/include/YawDetected.h similarity index 100% rename from j2735codec/core/202409/include/YawDetected.h rename to j2735codec/core/j2735_202409/include/YawDetected.h diff --git a/j2735codec/core/202409/include/YawRate.h b/j2735codec/core/j2735_202409/include/YawRate.h similarity index 100% rename from j2735codec/core/202409/include/YawRate.h rename to j2735codec/core/j2735_202409/include/YawRate.h diff --git a/j2735codec/core/202409/include/YawRateConfidence.h b/j2735codec/core/j2735_202409/include/YawRateConfidence.h similarity index 100% rename from j2735codec/core/202409/include/YawRateConfidence.h rename to j2735codec/core/j2735_202409/include/YawRateConfidence.h diff --git a/j2735codec/core/202409/include/Year.h b/j2735codec/core/j2735_202409/include/Year.h similarity index 100% rename from j2735codec/core/202409/include/Year.h rename to j2735codec/core/j2735_202409/include/Year.h diff --git a/j2735codec/core/202409/include/ZoneLength.h b/j2735codec/core/j2735_202409/include/ZoneLength.h similarity index 100% rename from j2735codec/core/202409/include/ZoneLength.h rename to j2735codec/core/j2735_202409/include/ZoneLength.h diff --git a/j2735codec/core/202409/include/Zoom.h b/j2735codec/core/j2735_202409/include/Zoom.h similarity index 100% rename from j2735codec/core/202409/include/Zoom.h rename to j2735codec/core/j2735_202409/include/Zoom.h diff --git a/j2735codec/core/202409/include/aper_decoder.h b/j2735codec/core/j2735_202409/include/aper_decoder.h similarity index 100% rename from j2735codec/core/202409/include/aper_decoder.h rename to j2735codec/core/j2735_202409/include/aper_decoder.h diff --git a/j2735codec/core/202409/include/aper_encoder.h b/j2735codec/core/j2735_202409/include/aper_encoder.h similarity index 100% rename from j2735codec/core/202409/include/aper_encoder.h rename to j2735codec/core/j2735_202409/include/aper_encoder.h diff --git a/j2735codec/core/202409/include/aper_opentype.h b/j2735codec/core/j2735_202409/include/aper_opentype.h similarity index 100% rename from j2735codec/core/202409/include/aper_opentype.h rename to j2735codec/core/j2735_202409/include/aper_opentype.h diff --git a/j2735codec/core/202409/include/aper_support.h b/j2735codec/core/j2735_202409/include/aper_support.h similarity index 100% rename from j2735codec/core/202409/include/aper_support.h rename to j2735codec/core/j2735_202409/include/aper_support.h diff --git a/j2735codec/core/202409/include/asn_SEQUENCE_OF.h b/j2735codec/core/j2735_202409/include/asn_SEQUENCE_OF.h similarity index 100% rename from j2735codec/core/202409/include/asn_SEQUENCE_OF.h rename to j2735codec/core/j2735_202409/include/asn_SEQUENCE_OF.h diff --git a/j2735codec/core/202409/include/asn_SET_OF.h b/j2735codec/core/j2735_202409/include/asn_SET_OF.h similarity index 100% rename from j2735codec/core/202409/include/asn_SET_OF.h rename to j2735codec/core/j2735_202409/include/asn_SET_OF.h diff --git a/j2735codec/core/202409/include/asn_application.h b/j2735codec/core/j2735_202409/include/asn_application.h similarity index 100% rename from j2735codec/core/202409/include/asn_application.h rename to j2735codec/core/j2735_202409/include/asn_application.h diff --git a/j2735codec/core/202409/include/asn_bit_data.h b/j2735codec/core/j2735_202409/include/asn_bit_data.h similarity index 100% rename from j2735codec/core/202409/include/asn_bit_data.h rename to j2735codec/core/j2735_202409/include/asn_bit_data.h diff --git a/j2735codec/core/202409/include/asn_codecs.h b/j2735codec/core/j2735_202409/include/asn_codecs.h similarity index 100% rename from j2735codec/core/202409/include/asn_codecs.h rename to j2735codec/core/j2735_202409/include/asn_codecs.h diff --git a/j2735codec/core/202409/include/asn_codecs_prim.h b/j2735codec/core/j2735_202409/include/asn_codecs_prim.h similarity index 100% rename from j2735codec/core/202409/include/asn_codecs_prim.h rename to j2735codec/core/j2735_202409/include/asn_codecs_prim.h diff --git a/j2735codec/core/202409/include/asn_config.h b/j2735codec/core/j2735_202409/include/asn_config.h similarity index 100% rename from j2735codec/core/202409/include/asn_config.h rename to j2735codec/core/j2735_202409/include/asn_config.h diff --git a/j2735codec/core/202409/include/asn_constant.h b/j2735codec/core/j2735_202409/include/asn_constant.h similarity index 100% rename from j2735codec/core/202409/include/asn_constant.h rename to j2735codec/core/j2735_202409/include/asn_constant.h diff --git a/j2735codec/core/202409/include/asn_internal.h b/j2735codec/core/j2735_202409/include/asn_internal.h similarity index 100% rename from j2735codec/core/202409/include/asn_internal.h rename to j2735codec/core/j2735_202409/include/asn_internal.h diff --git a/j2735codec/core/202409/include/asn_ioc.h b/j2735codec/core/j2735_202409/include/asn_ioc.h similarity index 100% rename from j2735codec/core/202409/include/asn_ioc.h rename to j2735codec/core/j2735_202409/include/asn_ioc.h diff --git a/j2735codec/core/202409/include/asn_random_fill.h b/j2735codec/core/j2735_202409/include/asn_random_fill.h similarity index 100% rename from j2735codec/core/202409/include/asn_random_fill.h rename to j2735codec/core/j2735_202409/include/asn_random_fill.h diff --git a/j2735codec/core/202409/include/asn_system.h b/j2735codec/core/j2735_202409/include/asn_system.h similarity index 100% rename from j2735codec/core/202409/include/asn_system.h rename to j2735codec/core/j2735_202409/include/asn_system.h diff --git a/j2735codec/core/202409/include/ber_decoder.h b/j2735codec/core/j2735_202409/include/ber_decoder.h similarity index 100% rename from j2735codec/core/202409/include/ber_decoder.h rename to j2735codec/core/j2735_202409/include/ber_decoder.h diff --git a/j2735codec/core/202409/include/ber_tlv_length.h b/j2735codec/core/j2735_202409/include/ber_tlv_length.h similarity index 100% rename from j2735codec/core/202409/include/ber_tlv_length.h rename to j2735codec/core/j2735_202409/include/ber_tlv_length.h diff --git a/j2735codec/core/202409/include/ber_tlv_tag.h b/j2735codec/core/j2735_202409/include/ber_tlv_tag.h similarity index 100% rename from j2735codec/core/202409/include/ber_tlv_tag.h rename to j2735codec/core/j2735_202409/include/ber_tlv_tag.h diff --git a/j2735codec/core/202409/include/constr_CHOICE.h b/j2735codec/core/j2735_202409/include/constr_CHOICE.h similarity index 100% rename from j2735codec/core/202409/include/constr_CHOICE.h rename to j2735codec/core/j2735_202409/include/constr_CHOICE.h diff --git a/j2735codec/core/202409/include/constr_SEQUENCE.h b/j2735codec/core/j2735_202409/include/constr_SEQUENCE.h similarity index 100% rename from j2735codec/core/202409/include/constr_SEQUENCE.h rename to j2735codec/core/j2735_202409/include/constr_SEQUENCE.h diff --git a/j2735codec/core/202409/include/constr_SEQUENCE_OF.h b/j2735codec/core/j2735_202409/include/constr_SEQUENCE_OF.h similarity index 100% rename from j2735codec/core/202409/include/constr_SEQUENCE_OF.h rename to j2735codec/core/j2735_202409/include/constr_SEQUENCE_OF.h diff --git a/j2735codec/core/202409/include/constr_SET_OF.h b/j2735codec/core/j2735_202409/include/constr_SET_OF.h similarity index 100% rename from j2735codec/core/202409/include/constr_SET_OF.h rename to j2735codec/core/j2735_202409/include/constr_SET_OF.h diff --git a/j2735codec/core/202409/include/constr_TYPE.h b/j2735codec/core/j2735_202409/include/constr_TYPE.h similarity index 100% rename from j2735codec/core/202409/include/constr_TYPE.h rename to j2735codec/core/j2735_202409/include/constr_TYPE.h diff --git a/j2735codec/core/202409/include/constraints.h b/j2735codec/core/j2735_202409/include/constraints.h similarity index 100% rename from j2735codec/core/202409/include/constraints.h rename to j2735codec/core/j2735_202409/include/constraints.h diff --git a/j2735codec/core/202409/include/der_encoder.h b/j2735codec/core/j2735_202409/include/der_encoder.h similarity index 100% rename from j2735codec/core/202409/include/der_encoder.h rename to j2735codec/core/j2735_202409/include/der_encoder.h diff --git a/j2735codec/core/202409/include/jer_decoder.h b/j2735codec/core/j2735_202409/include/jer_decoder.h similarity index 100% rename from j2735codec/core/202409/include/jer_decoder.h rename to j2735codec/core/j2735_202409/include/jer_decoder.h diff --git a/j2735codec/core/202409/include/jer_encoder.h b/j2735codec/core/j2735_202409/include/jer_encoder.h similarity index 100% rename from j2735codec/core/202409/include/jer_encoder.h rename to j2735codec/core/j2735_202409/include/jer_encoder.h diff --git a/j2735codec/core/202409/include/jer_support.h b/j2735codec/core/j2735_202409/include/jer_support.h similarity index 100% rename from j2735codec/core/202409/include/jer_support.h rename to j2735codec/core/j2735_202409/include/jer_support.h diff --git a/j2735codec/core/202409/include/oer_decoder.h b/j2735codec/core/j2735_202409/include/oer_decoder.h similarity index 100% rename from j2735codec/core/202409/include/oer_decoder.h rename to j2735codec/core/j2735_202409/include/oer_decoder.h diff --git a/j2735codec/core/202409/include/oer_encoder.h b/j2735codec/core/j2735_202409/include/oer_encoder.h similarity index 100% rename from j2735codec/core/202409/include/oer_encoder.h rename to j2735codec/core/j2735_202409/include/oer_encoder.h diff --git a/j2735codec/core/202409/include/oer_support.h b/j2735codec/core/j2735_202409/include/oer_support.h similarity index 100% rename from j2735codec/core/202409/include/oer_support.h rename to j2735codec/core/j2735_202409/include/oer_support.h diff --git a/j2735codec/core/202409/include/pdu_collection.h b/j2735codec/core/j2735_202409/include/pdu_collection.h similarity index 100% rename from j2735codec/core/202409/include/pdu_collection.h rename to j2735codec/core/j2735_202409/include/pdu_collection.h diff --git a/j2735codec/core/202409/include/per_decoder.h b/j2735codec/core/j2735_202409/include/per_decoder.h similarity index 100% rename from j2735codec/core/202409/include/per_decoder.h rename to j2735codec/core/j2735_202409/include/per_decoder.h diff --git a/j2735codec/core/202409/include/per_encoder.h b/j2735codec/core/j2735_202409/include/per_encoder.h similarity index 100% rename from j2735codec/core/202409/include/per_encoder.h rename to j2735codec/core/j2735_202409/include/per_encoder.h diff --git a/j2735codec/core/202409/include/per_opentype.h b/j2735codec/core/j2735_202409/include/per_opentype.h similarity index 100% rename from j2735codec/core/202409/include/per_opentype.h rename to j2735codec/core/j2735_202409/include/per_opentype.h diff --git a/j2735codec/core/202409/include/per_support.h b/j2735codec/core/j2735_202409/include/per_support.h similarity index 100% rename from j2735codec/core/202409/include/per_support.h rename to j2735codec/core/j2735_202409/include/per_support.h diff --git a/j2735codec/core/202409/include/uper_decoder.h b/j2735codec/core/j2735_202409/include/uper_decoder.h similarity index 100% rename from j2735codec/core/202409/include/uper_decoder.h rename to j2735codec/core/j2735_202409/include/uper_decoder.h diff --git a/j2735codec/core/202409/include/uper_encoder.h b/j2735codec/core/j2735_202409/include/uper_encoder.h similarity index 100% rename from j2735codec/core/202409/include/uper_encoder.h rename to j2735codec/core/j2735_202409/include/uper_encoder.h diff --git a/j2735codec/core/202409/include/uper_opentype.h b/j2735codec/core/j2735_202409/include/uper_opentype.h similarity index 100% rename from j2735codec/core/202409/include/uper_opentype.h rename to j2735codec/core/j2735_202409/include/uper_opentype.h diff --git a/j2735codec/core/202409/include/uper_support.h b/j2735codec/core/j2735_202409/include/uper_support.h similarity index 100% rename from j2735codec/core/202409/include/uper_support.h rename to j2735codec/core/j2735_202409/include/uper_support.h diff --git a/j2735codec/core/202409/include/xer_decoder.h b/j2735codec/core/j2735_202409/include/xer_decoder.h similarity index 100% rename from j2735codec/core/202409/include/xer_decoder.h rename to j2735codec/core/j2735_202409/include/xer_decoder.h diff --git a/j2735codec/core/202409/include/xer_encoder.h b/j2735codec/core/j2735_202409/include/xer_encoder.h similarity index 100% rename from j2735codec/core/202409/include/xer_encoder.h rename to j2735codec/core/j2735_202409/include/xer_encoder.h diff --git a/j2735codec/core/202409/include/xer_support.h b/j2735codec/core/j2735_202409/include/xer_support.h similarity index 100% rename from j2735codec/core/202409/include/xer_support.h rename to j2735codec/core/j2735_202409/include/xer_support.h diff --git a/j2735codec/core/202409/samples/jer/bsm.json b/j2735codec/core/j2735_202409/samples/jer/bsm.json similarity index 100% rename from j2735codec/core/202409/samples/jer/bsm.json rename to j2735codec/core/j2735_202409/samples/jer/bsm.json diff --git a/j2735codec/core/202409/samples/jer/eva.json b/j2735codec/core/j2735_202409/samples/jer/eva.json similarity index 100% rename from j2735codec/core/202409/samples/jer/eva.json rename to j2735codec/core/j2735_202409/samples/jer/eva.json diff --git a/j2735codec/core/202409/samples/jer/map.json b/j2735codec/core/j2735_202409/samples/jer/map.json similarity index 100% rename from j2735codec/core/202409/samples/jer/map.json rename to j2735codec/core/j2735_202409/samples/jer/map.json diff --git a/j2735codec/core/202409/samples/jer/psm.json b/j2735codec/core/j2735_202409/samples/jer/psm.json similarity index 100% rename from j2735codec/core/202409/samples/jer/psm.json rename to j2735codec/core/j2735_202409/samples/jer/psm.json diff --git a/j2735codec/core/202409/samples/jer/sdsm.json b/j2735codec/core/j2735_202409/samples/jer/sdsm.json similarity index 100% rename from j2735codec/core/202409/samples/jer/sdsm.json rename to j2735codec/core/j2735_202409/samples/jer/sdsm.json diff --git a/j2735codec/core/202409/samples/jer/spat.json b/j2735codec/core/j2735_202409/samples/jer/spat.json similarity index 100% rename from j2735codec/core/202409/samples/jer/spat.json rename to j2735codec/core/j2735_202409/samples/jer/spat.json diff --git a/j2735codec/core/202409/samples/jer/tim.json b/j2735codec/core/j2735_202409/samples/jer/tim.json similarity index 100% rename from j2735codec/core/202409/samples/jer/tim.json rename to j2735codec/core/j2735_202409/samples/jer/tim.json diff --git a/j2735codec/core/202409/src/ANY.c b/j2735codec/core/j2735_202409/src/ANY.c similarity index 100% rename from j2735codec/core/202409/src/ANY.c rename to j2735codec/core/j2735_202409/src/ANY.c diff --git a/j2735codec/core/202409/src/ANY_aper.c b/j2735codec/core/j2735_202409/src/ANY_aper.c similarity index 100% rename from j2735codec/core/202409/src/ANY_aper.c rename to j2735codec/core/j2735_202409/src/ANY_aper.c diff --git a/j2735codec/core/202409/src/ANY_ber.c b/j2735codec/core/j2735_202409/src/ANY_ber.c similarity index 100% rename from j2735codec/core/202409/src/ANY_ber.c rename to j2735codec/core/j2735_202409/src/ANY_ber.c diff --git a/j2735codec/core/202409/src/ANY_jer.c b/j2735codec/core/j2735_202409/src/ANY_jer.c similarity index 100% rename from j2735codec/core/202409/src/ANY_jer.c rename to j2735codec/core/j2735_202409/src/ANY_jer.c diff --git a/j2735codec/core/202409/src/ANY_uper.c b/j2735codec/core/j2735_202409/src/ANY_uper.c similarity index 100% rename from j2735codec/core/202409/src/ANY_uper.c rename to j2735codec/core/j2735_202409/src/ANY_uper.c diff --git a/j2735codec/core/202409/src/ANY_xer.c b/j2735codec/core/j2735_202409/src/ANY_xer.c similarity index 100% rename from j2735codec/core/202409/src/ANY_xer.c rename to j2735codec/core/j2735_202409/src/ANY_xer.c diff --git a/j2735codec/core/202409/src/AbsolutePosition2d.c b/j2735codec/core/j2735_202409/src/AbsolutePosition2d.c similarity index 100% rename from j2735codec/core/202409/src/AbsolutePosition2d.c rename to j2735codec/core/j2735_202409/src/AbsolutePosition2d.c diff --git a/j2735codec/core/202409/src/AbsolutePosition3d.c b/j2735codec/core/j2735_202409/src/AbsolutePosition3d.c similarity index 100% rename from j2735codec/core/202409/src/AbsolutePosition3d.c rename to j2735codec/core/j2735_202409/src/AbsolutePosition3d.c diff --git a/j2735codec/core/202409/src/AccelSteerYawRateConfidence.c b/j2735codec/core/j2735_202409/src/AccelSteerYawRateConfidence.c similarity index 100% rename from j2735codec/core/202409/src/AccelSteerYawRateConfidence.c rename to j2735codec/core/j2735_202409/src/AccelSteerYawRateConfidence.c diff --git a/j2735codec/core/202409/src/AccelTimeConstant.c b/j2735codec/core/j2735_202409/src/AccelTimeConstant.c similarity index 100% rename from j2735codec/core/202409/src/AccelTimeConstant.c rename to j2735codec/core/j2735_202409/src/AccelTimeConstant.c diff --git a/j2735codec/core/202409/src/Acceleration.c b/j2735codec/core/j2735_202409/src/Acceleration.c similarity index 100% rename from j2735codec/core/202409/src/Acceleration.c rename to j2735codec/core/j2735_202409/src/Acceleration.c diff --git a/j2735codec/core/202409/src/AccelerationConfidence.c b/j2735codec/core/j2735_202409/src/AccelerationConfidence.c similarity index 100% rename from j2735codec/core/202409/src/AccelerationConfidence.c rename to j2735codec/core/j2735_202409/src/AccelerationConfidence.c diff --git a/j2735codec/core/202409/src/AccelerationSet4Way.c b/j2735codec/core/j2735_202409/src/AccelerationSet4Way.c similarity index 100% rename from j2735codec/core/202409/src/AccelerationSet4Way.c rename to j2735codec/core/j2735_202409/src/AccelerationSet4Way.c diff --git a/j2735codec/core/202409/src/AcceleratorPedalPosition.c b/j2735codec/core/j2735_202409/src/AcceleratorPedalPosition.c similarity index 100% rename from j2735codec/core/202409/src/AcceleratorPedalPosition.c rename to j2735codec/core/j2735_202409/src/AcceleratorPedalPosition.c diff --git a/j2735codec/core/202409/src/AccidentsAndIncidents.c b/j2735codec/core/j2735_202409/src/AccidentsAndIncidents.c similarity index 100% rename from j2735codec/core/202409/src/AccidentsAndIncidents.c rename to j2735codec/core/j2735_202409/src/AccidentsAndIncidents.c diff --git a/j2735codec/core/202409/src/AccountStatus.c b/j2735codec/core/j2735_202409/src/AccountStatus.c similarity index 100% rename from j2735codec/core/202409/src/AccountStatus.c rename to j2735codec/core/j2735_202409/src/AccountStatus.c diff --git a/j2735codec/core/202409/src/AckPolicy.c b/j2735codec/core/j2735_202409/src/AckPolicy.c similarity index 100% rename from j2735codec/core/202409/src/AckPolicy.c rename to j2735codec/core/j2735_202409/src/AckPolicy.c diff --git a/j2735codec/core/202409/src/Activity.c b/j2735codec/core/j2735_202409/src/Activity.c similarity index 100% rename from j2735codec/core/202409/src/Activity.c rename to j2735codec/core/j2735_202409/src/Activity.c diff --git a/j2735codec/core/202409/src/ActualNumberOfPassengers.c b/j2735codec/core/j2735_202409/src/ActualNumberOfPassengers.c similarity index 100% rename from j2735codec/core/202409/src/ActualNumberOfPassengers.c rename to j2735codec/core/j2735_202409/src/ActualNumberOfPassengers.c diff --git a/j2735codec/core/202409/src/ActuatedInterval.c b/j2735codec/core/j2735_202409/src/ActuatedInterval.c similarity index 100% rename from j2735codec/core/202409/src/ActuatedInterval.c rename to j2735codec/core/j2735_202409/src/ActuatedInterval.c diff --git a/j2735codec/core/202409/src/AddGrpB_Angle.c b/j2735codec/core/j2735_202409/src/AddGrpB_Angle.c similarity index 100% rename from j2735codec/core/202409/src/AddGrpB_Angle.c rename to j2735codec/core/j2735_202409/src/AddGrpB_Angle.c diff --git a/j2735codec/core/202409/src/AddGrpB_Elevation.c b/j2735codec/core/j2735_202409/src/AddGrpB_Elevation.c similarity index 100% rename from j2735codec/core/202409/src/AddGrpB_Elevation.c rename to j2735codec/core/j2735_202409/src/AddGrpB_Elevation.c diff --git a/j2735codec/core/202409/src/AddGrpB_MsgCount.c b/j2735codec/core/j2735_202409/src/AddGrpB_MsgCount.c similarity index 100% rename from j2735codec/core/202409/src/AddGrpB_MsgCount.c rename to j2735codec/core/j2735_202409/src/AddGrpB_MsgCount.c diff --git a/j2735codec/core/202409/src/AddGrpB_TimeMark.c b/j2735codec/core/j2735_202409/src/AddGrpB_TimeMark.c similarity index 100% rename from j2735codec/core/202409/src/AddGrpB_TimeMark.c rename to j2735codec/core/j2735_202409/src/AddGrpB_TimeMark.c diff --git a/j2735codec/core/202409/src/AddGrpC_Altitude.c b/j2735codec/core/j2735_202409/src/AddGrpC_Altitude.c similarity index 100% rename from j2735codec/core/202409/src/AddGrpC_Altitude.c rename to j2735codec/core/j2735_202409/src/AddGrpC_Altitude.c diff --git a/j2735codec/core/202409/src/AdviceInstructionsMandatory.c b/j2735codec/core/j2735_202409/src/AdviceInstructionsMandatory.c similarity index 100% rename from j2735codec/core/202409/src/AdviceInstructionsMandatory.c rename to j2735codec/core/j2735_202409/src/AdviceInstructionsMandatory.c diff --git a/j2735codec/core/202409/src/AdviceInstructionsRecommendations.c b/j2735codec/core/j2735_202409/src/AdviceInstructionsRecommendations.c similarity index 100% rename from j2735codec/core/202409/src/AdviceInstructionsRecommendations.c rename to j2735codec/core/j2735_202409/src/AdviceInstructionsRecommendations.c diff --git a/j2735codec/core/202409/src/AdvisorySpeed.c b/j2735codec/core/j2735_202409/src/AdvisorySpeed.c similarity index 100% rename from j2735codec/core/202409/src/AdvisorySpeed.c rename to j2735codec/core/j2735_202409/src/AdvisorySpeed.c diff --git a/j2735codec/core/202409/src/AdvisorySpeedList.c b/j2735codec/core/j2735_202409/src/AdvisorySpeedList.c similarity index 100% rename from j2735codec/core/202409/src/AdvisorySpeedList.c rename to j2735codec/core/j2735_202409/src/AdvisorySpeedList.c diff --git a/j2735codec/core/202409/src/AdvisorySpeedType.c b/j2735codec/core/j2735_202409/src/AdvisorySpeedType.c similarity index 100% rename from j2735codec/core/202409/src/AdvisorySpeedType.c rename to j2735codec/core/j2735_202409/src/AdvisorySpeedType.c diff --git a/j2735codec/core/202409/src/AggregatedSingleTariffClassSession.c b/j2735codec/core/j2735_202409/src/AggregatedSingleTariffClassSession.c similarity index 100% rename from j2735codec/core/202409/src/AggregatedSingleTariffClassSession.c rename to j2735codec/core/j2735_202409/src/AggregatedSingleTariffClassSession.c diff --git a/j2735codec/core/202409/src/AllowedManeuvers.c b/j2735codec/core/j2735_202409/src/AllowedManeuvers.c similarity index 100% rename from j2735codec/core/202409/src/AllowedManeuvers.c rename to j2735codec/core/j2735_202409/src/AllowedManeuvers.c diff --git a/j2735codec/core/202409/src/AlternateRoute.c b/j2735codec/core/j2735_202409/src/AlternateRoute.c similarity index 100% rename from j2735codec/core/202409/src/AlternateRoute.c rename to j2735codec/core/j2735_202409/src/AlternateRoute.c diff --git a/j2735codec/core/202409/src/AltitudeConfidence.c b/j2735codec/core/j2735_202409/src/AltitudeConfidence.c similarity index 100% rename from j2735codec/core/202409/src/AltitudeConfidence.c rename to j2735codec/core/j2735_202409/src/AltitudeConfidence.c diff --git a/j2735codec/core/202409/src/AltitudeValue.c b/j2735codec/core/j2735_202409/src/AltitudeValue.c similarity index 100% rename from j2735codec/core/202409/src/AltitudeValue.c rename to j2735codec/core/j2735_202409/src/AltitudeValue.c diff --git a/j2735codec/core/202409/src/AmbientAirPressure.c b/j2735codec/core/j2735_202409/src/AmbientAirPressure.c similarity index 100% rename from j2735codec/core/202409/src/AmbientAirPressure.c rename to j2735codec/core/j2735_202409/src/AmbientAirPressure.c diff --git a/j2735codec/core/202409/src/AmbientAirTemperature.c b/j2735codec/core/j2735_202409/src/AmbientAirTemperature.c similarity index 100% rename from j2735codec/core/202409/src/AmbientAirTemperature.c rename to j2735codec/core/j2735_202409/src/AmbientAirTemperature.c diff --git a/j2735codec/core/202409/src/AngularVelocity.c b/j2735codec/core/j2735_202409/src/AngularVelocity.c similarity index 100% rename from j2735codec/core/202409/src/AngularVelocity.c rename to j2735codec/core/j2735_202409/src/AngularVelocity.c diff --git a/j2735codec/core/202409/src/AngularVelocityConfidence.c b/j2735codec/core/j2735_202409/src/AngularVelocityConfidence.c similarity index 100% rename from j2735codec/core/202409/src/AngularVelocityConfidence.c rename to j2735codec/core/j2735_202409/src/AngularVelocityConfidence.c diff --git a/j2735codec/core/202409/src/AnimalPropelledType.c b/j2735codec/core/j2735_202409/src/AnimalPropelledType.c similarity index 100% rename from j2735codec/core/202409/src/AnimalPropelledType.c rename to j2735codec/core/j2735_202409/src/AnimalPropelledType.c diff --git a/j2735codec/core/202409/src/AnimalType.c b/j2735codec/core/j2735_202409/src/AnimalType.c similarity index 100% rename from j2735codec/core/202409/src/AnimalType.c rename to j2735codec/core/j2735_202409/src/AnimalType.c diff --git a/j2735codec/core/202409/src/AntennaOffsetSet.c b/j2735codec/core/j2735_202409/src/AntennaOffsetSet.c similarity index 100% rename from j2735codec/core/202409/src/AntennaOffsetSet.c rename to j2735codec/core/j2735_202409/src/AntennaOffsetSet.c diff --git a/j2735codec/core/202409/src/AntiLockBrakeStatus.c b/j2735codec/core/j2735_202409/src/AntiLockBrakeStatus.c similarity index 100% rename from j2735codec/core/202409/src/AntiLockBrakeStatus.c rename to j2735codec/core/j2735_202409/src/AntiLockBrakeStatus.c diff --git a/j2735codec/core/202409/src/ApplicableHeading.c b/j2735codec/core/j2735_202409/src/ApplicableHeading.c similarity index 100% rename from j2735codec/core/202409/src/ApplicableHeading.c rename to j2735codec/core/j2735_202409/src/ApplicableHeading.c diff --git a/j2735codec/core/202409/src/ApproachID.c b/j2735codec/core/j2735_202409/src/ApproachID.c similarity index 100% rename from j2735codec/core/202409/src/ApproachID.c rename to j2735codec/core/j2735_202409/src/ApproachID.c diff --git a/j2735codec/core/202409/src/ApproachOrLane.c b/j2735codec/core/j2735_202409/src/ApproachOrLane.c similarity index 100% rename from j2735codec/core/202409/src/ApproachOrLane.c rename to j2735codec/core/j2735_202409/src/ApproachOrLane.c diff --git a/j2735codec/core/202409/src/Area.c b/j2735codec/core/j2735_202409/src/Area.c similarity index 100% rename from j2735codec/core/202409/src/Area.c rename to j2735codec/core/j2735_202409/src/Area.c diff --git a/j2735codec/core/202409/src/AreaOrSegmentChargingInfo.c b/j2735codec/core/j2735_202409/src/AreaOrSegmentChargingInfo.c similarity index 100% rename from j2735codec/core/202409/src/AreaOrSegmentChargingInfo.c rename to j2735codec/core/j2735_202409/src/AreaOrSegmentChargingInfo.c diff --git a/j2735codec/core/202409/src/AreaType.c b/j2735codec/core/j2735_202409/src/AreaType.c similarity index 100% rename from j2735codec/core/202409/src/AreaType.c rename to j2735codec/core/j2735_202409/src/AreaType.c diff --git a/j2735codec/core/202409/src/AsphaltOrTar.c b/j2735codec/core/j2735_202409/src/AsphaltOrTar.c similarity index 100% rename from j2735codec/core/202409/src/AsphaltOrTar.c rename to j2735codec/core/j2735_202409/src/AsphaltOrTar.c diff --git a/j2735codec/core/202409/src/AsphaltOrTarType.c b/j2735codec/core/j2735_202409/src/AsphaltOrTarType.c similarity index 100% rename from j2735codec/core/202409/src/AsphaltOrTarType.c rename to j2735codec/core/j2735_202409/src/AsphaltOrTarType.c diff --git a/j2735codec/core/202409/src/AssetStatus.c b/j2735codec/core/j2735_202409/src/AssetStatus.c similarity index 100% rename from j2735codec/core/202409/src/AssetStatus.c rename to j2735codec/core/j2735_202409/src/AssetStatus.c diff --git a/j2735codec/core/202409/src/AtmosPressureMeasurementStdDev.c b/j2735codec/core/j2735_202409/src/AtmosPressureMeasurementStdDev.c similarity index 100% rename from j2735codec/core/202409/src/AtmosPressureMeasurementStdDev.c rename to j2735codec/core/j2735_202409/src/AtmosPressureMeasurementStdDev.c diff --git a/j2735codec/core/202409/src/Attachment.c b/j2735codec/core/j2735_202409/src/Attachment.c similarity index 100% rename from j2735codec/core/202409/src/Attachment.c rename to j2735codec/core/j2735_202409/src/Attachment.c diff --git a/j2735codec/core/202409/src/AttachmentRadius.c b/j2735codec/core/j2735_202409/src/AttachmentRadius.c similarity index 100% rename from j2735codec/core/202409/src/AttachmentRadius.c rename to j2735codec/core/j2735_202409/src/AttachmentRadius.c diff --git a/j2735codec/core/202409/src/Attitude.c b/j2735codec/core/j2735_202409/src/Attitude.c similarity index 100% rename from j2735codec/core/202409/src/Attitude.c rename to j2735codec/core/j2735_202409/src/Attitude.c diff --git a/j2735codec/core/202409/src/AttitudeConfidence.c b/j2735codec/core/j2735_202409/src/AttitudeConfidence.c similarity index 100% rename from j2735codec/core/202409/src/AttitudeConfidence.c rename to j2735codec/core/j2735_202409/src/AttitudeConfidence.c diff --git a/j2735codec/core/202409/src/AudioLink.c b/j2735codec/core/j2735_202409/src/AudioLink.c similarity index 100% rename from j2735codec/core/202409/src/AudioLink.c rename to j2735codec/core/j2735_202409/src/AudioLink.c diff --git a/j2735codec/core/202409/src/AuxiliaryBrakeStatus.c b/j2735codec/core/j2735_202409/src/AuxiliaryBrakeStatus.c similarity index 100% rename from j2735codec/core/202409/src/AuxiliaryBrakeStatus.c rename to j2735codec/core/j2735_202409/src/AuxiliaryBrakeStatus.c diff --git a/j2735codec/core/202409/src/AxesMovement.c b/j2735codec/core/j2735_202409/src/AxesMovement.c similarity index 100% rename from j2735codec/core/202409/src/AxesMovement.c rename to j2735codec/core/j2735_202409/src/AxesMovement.c diff --git a/j2735codec/core/202409/src/AxleLocation.c b/j2735codec/core/j2735_202409/src/AxleLocation.c similarity index 100% rename from j2735codec/core/202409/src/AxleLocation.c rename to j2735codec/core/j2735_202409/src/AxleLocation.c diff --git a/j2735codec/core/202409/src/AxleWeight.c b/j2735codec/core/j2735_202409/src/AxleWeight.c similarity index 100% rename from j2735codec/core/202409/src/AxleWeight.c rename to j2735codec/core/j2735_202409/src/AxleWeight.c diff --git a/j2735codec/core/202409/src/AxleWeightLimit.c b/j2735codec/core/j2735_202409/src/AxleWeightLimit.c similarity index 100% rename from j2735codec/core/202409/src/AxleWeightLimit.c rename to j2735codec/core/j2735_202409/src/AxleWeightLimit.c diff --git a/j2735codec/core/202409/src/AxleWeightLimits.c b/j2735codec/core/j2735_202409/src/AxleWeightLimits.c similarity index 100% rename from j2735codec/core/202409/src/AxleWeightLimits.c rename to j2735codec/core/j2735_202409/src/AxleWeightLimits.c diff --git a/j2735codec/core/202409/src/AxleWeightList.c b/j2735codec/core/j2735_202409/src/AxleWeightList.c similarity index 100% rename from j2735codec/core/202409/src/AxleWeightList.c rename to j2735codec/core/j2735_202409/src/AxleWeightList.c diff --git a/j2735codec/core/202409/src/AxleWeightSet.c b/j2735codec/core/j2735_202409/src/AxleWeightSet.c similarity index 100% rename from j2735codec/core/202409/src/AxleWeightSet.c rename to j2735codec/core/j2735_202409/src/AxleWeightSet.c diff --git a/j2735codec/core/202409/src/Axles.c b/j2735codec/core/j2735_202409/src/Axles.c similarity index 100% rename from j2735codec/core/202409/src/Axles.c rename to j2735codec/core/j2735_202409/src/Axles.c diff --git a/j2735codec/core/202409/src/AxlesCharges.c b/j2735codec/core/j2735_202409/src/AxlesCharges.c similarity index 100% rename from j2735codec/core/202409/src/AxlesCharges.c rename to j2735codec/core/j2735_202409/src/AxlesCharges.c diff --git a/j2735codec/core/202409/src/AxlesChargesTable.c b/j2735codec/core/j2735_202409/src/AxlesChargesTable.c similarity index 100% rename from j2735codec/core/202409/src/AxlesChargesTable.c rename to j2735codec/core/j2735_202409/src/AxlesChargesTable.c diff --git a/j2735codec/core/202409/src/AxlesWeightLimits.c b/j2735codec/core/j2735_202409/src/AxlesWeightLimits.c similarity index 100% rename from j2735codec/core/202409/src/AxlesWeightLimits.c rename to j2735codec/core/j2735_202409/src/AxlesWeightLimits.c diff --git a/j2735codec/core/202409/src/BIT_STRING.c b/j2735codec/core/j2735_202409/src/BIT_STRING.c similarity index 100% rename from j2735codec/core/202409/src/BIT_STRING.c rename to j2735codec/core/j2735_202409/src/BIT_STRING.c diff --git a/j2735codec/core/202409/src/BIT_STRING_jer.c b/j2735codec/core/j2735_202409/src/BIT_STRING_jer.c similarity index 100% rename from j2735codec/core/202409/src/BIT_STRING_jer.c rename to j2735codec/core/j2735_202409/src/BIT_STRING_jer.c diff --git a/j2735codec/core/202409/src/BIT_STRING_oer.c b/j2735codec/core/j2735_202409/src/BIT_STRING_oer.c similarity index 100% rename from j2735codec/core/202409/src/BIT_STRING_oer.c rename to j2735codec/core/j2735_202409/src/BIT_STRING_oer.c diff --git a/j2735codec/core/202409/src/BIT_STRING_print.c b/j2735codec/core/j2735_202409/src/BIT_STRING_print.c similarity index 100% rename from j2735codec/core/202409/src/BIT_STRING_print.c rename to j2735codec/core/j2735_202409/src/BIT_STRING_print.c diff --git a/j2735codec/core/202409/src/BIT_STRING_rfill.c b/j2735codec/core/j2735_202409/src/BIT_STRING_rfill.c similarity index 100% rename from j2735codec/core/202409/src/BIT_STRING_rfill.c rename to j2735codec/core/j2735_202409/src/BIT_STRING_rfill.c diff --git a/j2735codec/core/202409/src/BIT_STRING_uper.c b/j2735codec/core/j2735_202409/src/BIT_STRING_uper.c similarity index 100% rename from j2735codec/core/202409/src/BIT_STRING_uper.c rename to j2735codec/core/j2735_202409/src/BIT_STRING_uper.c diff --git a/j2735codec/core/202409/src/BIT_STRING_xer.c b/j2735codec/core/j2735_202409/src/BIT_STRING_xer.c similarity index 100% rename from j2735codec/core/202409/src/BIT_STRING_xer.c rename to j2735codec/core/j2735_202409/src/BIT_STRING_xer.c diff --git a/j2735codec/core/202409/src/BOOLEAN.c b/j2735codec/core/j2735_202409/src/BOOLEAN.c similarity index 100% rename from j2735codec/core/202409/src/BOOLEAN.c rename to j2735codec/core/j2735_202409/src/BOOLEAN.c diff --git a/j2735codec/core/202409/src/BOOLEAN_aper.c b/j2735codec/core/j2735_202409/src/BOOLEAN_aper.c similarity index 100% rename from j2735codec/core/202409/src/BOOLEAN_aper.c rename to j2735codec/core/j2735_202409/src/BOOLEAN_aper.c diff --git a/j2735codec/core/202409/src/BOOLEAN_ber.c b/j2735codec/core/j2735_202409/src/BOOLEAN_ber.c similarity index 100% rename from j2735codec/core/202409/src/BOOLEAN_ber.c rename to j2735codec/core/j2735_202409/src/BOOLEAN_ber.c diff --git a/j2735codec/core/202409/src/BOOLEAN_jer.c b/j2735codec/core/j2735_202409/src/BOOLEAN_jer.c similarity index 100% rename from j2735codec/core/202409/src/BOOLEAN_jer.c rename to j2735codec/core/j2735_202409/src/BOOLEAN_jer.c diff --git a/j2735codec/core/202409/src/BOOLEAN_oer.c b/j2735codec/core/j2735_202409/src/BOOLEAN_oer.c similarity index 100% rename from j2735codec/core/202409/src/BOOLEAN_oer.c rename to j2735codec/core/j2735_202409/src/BOOLEAN_oer.c diff --git a/j2735codec/core/202409/src/BOOLEAN_print.c b/j2735codec/core/j2735_202409/src/BOOLEAN_print.c similarity index 100% rename from j2735codec/core/202409/src/BOOLEAN_print.c rename to j2735codec/core/j2735_202409/src/BOOLEAN_print.c diff --git a/j2735codec/core/202409/src/BOOLEAN_rfill.c b/j2735codec/core/j2735_202409/src/BOOLEAN_rfill.c similarity index 100% rename from j2735codec/core/202409/src/BOOLEAN_rfill.c rename to j2735codec/core/j2735_202409/src/BOOLEAN_rfill.c diff --git a/j2735codec/core/202409/src/BOOLEAN_uper.c b/j2735codec/core/j2735_202409/src/BOOLEAN_uper.c similarity index 100% rename from j2735codec/core/202409/src/BOOLEAN_uper.c rename to j2735codec/core/j2735_202409/src/BOOLEAN_uper.c diff --git a/j2735codec/core/202409/src/BOOLEAN_xer.c b/j2735codec/core/j2735_202409/src/BOOLEAN_xer.c similarity index 100% rename from j2735codec/core/202409/src/BOOLEAN_xer.c rename to j2735codec/core/j2735_202409/src/BOOLEAN_xer.c diff --git a/j2735codec/core/202409/src/BSMcoreData.c b/j2735codec/core/j2735_202409/src/BSMcoreData.c similarity index 100% rename from j2735codec/core/202409/src/BSMcoreData.c rename to j2735codec/core/j2735_202409/src/BSMcoreData.c diff --git a/j2735codec/core/202409/src/BankAngle.c b/j2735codec/core/j2735_202409/src/BankAngle.c similarity index 100% rename from j2735codec/core/202409/src/BankAngle.c rename to j2735codec/core/j2735_202409/src/BankAngle.c diff --git a/j2735codec/core/202409/src/BasicSafetyMessage.c b/j2735codec/core/j2735_202409/src/BasicSafetyMessage.c similarity index 100% rename from j2735codec/core/202409/src/BasicSafetyMessage.c rename to j2735codec/core/j2735_202409/src/BasicSafetyMessage.c diff --git a/j2735codec/core/202409/src/BasicSafetyMessage_PartII-Id.c b/j2735codec/core/j2735_202409/src/BasicSafetyMessage_PartII-Id.c similarity index 100% rename from j2735codec/core/202409/src/BasicSafetyMessage_PartII-Id.c rename to j2735codec/core/j2735_202409/src/BasicSafetyMessage_PartII-Id.c diff --git a/j2735codec/core/202409/src/BasicVehicleClass.c b/j2735codec/core/j2735_202409/src/BasicVehicleClass.c similarity index 100% rename from j2735codec/core/202409/src/BasicVehicleClass.c rename to j2735codec/core/j2735_202409/src/BasicVehicleClass.c diff --git a/j2735codec/core/202409/src/BasicVehicleRole.c b/j2735codec/core/j2735_202409/src/BasicVehicleRole.c similarity index 100% rename from j2735codec/core/202409/src/BasicVehicleRole.c rename to j2735codec/core/j2735_202409/src/BasicVehicleRole.c diff --git a/j2735codec/core/202409/src/BrakeAppliedPressure.c b/j2735codec/core/j2735_202409/src/BrakeAppliedPressure.c similarity index 100% rename from j2735codec/core/202409/src/BrakeAppliedPressure.c rename to j2735codec/core/j2735_202409/src/BrakeAppliedPressure.c diff --git a/j2735codec/core/202409/src/BrakeAppliedStatus.c b/j2735codec/core/j2735_202409/src/BrakeAppliedStatus.c similarity index 100% rename from j2735codec/core/202409/src/BrakeAppliedStatus.c rename to j2735codec/core/j2735_202409/src/BrakeAppliedStatus.c diff --git a/j2735codec/core/202409/src/BrakeBoostApplied.c b/j2735codec/core/j2735_202409/src/BrakeBoostApplied.c similarity index 100% rename from j2735codec/core/202409/src/BrakeBoostApplied.c rename to j2735codec/core/j2735_202409/src/BrakeBoostApplied.c diff --git a/j2735codec/core/202409/src/BrakePedalPosition.c b/j2735codec/core/j2735_202409/src/BrakePedalPosition.c similarity index 100% rename from j2735codec/core/202409/src/BrakePedalPosition.c rename to j2735codec/core/j2735_202409/src/BrakePedalPosition.c diff --git a/j2735codec/core/202409/src/BrakeSystemStatus.c b/j2735codec/core/j2735_202409/src/BrakeSystemStatus.c similarity index 100% rename from j2735codec/core/202409/src/BrakeSystemStatus.c rename to j2735codec/core/j2735_202409/src/BrakeSystemStatus.c diff --git a/j2735codec/core/202409/src/BroadRegion.c b/j2735codec/core/j2735_202409/src/BroadRegion.c similarity index 100% rename from j2735codec/core/202409/src/BroadRegion.c rename to j2735codec/core/j2735_202409/src/BroadRegion.c diff --git a/j2735codec/core/202409/src/BroadRegionArea.c b/j2735codec/core/j2735_202409/src/BroadRegionArea.c similarity index 100% rename from j2735codec/core/202409/src/BroadRegionArea.c rename to j2735codec/core/j2735_202409/src/BroadRegionArea.c diff --git a/j2735codec/core/202409/src/BumperHeight.c b/j2735codec/core/j2735_202409/src/BumperHeight.c similarity index 100% rename from j2735codec/core/202409/src/BumperHeight.c rename to j2735codec/core/j2735_202409/src/BumperHeight.c diff --git a/j2735codec/core/202409/src/BumperHeights.c b/j2735codec/core/j2735_202409/src/BumperHeights.c similarity index 100% rename from j2735codec/core/202409/src/BumperHeights.c rename to j2735codec/core/j2735_202409/src/BumperHeights.c diff --git a/j2735codec/core/202409/src/CCMFaultMode.c b/j2735codec/core/j2735_202409/src/CCMFaultMode.c similarity index 100% rename from j2735codec/core/202409/src/CCMFaultMode.c rename to j2735codec/core/j2735_202409/src/CCMFaultMode.c diff --git a/j2735codec/core/202409/src/CCMPartIIcontent.c b/j2735codec/core/j2735_202409/src/CCMPartIIcontent.c similarity index 100% rename from j2735codec/core/202409/src/CCMPartIIcontent.c rename to j2735codec/core/j2735_202409/src/CCMPartIIcontent.c diff --git a/j2735codec/core/202409/src/CO2EmissionValue.c b/j2735codec/core/j2735_202409/src/CO2EmissionValue.c similarity index 100% rename from j2735codec/core/202409/src/CO2EmissionValue.c rename to j2735codec/core/j2735_202409/src/CO2EmissionValue.c diff --git a/j2735codec/core/202409/src/CargoWeight.c b/j2735codec/core/j2735_202409/src/CargoWeight.c similarity index 100% rename from j2735codec/core/202409/src/CargoWeight.c rename to j2735codec/core/j2735_202409/src/CargoWeight.c diff --git a/j2735codec/core/202409/src/CfgAveragedAndSummaryTriggers.c b/j2735codec/core/j2735_202409/src/CfgAveragedAndSummaryTriggers.c similarity index 100% rename from j2735codec/core/202409/src/CfgAveragedAndSummaryTriggers.c rename to j2735codec/core/j2735_202409/src/CfgAveragedAndSummaryTriggers.c diff --git a/j2735codec/core/202409/src/CfgAveragedTriggers.c b/j2735codec/core/j2735_202409/src/CfgAveragedTriggers.c similarity index 100% rename from j2735codec/core/202409/src/CfgAveragedTriggers.c rename to j2735codec/core/j2735_202409/src/CfgAveragedTriggers.c diff --git a/j2735codec/core/202409/src/CfgCommSysPerfEvents.c b/j2735codec/core/j2735_202409/src/CfgCommSysPerfEvents.c similarity index 100% rename from j2735codec/core/202409/src/CfgCommSysPerfEvents.c rename to j2735codec/core/j2735_202409/src/CfgCommSysPerfEvents.c diff --git a/j2735codec/core/202409/src/CfgEmerAndTransitInfo.c b/j2735codec/core/j2735_202409/src/CfgEmerAndTransitInfo.c similarity index 100% rename from j2735codec/core/202409/src/CfgEmerAndTransitInfo.c rename to j2735codec/core/j2735_202409/src/CfgEmerAndTransitInfo.c diff --git a/j2735codec/core/202409/src/CfgEventRecurrence.c b/j2735codec/core/j2735_202409/src/CfgEventRecurrence.c similarity index 100% rename from j2735codec/core/202409/src/CfgEventRecurrence.c rename to j2735codec/core/j2735_202409/src/CfgEventRecurrence.c diff --git a/j2735codec/core/202409/src/CfgEvents.c b/j2735codec/core/j2735_202409/src/CfgEvents.c similarity index 100% rename from j2735codec/core/202409/src/CfgEvents.c rename to j2735codec/core/j2735_202409/src/CfgEvents.c diff --git a/j2735codec/core/202409/src/CfgHysteresis.c b/j2735codec/core/j2735_202409/src/CfgHysteresis.c similarity index 100% rename from j2735codec/core/202409/src/CfgHysteresis.c rename to j2735codec/core/j2735_202409/src/CfgHysteresis.c diff --git a/j2735codec/core/202409/src/CfgInstantaneousEventTriggers.c b/j2735codec/core/j2735_202409/src/CfgInstantaneousEventTriggers.c similarity index 100% rename from j2735codec/core/202409/src/CfgInstantaneousEventTriggers.c rename to j2735codec/core/j2735_202409/src/CfgInstantaneousEventTriggers.c diff --git a/j2735codec/core/202409/src/CfgInterval.c b/j2735codec/core/j2735_202409/src/CfgInterval.c similarity index 100% rename from j2735codec/core/202409/src/CfgInterval.c rename to j2735codec/core/j2735_202409/src/CfgInterval.c diff --git a/j2735codec/core/202409/src/CfgIntervalEvents.c b/j2735codec/core/j2735_202409/src/CfgIntervalEvents.c similarity index 100% rename from j2735codec/core/202409/src/CfgIntervalEvents.c rename to j2735codec/core/j2735_202409/src/CfgIntervalEvents.c diff --git a/j2735codec/core/202409/src/CfgKinematicEvents.c b/j2735codec/core/j2735_202409/src/CfgKinematicEvents.c similarity index 100% rename from j2735codec/core/202409/src/CfgKinematicEvents.c rename to j2735codec/core/j2735_202409/src/CfgKinematicEvents.c diff --git a/j2735codec/core/202409/src/CfgLowSpeedCriteria.c b/j2735codec/core/j2735_202409/src/CfgLowSpeedCriteria.c similarity index 100% rename from j2735codec/core/202409/src/CfgLowSpeedCriteria.c rename to j2735codec/core/j2735_202409/src/CfgLowSpeedCriteria.c diff --git a/j2735codec/core/202409/src/CfgMsgDictionary.c b/j2735codec/core/j2735_202409/src/CfgMsgDictionary.c similarity index 100% rename from j2735codec/core/202409/src/CfgMsgDictionary.c rename to j2735codec/core/j2735_202409/src/CfgMsgDictionary.c diff --git a/j2735codec/core/202409/src/CfgMsgRecepIndicators.c b/j2735codec/core/j2735_202409/src/CfgMsgRecepIndicators.c similarity index 100% rename from j2735codec/core/202409/src/CfgMsgRecepIndicators.c rename to j2735codec/core/j2735_202409/src/CfgMsgRecepIndicators.c diff --git a/j2735codec/core/202409/src/CfgRoadSignInfo.c b/j2735codec/core/j2735_202409/src/CfgRoadSignInfo.c similarity index 100% rename from j2735codec/core/202409/src/CfgRoadSignInfo.c rename to j2735codec/core/j2735_202409/src/CfgRoadSignInfo.c diff --git a/j2735codec/core/202409/src/CfgRoadSignTypes.c b/j2735codec/core/j2735_202409/src/CfgRoadSignTypes.c similarity index 100% rename from j2735codec/core/202409/src/CfgRoadSignTypes.c rename to j2735codec/core/j2735_202409/src/CfgRoadSignTypes.c diff --git a/j2735codec/core/202409/src/CfgRoadwayEvents.c b/j2735codec/core/j2735_202409/src/CfgRoadwayEvents.c similarity index 100% rename from j2735codec/core/202409/src/CfgRoadwayEvents.c rename to j2735codec/core/j2735_202409/src/CfgRoadwayEvents.c diff --git a/j2735codec/core/202409/src/CfgStoppedCriteria.c b/j2735codec/core/j2735_202409/src/CfgStoppedCriteria.c similarity index 100% rename from j2735codec/core/202409/src/CfgStoppedCriteria.c rename to j2735codec/core/j2735_202409/src/CfgStoppedCriteria.c diff --git a/j2735codec/core/202409/src/CfgSummaryTriggers.c b/j2735codec/core/j2735_202409/src/CfgSummaryTriggers.c similarity index 100% rename from j2735codec/core/202409/src/CfgSummaryTriggers.c rename to j2735codec/core/j2735_202409/src/CfgSummaryTriggers.c diff --git a/j2735codec/core/202409/src/CfgTrafficSigEncounters.c b/j2735codec/core/j2735_202409/src/CfgTrafficSigEncounters.c similarity index 100% rename from j2735codec/core/202409/src/CfgTrafficSigEncounters.c rename to j2735codec/core/j2735_202409/src/CfgTrafficSigEncounters.c diff --git a/j2735codec/core/202409/src/CfgTransitVehicleData.c b/j2735codec/core/j2735_202409/src/CfgTransitVehicleData.c similarity index 100% rename from j2735codec/core/202409/src/CfgTransitVehicleData.c rename to j2735codec/core/j2735_202409/src/CfgTransitVehicleData.c diff --git a/j2735codec/core/202409/src/CfgVehicleClass.c b/j2735codec/core/j2735_202409/src/CfgVehicleClass.c similarity index 100% rename from j2735codec/core/202409/src/CfgVehicleClass.c rename to j2735codec/core/j2735_202409/src/CfgVehicleClass.c diff --git a/j2735codec/core/202409/src/CfgVehicleEvents.c b/j2735codec/core/j2735_202409/src/CfgVehicleEvents.c similarity index 100% rename from j2735codec/core/202409/src/CfgVehicleEvents.c rename to j2735codec/core/j2735_202409/src/CfgVehicleEvents.c diff --git a/j2735codec/core/202409/src/ChargeObjectId.c b/j2735codec/core/j2735_202409/src/ChargeObjectId.c similarity index 100% rename from j2735codec/core/202409/src/ChargeObjectId.c rename to j2735codec/core/j2735_202409/src/ChargeObjectId.c diff --git a/j2735codec/core/202409/src/ChargerInfo.c b/j2735codec/core/j2735_202409/src/ChargerInfo.c similarity index 100% rename from j2735codec/core/202409/src/ChargerInfo.c rename to j2735codec/core/j2735_202409/src/ChargerInfo.c diff --git a/j2735codec/core/202409/src/ChargesTable.c b/j2735codec/core/j2735_202409/src/ChargesTable.c similarity index 100% rename from j2735codec/core/202409/src/ChargesTable.c rename to j2735codec/core/j2735_202409/src/ChargesTable.c diff --git a/j2735codec/core/202409/src/ChargingAreaOrSegment.c b/j2735codec/core/j2735_202409/src/ChargingAreaOrSegment.c similarity index 100% rename from j2735codec/core/202409/src/ChargingAreaOrSegment.c rename to j2735codec/core/j2735_202409/src/ChargingAreaOrSegment.c diff --git a/j2735codec/core/202409/src/ChargingConfig.c b/j2735codec/core/j2735_202409/src/ChargingConfig.c similarity index 100% rename from j2735codec/core/202409/src/ChargingConfig.c rename to j2735codec/core/j2735_202409/src/ChargingConfig.c diff --git a/j2735codec/core/202409/src/ChargingFees.c b/j2735codec/core/j2735_202409/src/ChargingFees.c similarity index 100% rename from j2735codec/core/202409/src/ChargingFees.c rename to j2735codec/core/j2735_202409/src/ChargingFees.c diff --git a/j2735codec/core/202409/src/ChargingUnits.c b/j2735codec/core/j2735_202409/src/ChargingUnits.c similarity index 100% rename from j2735codec/core/202409/src/ChargingUnits.c rename to j2735codec/core/j2735_202409/src/ChargingUnits.c diff --git a/j2735codec/core/202409/src/Cinders.c b/j2735codec/core/j2735_202409/src/Cinders.c similarity index 100% rename from j2735codec/core/202409/src/Cinders.c rename to j2735codec/core/j2735_202409/src/Cinders.c diff --git a/j2735codec/core/202409/src/CindersType.c b/j2735codec/core/j2735_202409/src/CindersType.c similarity index 100% rename from j2735codec/core/202409/src/CindersType.c rename to j2735codec/core/j2735_202409/src/CindersType.c diff --git a/j2735codec/core/202409/src/Circle.c b/j2735codec/core/j2735_202409/src/Circle.c similarity index 100% rename from j2735codec/core/202409/src/Circle.c rename to j2735codec/core/j2735_202409/src/Circle.c diff --git a/j2735codec/core/202409/src/ClassificationConfidence.c b/j2735codec/core/j2735_202409/src/ClassificationConfidence.c similarity index 100% rename from j2735codec/core/202409/src/ClassificationConfidence.c rename to j2735codec/core/j2735_202409/src/ClassificationConfidence.c diff --git a/j2735codec/core/202409/src/ClosedNetworkChargesTable.c b/j2735codec/core/j2735_202409/src/ClosedNetworkChargesTable.c similarity index 100% rename from j2735codec/core/202409/src/ClosedNetworkChargesTable.c rename to j2735codec/core/j2735_202409/src/ClosedNetworkChargesTable.c diff --git a/j2735codec/core/202409/src/Closures.c b/j2735codec/core/j2735_202409/src/Closures.c similarity index 100% rename from j2735codec/core/202409/src/Closures.c rename to j2735codec/core/j2735_202409/src/Closures.c diff --git a/j2735codec/core/202409/src/CoarseHeading.c b/j2735codec/core/j2735_202409/src/CoarseHeading.c similarity index 100% rename from j2735codec/core/202409/src/CoarseHeading.c rename to j2735codec/core/j2735_202409/src/CoarseHeading.c diff --git a/j2735codec/core/202409/src/CodeWord.c b/j2735codec/core/j2735_202409/src/CodeWord.c similarity index 100% rename from j2735codec/core/202409/src/CodeWord.c rename to j2735codec/core/j2735_202409/src/CodeWord.c diff --git a/j2735codec/core/202409/src/CoefficientOfFriction.c b/j2735codec/core/j2735_202409/src/CoefficientOfFriction.c similarity index 100% rename from j2735codec/core/202409/src/CoefficientOfFriction.c rename to j2735codec/core/j2735_202409/src/CoefficientOfFriction.c diff --git a/j2735codec/core/202409/src/CommonContainer.c b/j2735codec/core/j2735_202409/src/CommonContainer.c similarity index 100% rename from j2735codec/core/202409/src/CommonContainer.c rename to j2735codec/core/j2735_202409/src/CommonContainer.c diff --git a/j2735codec/core/202409/src/CommonSafetyRequest.c b/j2735codec/core/j2735_202409/src/CommonSafetyRequest.c similarity index 100% rename from j2735codec/core/202409/src/CommonSafetyRequest.c rename to j2735codec/core/j2735_202409/src/CommonSafetyRequest.c diff --git a/j2735codec/core/202409/src/Common_Angle.c b/j2735codec/core/j2735_202409/src/Common_Angle.c similarity index 100% rename from j2735codec/core/202409/src/Common_Angle.c rename to j2735codec/core/j2735_202409/src/Common_Angle.c diff --git a/j2735codec/core/202409/src/Common_Duration.c b/j2735codec/core/j2735_202409/src/Common_Duration.c similarity index 100% rename from j2735codec/core/202409/src/Common_Duration.c rename to j2735codec/core/j2735_202409/src/Common_Duration.c diff --git a/j2735codec/core/202409/src/Common_Elevation.c b/j2735codec/core/j2735_202409/src/Common_Elevation.c similarity index 100% rename from j2735codec/core/202409/src/Common_Elevation.c rename to j2735codec/core/j2735_202409/src/Common_Elevation.c diff --git a/j2735codec/core/202409/src/Common_Latitude.c b/j2735codec/core/j2735_202409/src/Common_Latitude.c similarity index 100% rename from j2735codec/core/202409/src/Common_Latitude.c rename to j2735codec/core/j2735_202409/src/Common_Latitude.c diff --git a/j2735codec/core/202409/src/Common_Longitude.c b/j2735codec/core/j2735_202409/src/Common_Longitude.c similarity index 100% rename from j2735codec/core/202409/src/Common_Longitude.c rename to j2735codec/core/j2735_202409/src/Common_Longitude.c diff --git a/j2735codec/core/202409/src/Common_MeanVariation.c b/j2735codec/core/j2735_202409/src/Common_MeanVariation.c similarity index 100% rename from j2735codec/core/202409/src/Common_MeanVariation.c rename to j2735codec/core/j2735_202409/src/Common_MeanVariation.c diff --git a/j2735codec/core/202409/src/Common_MsgCount.c b/j2735codec/core/j2735_202409/src/Common_MsgCount.c similarity index 100% rename from j2735codec/core/202409/src/Common_MsgCount.c rename to j2735codec/core/j2735_202409/src/Common_MsgCount.c diff --git a/j2735codec/core/202409/src/ComputedLane.c b/j2735codec/core/j2735_202409/src/ComputedLane.c similarity index 100% rename from j2735codec/core/202409/src/ComputedLane.c rename to j2735codec/core/j2735_202409/src/ComputedLane.c diff --git a/j2735codec/core/202409/src/Confidence.c b/j2735codec/core/j2735_202409/src/Confidence.c similarity index 100% rename from j2735codec/core/202409/src/Confidence.c rename to j2735codec/core/j2735_202409/src/Confidence.c diff --git a/j2735codec/core/202409/src/ConfidenceSet.c b/j2735codec/core/j2735_202409/src/ConfidenceSet.c similarity index 100% rename from j2735codec/core/202409/src/ConfidenceSet.c rename to j2735codec/core/j2735_202409/src/ConfidenceSet.c diff --git a/j2735codec/core/202409/src/ConfigBoundary.c b/j2735codec/core/j2735_202409/src/ConfigBoundary.c similarity index 100% rename from j2735codec/core/202409/src/ConfigBoundary.c rename to j2735codec/core/j2735_202409/src/ConfigBoundary.c diff --git a/j2735codec/core/202409/src/ConfigDescriptor.c b/j2735codec/core/j2735_202409/src/ConfigDescriptor.c similarity index 100% rename from j2735codec/core/202409/src/ConfigDescriptor.c rename to j2735codec/core/j2735_202409/src/ConfigDescriptor.c diff --git a/j2735codec/core/202409/src/ConfigId.c b/j2735codec/core/j2735_202409/src/ConfigId.c similarity index 100% rename from j2735codec/core/202409/src/ConfigId.c rename to j2735codec/core/j2735_202409/src/ConfigId.c diff --git a/j2735codec/core/202409/src/ConfigInfo.c b/j2735codec/core/j2735_202409/src/ConfigInfo.c similarity index 100% rename from j2735codec/core/202409/src/ConfigInfo.c rename to j2735codec/core/j2735_202409/src/ConfigInfo.c diff --git a/j2735codec/core/202409/src/ConfigTemporalBoundary.c b/j2735codec/core/j2735_202409/src/ConfigTemporalBoundary.c similarity index 100% rename from j2735codec/core/202409/src/ConfigTemporalBoundary.c rename to j2735codec/core/j2735_202409/src/ConfigTemporalBoundary.c diff --git a/j2735codec/core/202409/src/ConfigTriggers.c b/j2735codec/core/j2735_202409/src/ConfigTriggers.c similarity index 100% rename from j2735codec/core/202409/src/ConfigTriggers.c rename to j2735codec/core/j2735_202409/src/ConfigTriggers.c diff --git a/j2735codec/core/202409/src/ConnectingLane.c b/j2735codec/core/j2735_202409/src/ConnectingLane.c similarity index 100% rename from j2735codec/core/202409/src/ConnectingLane.c rename to j2735codec/core/j2735_202409/src/ConnectingLane.c diff --git a/j2735codec/core/202409/src/Connection.c b/j2735codec/core/j2735_202409/src/Connection.c similarity index 100% rename from j2735codec/core/202409/src/Connection.c rename to j2735codec/core/j2735_202409/src/Connection.c diff --git a/j2735codec/core/202409/src/ConnectionManeuverAssist-addGrpC.c b/j2735codec/core/j2735_202409/src/ConnectionManeuverAssist-addGrpC.c similarity index 100% rename from j2735codec/core/202409/src/ConnectionManeuverAssist-addGrpC.c rename to j2735codec/core/j2735_202409/src/ConnectionManeuverAssist-addGrpC.c diff --git a/j2735codec/core/202409/src/ConnectionManeuverAssist.c b/j2735codec/core/j2735_202409/src/ConnectionManeuverAssist.c similarity index 100% rename from j2735codec/core/202409/src/ConnectionManeuverAssist.c rename to j2735codec/core/j2735_202409/src/ConnectionManeuverAssist.c diff --git a/j2735codec/core/202409/src/ConnectsToList.c b/j2735codec/core/j2735_202409/src/ConnectsToList.c similarity index 100% rename from j2735codec/core/202409/src/ConnectsToList.c rename to j2735codec/core/j2735_202409/src/ConnectsToList.c diff --git a/j2735codec/core/202409/src/ConsecutiveTrafficLight.c b/j2735codec/core/j2735_202409/src/ConsecutiveTrafficLight.c similarity index 100% rename from j2735codec/core/202409/src/ConsecutiveTrafficLight.c rename to j2735codec/core/j2735_202409/src/ConsecutiveTrafficLight.c diff --git a/j2735codec/core/202409/src/ContentContainer.c b/j2735codec/core/j2735_202409/src/ContentContainer.c similarity index 100% rename from j2735codec/core/202409/src/ContentContainer.c rename to j2735codec/core/j2735_202409/src/ContentContainer.c diff --git a/j2735codec/core/202409/src/ContractAuthenticator.c b/j2735codec/core/j2735_202409/src/ContractAuthenticator.c similarity index 100% rename from j2735codec/core/202409/src/ContractAuthenticator.c rename to j2735codec/core/j2735_202409/src/ContractAuthenticator.c diff --git a/j2735codec/core/202409/src/ContractSerialNumber.c b/j2735codec/core/j2735_202409/src/ContractSerialNumber.c similarity index 100% rename from j2735codec/core/202409/src/ContractSerialNumber.c rename to j2735codec/core/j2735_202409/src/ContractSerialNumber.c diff --git a/j2735codec/core/202409/src/ContractValidity.c b/j2735codec/core/j2735_202409/src/ContractValidity.c similarity index 100% rename from j2735codec/core/202409/src/ContractValidity.c rename to j2735codec/core/j2735_202409/src/ContractValidity.c diff --git a/j2735codec/core/202409/src/CooperativeControlMessage.c b/j2735codec/core/j2735_202409/src/CooperativeControlMessage.c similarity index 100% rename from j2735codec/core/202409/src/CooperativeControlMessage.c rename to j2735codec/core/j2735_202409/src/CooperativeControlMessage.c diff --git a/j2735codec/core/202409/src/CooperativeControlMessage_ManeuverID.c b/j2735codec/core/j2735_202409/src/CooperativeControlMessage_ManeuverID.c similarity index 100% rename from j2735codec/core/202409/src/CooperativeControlMessage_ManeuverID.c rename to j2735codec/core/j2735_202409/src/CooperativeControlMessage_ManeuverID.c diff --git a/j2735codec/core/202409/src/CooperativeControlMessage_PartII-Id.c b/j2735codec/core/j2735_202409/src/CooperativeControlMessage_PartII-Id.c similarity index 100% rename from j2735codec/core/202409/src/CooperativeControlMessage_PartII-Id.c rename to j2735codec/core/j2735_202409/src/CooperativeControlMessage_PartII-Id.c diff --git a/j2735codec/core/202409/src/CooperativeControlMessage_PitchRate.c b/j2735codec/core/j2735_202409/src/CooperativeControlMessage_PitchRate.c similarity index 100% rename from j2735codec/core/202409/src/CooperativeControlMessage_PitchRate.c rename to j2735codec/core/j2735_202409/src/CooperativeControlMessage_PitchRate.c diff --git a/j2735codec/core/202409/src/CooperativeControlMessage_RollRate.c b/j2735codec/core/j2735_202409/src/CooperativeControlMessage_RollRate.c similarity index 100% rename from j2735codec/core/202409/src/CooperativeControlMessage_RollRate.c rename to j2735codec/core/j2735_202409/src/CooperativeControlMessage_RollRate.c diff --git a/j2735codec/core/202409/src/CopValue.c b/j2735codec/core/j2735_202409/src/CopValue.c similarity index 100% rename from j2735codec/core/202409/src/CopValue.c rename to j2735codec/core/j2735_202409/src/CopValue.c diff --git a/j2735codec/core/202409/src/Count.c b/j2735codec/core/j2735_202409/src/Count.c similarity index 100% rename from j2735codec/core/202409/src/Count.c rename to j2735codec/core/j2735_202409/src/Count.c diff --git a/j2735codec/core/202409/src/CountryCode.c b/j2735codec/core/j2735_202409/src/CountryCode.c similarity index 100% rename from j2735codec/core/202409/src/CountryCode.c rename to j2735codec/core/j2735_202409/src/CountryCode.c diff --git a/j2735codec/core/202409/src/CrossLinking.c b/j2735codec/core/j2735_202409/src/CrossLinking.c similarity index 100% rename from j2735codec/core/202409/src/CrossLinking.c rename to j2735codec/core/j2735_202409/src/CrossLinking.c diff --git a/j2735codec/core/202409/src/CurrentStateData.c b/j2735codec/core/j2735_202409/src/CurrentStateData.c similarity index 100% rename from j2735codec/core/202409/src/CurrentStateData.c rename to j2735codec/core/j2735_202409/src/CurrentStateData.c diff --git a/j2735codec/core/202409/src/CurveContainer.c b/j2735codec/core/j2735_202409/src/CurveContainer.c similarity index 100% rename from j2735codec/core/202409/src/CurveContainer.c rename to j2735codec/core/j2735_202409/src/CurveContainer.c diff --git a/j2735codec/core/202409/src/DDate.c b/j2735codec/core/j2735_202409/src/DDate.c similarity index 100% rename from j2735codec/core/202409/src/DDate.c rename to j2735codec/core/j2735_202409/src/DDate.c diff --git a/j2735codec/core/202409/src/DDateTime.c b/j2735codec/core/j2735_202409/src/DDateTime.c similarity index 100% rename from j2735codec/core/202409/src/DDateTime.c rename to j2735codec/core/j2735_202409/src/DDateTime.c diff --git a/j2735codec/core/202409/src/DDay.c b/j2735codec/core/j2735_202409/src/DDay.c similarity index 100% rename from j2735codec/core/202409/src/DDay.c rename to j2735codec/core/j2735_202409/src/DDay.c diff --git a/j2735codec/core/202409/src/DFullTime.c b/j2735codec/core/j2735_202409/src/DFullTime.c similarity index 100% rename from j2735codec/core/202409/src/DFullTime.c rename to j2735codec/core/j2735_202409/src/DFullTime.c diff --git a/j2735codec/core/202409/src/DHour.c b/j2735codec/core/j2735_202409/src/DHour.c similarity index 100% rename from j2735codec/core/202409/src/DHour.c rename to j2735codec/core/j2735_202409/src/DHour.c diff --git a/j2735codec/core/202409/src/DMinute.c b/j2735codec/core/j2735_202409/src/DMinute.c similarity index 100% rename from j2735codec/core/202409/src/DMinute.c rename to j2735codec/core/j2735_202409/src/DMinute.c diff --git a/j2735codec/core/202409/src/DMonth.c b/j2735codec/core/j2735_202409/src/DMonth.c similarity index 100% rename from j2735codec/core/202409/src/DMonth.c rename to j2735codec/core/j2735_202409/src/DMonth.c diff --git a/j2735codec/core/202409/src/DMonthDay.c b/j2735codec/core/j2735_202409/src/DMonthDay.c similarity index 100% rename from j2735codec/core/202409/src/DMonthDay.c rename to j2735codec/core/j2735_202409/src/DMonthDay.c diff --git a/j2735codec/core/202409/src/DOffset.c b/j2735codec/core/j2735_202409/src/DOffset.c similarity index 100% rename from j2735codec/core/202409/src/DOffset.c rename to j2735codec/core/j2735_202409/src/DOffset.c diff --git a/j2735codec/core/202409/src/DSRCmsgID.c b/j2735codec/core/j2735_202409/src/DSRCmsgID.c similarity index 100% rename from j2735codec/core/202409/src/DSRCmsgID.c rename to j2735codec/core/j2735_202409/src/DSRCmsgID.c diff --git a/j2735codec/core/202409/src/DSecond.c b/j2735codec/core/j2735_202409/src/DSecond.c similarity index 100% rename from j2735codec/core/202409/src/DSecond.c rename to j2735codec/core/j2735_202409/src/DSecond.c diff --git a/j2735codec/core/202409/src/DTime.c b/j2735codec/core/j2735_202409/src/DTime.c similarity index 100% rename from j2735codec/core/202409/src/DTime.c rename to j2735codec/core/j2735_202409/src/DTime.c diff --git a/j2735codec/core/202409/src/DYear.c b/j2735codec/core/j2735_202409/src/DYear.c similarity index 100% rename from j2735codec/core/202409/src/DYear.c rename to j2735codec/core/j2735_202409/src/DYear.c diff --git a/j2735codec/core/202409/src/DYearMonth.c b/j2735codec/core/j2735_202409/src/DYearMonth.c similarity index 100% rename from j2735codec/core/202409/src/DYearMonth.c rename to j2735codec/core/j2735_202409/src/DYearMonth.c diff --git a/j2735codec/core/202409/src/DataParameters.c b/j2735codec/core/j2735_202409/src/DataParameters.c similarity index 100% rename from j2735codec/core/202409/src/DataParameters.c rename to j2735codec/core/j2735_202409/src/DataParameters.c diff --git a/j2735codec/core/202409/src/DataSourceInfo.c b/j2735codec/core/j2735_202409/src/DataSourceInfo.c similarity index 100% rename from j2735codec/core/202409/src/DataSourceInfo.c rename to j2735codec/core/j2735_202409/src/DataSourceInfo.c diff --git a/j2735codec/core/202409/src/DateAndTime.c b/j2735codec/core/j2735_202409/src/DateAndTime.c similarity index 100% rename from j2735codec/core/202409/src/DateAndTime.c rename to j2735codec/core/j2735_202409/src/DateAndTime.c diff --git a/j2735codec/core/202409/src/DateCompact.c b/j2735codec/core/j2735_202409/src/DateCompact.c similarity index 100% rename from j2735codec/core/202409/src/DateCompact.c rename to j2735codec/core/j2735_202409/src/DateCompact.c diff --git a/j2735codec/core/202409/src/Day.c b/j2735codec/core/j2735_202409/src/Day.c similarity index 100% rename from j2735codec/core/202409/src/Day.c rename to j2735codec/core/j2735_202409/src/Day.c diff --git a/j2735codec/core/202409/src/DayOfWeek.c b/j2735codec/core/j2735_202409/src/DayOfWeek.c similarity index 100% rename from j2735codec/core/202409/src/DayOfWeek.c rename to j2735codec/core/j2735_202409/src/DayOfWeek.c diff --git a/j2735codec/core/202409/src/DegreesLat.c b/j2735codec/core/j2735_202409/src/DegreesLat.c similarity index 100% rename from j2735codec/core/202409/src/DegreesLat.c rename to j2735codec/core/j2735_202409/src/DegreesLat.c diff --git a/j2735codec/core/202409/src/DegreesLong.c b/j2735codec/core/j2735_202409/src/DegreesLong.c similarity index 100% rename from j2735codec/core/202409/src/DegreesLong.c rename to j2735codec/core/j2735_202409/src/DegreesLong.c diff --git a/j2735codec/core/202409/src/DelayStatusCancellation.c b/j2735codec/core/j2735_202409/src/DelayStatusCancellation.c similarity index 100% rename from j2735codec/core/202409/src/DelayStatusCancellation.c rename to j2735codec/core/j2735_202409/src/DelayStatusCancellation.c diff --git a/j2735codec/core/202409/src/DeltaAngle.c b/j2735codec/core/j2735_202409/src/DeltaAngle.c similarity index 100% rename from j2735codec/core/202409/src/DeltaAngle.c rename to j2735codec/core/j2735_202409/src/DeltaAngle.c diff --git a/j2735codec/core/202409/src/DeltaTime.c b/j2735codec/core/j2735_202409/src/DeltaTime.c similarity index 100% rename from j2735codec/core/202409/src/DeltaTime.c rename to j2735codec/core/j2735_202409/src/DeltaTime.c diff --git a/j2735codec/core/202409/src/DescriptionOfRoadSurface.c b/j2735codec/core/j2735_202409/src/DescriptionOfRoadSurface.c similarity index 100% rename from j2735codec/core/202409/src/DescriptionOfRoadSurface.c rename to j2735codec/core/j2735_202409/src/DescriptionOfRoadSurface.c diff --git a/j2735codec/core/202409/src/DescriptiveCharacteristics.c b/j2735codec/core/j2735_202409/src/DescriptiveCharacteristics.c similarity index 100% rename from j2735codec/core/202409/src/DescriptiveCharacteristics.c rename to j2735codec/core/j2735_202409/src/DescriptiveCharacteristics.c diff --git a/j2735codec/core/202409/src/DescriptiveName.c b/j2735codec/core/j2735_202409/src/DescriptiveName.c similarity index 100% rename from j2735codec/core/202409/src/DescriptiveName.c rename to j2735codec/core/j2735_202409/src/DescriptiveName.c diff --git a/j2735codec/core/202409/src/DetectedChargeObject.c b/j2735codec/core/j2735_202409/src/DetectedChargeObject.c similarity index 100% rename from j2735codec/core/202409/src/DetectedChargeObject.c rename to j2735codec/core/j2735_202409/src/DetectedChargeObject.c diff --git a/j2735codec/core/202409/src/DetectedObjectCommonData.c b/j2735codec/core/j2735_202409/src/DetectedObjectCommonData.c similarity index 100% rename from j2735codec/core/202409/src/DetectedObjectCommonData.c rename to j2735codec/core/j2735_202409/src/DetectedObjectCommonData.c diff --git a/j2735codec/core/202409/src/DetectedObjectData.c b/j2735codec/core/j2735_202409/src/DetectedObjectData.c similarity index 100% rename from j2735codec/core/202409/src/DetectedObjectData.c rename to j2735codec/core/j2735_202409/src/DetectedObjectData.c diff --git a/j2735codec/core/202409/src/DetectedObjectList.c b/j2735codec/core/j2735_202409/src/DetectedObjectList.c similarity index 100% rename from j2735codec/core/202409/src/DetectedObjectList.c rename to j2735codec/core/j2735_202409/src/DetectedObjectList.c diff --git a/j2735codec/core/202409/src/DetectedObjectOptionalData.c b/j2735codec/core/j2735_202409/src/DetectedObjectOptionalData.c similarity index 100% rename from j2735codec/core/202409/src/DetectedObjectOptionalData.c rename to j2735codec/core/j2735_202409/src/DetectedObjectOptionalData.c diff --git a/j2735codec/core/202409/src/DetectedObstacleData.c b/j2735codec/core/j2735_202409/src/DetectedObstacleData.c similarity index 100% rename from j2735codec/core/202409/src/DetectedObstacleData.c rename to j2735codec/core/j2735_202409/src/DetectedObstacleData.c diff --git a/j2735codec/core/202409/src/DetectedVRUData.c b/j2735codec/core/j2735_202409/src/DetectedVRUData.c similarity index 100% rename from j2735codec/core/202409/src/DetectedVRUData.c rename to j2735codec/core/j2735_202409/src/DetectedVRUData.c diff --git a/j2735codec/core/202409/src/DetectedVehicleData.c b/j2735codec/core/j2735_202409/src/DetectedVehicleData.c similarity index 100% rename from j2735codec/core/202409/src/DetectedVehicleData.c rename to j2735codec/core/j2735_202409/src/DetectedVehicleData.c diff --git a/j2735codec/core/202409/src/DetectionMode.c b/j2735codec/core/j2735_202409/src/DetectionMode.c similarity index 100% rename from j2735codec/core/202409/src/DetectionMode.c rename to j2735codec/core/j2735_202409/src/DetectionMode.c diff --git a/j2735codec/core/202409/src/DeviceStatus.c b/j2735codec/core/j2735_202409/src/DeviceStatus.c similarity index 100% rename from j2735codec/core/202409/src/DeviceStatus.c rename to j2735codec/core/j2735_202409/src/DeviceStatus.c diff --git a/j2735codec/core/202409/src/DewPointTempMeasurementStdDev.c b/j2735codec/core/j2735_202409/src/DewPointTempMeasurementStdDev.c similarity index 100% rename from j2735codec/core/202409/src/DewPointTempMeasurementStdDev.c rename to j2735codec/core/j2735_202409/src/DewPointTempMeasurementStdDev.c diff --git a/j2735codec/core/202409/src/DieselEmissionValues.c b/j2735codec/core/j2735_202409/src/DieselEmissionValues.c similarity index 100% rename from j2735codec/core/202409/src/DieselEmissionValues.c rename to j2735codec/core/j2735_202409/src/DieselEmissionValues.c diff --git a/j2735codec/core/202409/src/DirectionOfUse.c b/j2735codec/core/j2735_202409/src/DirectionOfUse.c similarity index 100% rename from j2735codec/core/202409/src/DirectionOfUse.c rename to j2735codec/core/j2735_202409/src/DirectionOfUse.c diff --git a/j2735codec/core/202409/src/DisabledVehicle.c b/j2735codec/core/j2735_202409/src/DisabledVehicle.c similarity index 100% rename from j2735codec/core/202409/src/DisabledVehicle.c rename to j2735codec/core/j2735_202409/src/DisabledVehicle.c diff --git a/j2735codec/core/202409/src/Disasters.c b/j2735codec/core/j2735_202409/src/Disasters.c similarity index 100% rename from j2735codec/core/202409/src/Disasters.c rename to j2735codec/core/j2735_202409/src/Disasters.c diff --git a/j2735codec/core/202409/src/Distance.c b/j2735codec/core/j2735_202409/src/Distance.c similarity index 100% rename from j2735codec/core/202409/src/Distance.c rename to j2735codec/core/j2735_202409/src/Distance.c diff --git a/j2735codec/core/202409/src/DistanceUnit.c b/j2735codec/core/j2735_202409/src/DistanceUnit.c similarity index 100% rename from j2735codec/core/202409/src/DistanceUnit.c rename to j2735codec/core/j2735_202409/src/DistanceUnit.c diff --git a/j2735codec/core/202409/src/DistanceUnits.c b/j2735codec/core/j2735_202409/src/DistanceUnits.c similarity index 100% rename from j2735codec/core/202409/src/DistanceUnits.c rename to j2735codec/core/j2735_202409/src/DistanceUnits.c diff --git a/j2735codec/core/202409/src/Disturbances.c b/j2735codec/core/j2735_202409/src/Disturbances.c similarity index 100% rename from j2735codec/core/202409/src/Disturbances.c rename to j2735codec/core/j2735_202409/src/Disturbances.c diff --git a/j2735codec/core/202409/src/DriveAxleLiftAirPressure.c b/j2735codec/core/j2735_202409/src/DriveAxleLiftAirPressure.c similarity index 100% rename from j2735codec/core/202409/src/DriveAxleLiftAirPressure.c rename to j2735codec/core/j2735_202409/src/DriveAxleLiftAirPressure.c diff --git a/j2735codec/core/202409/src/DriveAxleLocation.c b/j2735codec/core/j2735_202409/src/DriveAxleLocation.c similarity index 100% rename from j2735codec/core/202409/src/DriveAxleLocation.c rename to j2735codec/core/j2735_202409/src/DriveAxleLocation.c diff --git a/j2735codec/core/202409/src/DriveAxleLubePressure.c b/j2735codec/core/j2735_202409/src/DriveAxleLubePressure.c similarity index 100% rename from j2735codec/core/202409/src/DriveAxleLubePressure.c rename to j2735codec/core/j2735_202409/src/DriveAxleLubePressure.c diff --git a/j2735codec/core/202409/src/DriveAxleTemperature.c b/j2735codec/core/j2735_202409/src/DriveAxleTemperature.c similarity index 100% rename from j2735codec/core/202409/src/DriveAxleTemperature.c rename to j2735codec/core/j2735_202409/src/DriveAxleTemperature.c diff --git a/j2735codec/core/202409/src/Driven.c b/j2735codec/core/j2735_202409/src/Driven.c similarity index 100% rename from j2735codec/core/202409/src/Driven.c rename to j2735codec/core/j2735_202409/src/Driven.c diff --git a/j2735codec/core/202409/src/DrivenLineOffsetLg.c b/j2735codec/core/j2735_202409/src/DrivenLineOffsetLg.c similarity index 100% rename from j2735codec/core/202409/src/DrivenLineOffsetLg.c rename to j2735codec/core/j2735_202409/src/DrivenLineOffsetLg.c diff --git a/j2735codec/core/202409/src/DrivenLineOffsetSm.c b/j2735codec/core/j2735_202409/src/DrivenLineOffsetSm.c similarity index 100% rename from j2735codec/core/202409/src/DrivenLineOffsetSm.c rename to j2735codec/core/j2735_202409/src/DrivenLineOffsetSm.c diff --git a/j2735codec/core/202409/src/DriverCharacteristics.c b/j2735codec/core/j2735_202409/src/DriverCharacteristics.c similarity index 100% rename from j2735codec/core/202409/src/DriverCharacteristics.c rename to j2735codec/core/j2735_202409/src/DriverCharacteristics.c diff --git a/j2735codec/core/202409/src/DrivingWheelAngle.c b/j2735codec/core/j2735_202409/src/DrivingWheelAngle.c similarity index 100% rename from j2735codec/core/202409/src/DrivingWheelAngle.c rename to j2735codec/core/j2735_202409/src/DrivingWheelAngle.c diff --git a/j2735codec/core/202409/src/DynamicInfoContainer.c b/j2735codec/core/j2735_202409/src/DynamicInfoContainer.c similarity index 100% rename from j2735codec/core/202409/src/DynamicInfoContainer.c rename to j2735codec/core/j2735_202409/src/DynamicInfoContainer.c diff --git a/j2735codec/core/202409/src/ENUMERATED.c b/j2735codec/core/j2735_202409/src/ENUMERATED.c similarity index 100% rename from j2735codec/core/202409/src/ENUMERATED.c rename to j2735codec/core/j2735_202409/src/ENUMERATED.c diff --git a/j2735codec/core/202409/src/ENUMERATED_aper.c b/j2735codec/core/j2735_202409/src/ENUMERATED_aper.c similarity index 100% rename from j2735codec/core/202409/src/ENUMERATED_aper.c rename to j2735codec/core/j2735_202409/src/ENUMERATED_aper.c diff --git a/j2735codec/core/202409/src/ENUMERATED_jer.c b/j2735codec/core/j2735_202409/src/ENUMERATED_jer.c similarity index 100% rename from j2735codec/core/202409/src/ENUMERATED_jer.c rename to j2735codec/core/j2735_202409/src/ENUMERATED_jer.c diff --git a/j2735codec/core/202409/src/ENUMERATED_oer.c b/j2735codec/core/j2735_202409/src/ENUMERATED_oer.c similarity index 100% rename from j2735codec/core/202409/src/ENUMERATED_oer.c rename to j2735codec/core/j2735_202409/src/ENUMERATED_oer.c diff --git a/j2735codec/core/202409/src/ENUMERATED_uper.c b/j2735codec/core/j2735_202409/src/ENUMERATED_uper.c similarity index 100% rename from j2735codec/core/202409/src/ENUMERATED_uper.c rename to j2735codec/core/j2735_202409/src/ENUMERATED_uper.c diff --git a/j2735codec/core/202409/src/EXTERNAL.c b/j2735codec/core/j2735_202409/src/EXTERNAL.c similarity index 100% rename from j2735codec/core/202409/src/EXTERNAL.c rename to j2735codec/core/j2735_202409/src/EXTERNAL.c diff --git a/j2735codec/core/202409/src/EfcContextMark.c b/j2735codec/core/j2735_202409/src/EfcContextMark.c similarity index 100% rename from j2735codec/core/202409/src/EfcContextMark.c rename to j2735codec/core/j2735_202409/src/EfcContextMark.c diff --git a/j2735codec/core/202409/src/EfcDataDictionary_Altitude.c b/j2735codec/core/j2735_202409/src/EfcDataDictionary_Altitude.c similarity index 100% rename from j2735codec/core/202409/src/EfcDataDictionary_Altitude.c rename to j2735codec/core/j2735_202409/src/EfcDataDictionary_Altitude.c diff --git a/j2735codec/core/202409/src/EfcDataDictionary_Duration.c b/j2735codec/core/j2735_202409/src/EfcDataDictionary_Duration.c similarity index 100% rename from j2735codec/core/202409/src/EfcDataDictionary_Duration.c rename to j2735codec/core/j2735_202409/src/EfcDataDictionary_Duration.c diff --git a/j2735codec/core/202409/src/EfcDataDictionary_Latitude.c b/j2735codec/core/j2735_202409/src/EfcDataDictionary_Latitude.c similarity index 100% rename from j2735codec/core/202409/src/EfcDataDictionary_Latitude.c rename to j2735codec/core/j2735_202409/src/EfcDataDictionary_Latitude.c diff --git a/j2735codec/core/202409/src/EfcDataDictionary_Longitude.c b/j2735codec/core/j2735_202409/src/EfcDataDictionary_Longitude.c similarity index 100% rename from j2735codec/core/202409/src/EfcDataDictionary_Longitude.c rename to j2735codec/core/j2735_202409/src/EfcDataDictionary_Longitude.c diff --git a/j2735codec/core/202409/src/EfcTime.c b/j2735codec/core/j2735_202409/src/EfcTime.c similarity index 100% rename from j2735codec/core/202409/src/EfcTime.c rename to j2735codec/core/j2735_202409/src/EfcTime.c diff --git a/j2735codec/core/202409/src/ElevOffset.c b/j2735codec/core/j2735_202409/src/ElevOffset.c similarity index 100% rename from j2735codec/core/202409/src/ElevOffset.c rename to j2735codec/core/j2735_202409/src/ElevOffset.c diff --git a/j2735codec/core/202409/src/ElevationConfidence.c b/j2735codec/core/j2735_202409/src/ElevationConfidence.c similarity index 100% rename from j2735codec/core/202409/src/ElevationConfidence.c rename to j2735codec/core/j2735_202409/src/ElevationConfidence.c diff --git a/j2735codec/core/202409/src/EmergencyDetails.c b/j2735codec/core/j2735_202409/src/EmergencyDetails.c similarity index 100% rename from j2735codec/core/202409/src/EmergencyDetails.c rename to j2735codec/core/j2735_202409/src/EmergencyDetails.c diff --git a/j2735codec/core/202409/src/EmergencyVehicleAlert.c b/j2735codec/core/j2735_202409/src/EmergencyVehicleAlert.c similarity index 100% rename from j2735codec/core/202409/src/EmergencyVehicleAlert.c rename to j2735codec/core/j2735_202409/src/EmergencyVehicleAlert.c diff --git a/j2735codec/core/202409/src/EmissionType.c b/j2735codec/core/j2735_202409/src/EmissionType.c similarity index 100% rename from j2735codec/core/202409/src/EmissionType.c rename to j2735codec/core/j2735_202409/src/EmissionType.c diff --git a/j2735codec/core/202409/src/EmissionUnit.c b/j2735codec/core/j2735_202409/src/EmissionUnit.c similarity index 100% rename from j2735codec/core/202409/src/EmissionUnit.c rename to j2735codec/core/j2735_202409/src/EmissionUnit.c diff --git a/j2735codec/core/202409/src/EnabledLaneList.c b/j2735codec/core/j2735_202409/src/EnabledLaneList.c similarity index 100% rename from j2735codec/core/202409/src/EnabledLaneList.c rename to j2735codec/core/j2735_202409/src/EnabledLaneList.c diff --git a/j2735codec/core/202409/src/EncryptedTumData.c b/j2735codec/core/j2735_202409/src/EncryptedTumData.c similarity index 100% rename from j2735codec/core/202409/src/EncryptedTumData.c rename to j2735codec/core/j2735_202409/src/EncryptedTumData.c diff --git a/j2735codec/core/202409/src/EngineCharacteristics.c b/j2735codec/core/j2735_202409/src/EngineCharacteristics.c similarity index 100% rename from j2735codec/core/202409/src/EngineCharacteristics.c rename to j2735codec/core/j2735_202409/src/EngineCharacteristics.c diff --git a/j2735codec/core/202409/src/EngineDetails.c b/j2735codec/core/j2735_202409/src/EngineDetails.c similarity index 100% rename from j2735codec/core/202409/src/EngineDetails.c rename to j2735codec/core/j2735_202409/src/EngineDetails.c diff --git a/j2735codec/core/202409/src/EntryChargesTable.c b/j2735codec/core/j2735_202409/src/EntryChargesTable.c similarity index 100% rename from j2735codec/core/202409/src/EntryChargesTable.c rename to j2735codec/core/j2735_202409/src/EntryChargesTable.c diff --git a/j2735codec/core/202409/src/EnvironmentalCharacteristics.c b/j2735codec/core/j2735_202409/src/EnvironmentalCharacteristics.c similarity index 100% rename from j2735codec/core/202409/src/EnvironmentalCharacteristics.c rename to j2735codec/core/j2735_202409/src/EnvironmentalCharacteristics.c diff --git a/j2735codec/core/202409/src/EquipmentIccId.c b/j2735codec/core/j2735_202409/src/EquipmentIccId.c similarity index 100% rename from j2735codec/core/202409/src/EquipmentIccId.c rename to j2735codec/core/j2735_202409/src/EquipmentIccId.c diff --git a/j2735codec/core/202409/src/EquipmentObuId.c b/j2735codec/core/j2735_202409/src/EquipmentObuId.c similarity index 100% rename from j2735codec/core/202409/src/EquipmentObuId.c rename to j2735codec/core/j2735_202409/src/EquipmentObuId.c diff --git a/j2735codec/core/202409/src/EquipmentStatus.c b/j2735codec/core/j2735_202409/src/EquipmentStatus.c similarity index 100% rename from j2735codec/core/202409/src/EquipmentStatus.c rename to j2735codec/core/j2735_202409/src/EquipmentStatus.c diff --git a/j2735codec/core/202409/src/EquipmentType.c b/j2735codec/core/j2735_202409/src/EquipmentType.c similarity index 100% rename from j2735codec/core/202409/src/EquipmentType.c rename to j2735codec/core/j2735_202409/src/EquipmentType.c diff --git a/j2735codec/core/202409/src/EssMobileFriction.c b/j2735codec/core/j2735_202409/src/EssMobileFriction.c similarity index 100% rename from j2735codec/core/202409/src/EssMobileFriction.c rename to j2735codec/core/j2735_202409/src/EssMobileFriction.c diff --git a/j2735codec/core/202409/src/EssPrecipRate.c b/j2735codec/core/j2735_202409/src/EssPrecipRate.c similarity index 100% rename from j2735codec/core/202409/src/EssPrecipRate.c rename to j2735codec/core/j2735_202409/src/EssPrecipRate.c diff --git a/j2735codec/core/202409/src/EssPrecipSituation.c b/j2735codec/core/j2735_202409/src/EssPrecipSituation.c similarity index 100% rename from j2735codec/core/202409/src/EssPrecipSituation.c rename to j2735codec/core/j2735_202409/src/EssPrecipSituation.c diff --git a/j2735codec/core/202409/src/EssPrecipYesNo.c b/j2735codec/core/j2735_202409/src/EssPrecipYesNo.c similarity index 100% rename from j2735codec/core/202409/src/EssPrecipYesNo.c rename to j2735codec/core/j2735_202409/src/EssPrecipYesNo.c diff --git a/j2735codec/core/202409/src/EssSolarRadiation.c b/j2735codec/core/j2735_202409/src/EssSolarRadiation.c similarity index 100% rename from j2735codec/core/202409/src/EssSolarRadiation.c rename to j2735codec/core/j2735_202409/src/EssSolarRadiation.c diff --git a/j2735codec/core/202409/src/EuroValue.c b/j2735codec/core/j2735_202409/src/EuroValue.c similarity index 100% rename from j2735codec/core/202409/src/EuroValue.c rename to j2735codec/core/j2735_202409/src/EuroValue.c diff --git a/j2735codec/core/202409/src/EventDescription.c b/j2735codec/core/j2735_202409/src/EventDescription.c similarity index 100% rename from j2735codec/core/202409/src/EventDescription.c rename to j2735codec/core/j2735_202409/src/EventDescription.c diff --git a/j2735codec/core/202409/src/EventIdentifier.c b/j2735codec/core/j2735_202409/src/EventIdentifier.c similarity index 100% rename from j2735codec/core/202409/src/EventIdentifier.c rename to j2735codec/core/j2735_202409/src/EventIdentifier.c diff --git a/j2735codec/core/202409/src/EventInfo.c b/j2735codec/core/j2735_202409/src/EventInfo.c similarity index 100% rename from j2735codec/core/202409/src/EventInfo.c rename to j2735codec/core/j2735_202409/src/EventInfo.c diff --git a/j2735codec/core/202409/src/EventRecurrence.c b/j2735codec/core/j2735_202409/src/EventRecurrence.c similarity index 100% rename from j2735codec/core/202409/src/EventRecurrence.c rename to j2735codec/core/j2735_202409/src/EventRecurrence.c diff --git a/j2735codec/core/202409/src/ExhaustEmissionValues.c b/j2735codec/core/j2735_202409/src/ExhaustEmissionValues.c similarity index 100% rename from j2735codec/core/202409/src/ExhaustEmissionValues.c rename to j2735codec/core/j2735_202409/src/ExhaustEmissionValues.c diff --git a/j2735codec/core/202409/src/ExitChargesTable.c b/j2735codec/core/j2735_202409/src/ExitChargesTable.c similarity index 100% rename from j2735codec/core/202409/src/ExitChargesTable.c rename to j2735codec/core/j2735_202409/src/ExitChargesTable.c diff --git a/j2735codec/core/202409/src/ExitInfo.c b/j2735codec/core/j2735_202409/src/ExitInfo.c similarity index 100% rename from j2735codec/core/202409/src/ExitInfo.c rename to j2735codec/core/j2735_202409/src/ExitInfo.c diff --git a/j2735codec/core/202409/src/ExitService.c b/j2735codec/core/j2735_202409/src/ExitService.c similarity index 100% rename from j2735codec/core/202409/src/ExitService.c rename to j2735codec/core/j2735_202409/src/ExitService.c diff --git a/j2735codec/core/202409/src/Extent.c b/j2735codec/core/j2735_202409/src/Extent.c similarity index 100% rename from j2735codec/core/202409/src/Extent.c rename to j2735codec/core/j2735_202409/src/Extent.c diff --git a/j2735codec/core/202409/src/ExteriorLights.c b/j2735codec/core/j2735_202409/src/ExteriorLights.c similarity index 100% rename from j2735codec/core/202409/src/ExteriorLights.c rename to j2735codec/core/j2735_202409/src/ExteriorLights.c diff --git a/j2735codec/core/202409/src/FeeReport.c b/j2735codec/core/j2735_202409/src/FeeReport.c similarity index 100% rename from j2735codec/core/202409/src/FeeReport.c rename to j2735codec/core/j2735_202409/src/FeeReport.c diff --git a/j2735codec/core/202409/src/FrictionInformation.c b/j2735codec/core/j2735_202409/src/FrictionInformation.c similarity index 100% rename from j2735codec/core/202409/src/FrictionInformation.c rename to j2735codec/core/j2735_202409/src/FrictionInformation.c diff --git a/j2735codec/core/202409/src/FrontCutIn.c b/j2735codec/core/j2735_202409/src/FrontCutIn.c similarity index 100% rename from j2735codec/core/202409/src/FrontCutIn.c rename to j2735codec/core/j2735_202409/src/FrontCutIn.c diff --git a/j2735codec/core/202409/src/FuelType.c b/j2735codec/core/j2735_202409/src/FuelType.c similarity index 100% rename from j2735codec/core/202409/src/FuelType.c rename to j2735codec/core/j2735_202409/src/FuelType.c diff --git a/j2735codec/core/202409/src/FullPositionVector.c b/j2735codec/core/j2735_202409/src/FullPositionVector.c similarity index 100% rename from j2735codec/core/202409/src/FullPositionVector.c rename to j2735codec/core/j2735_202409/src/FullPositionVector.c diff --git a/j2735codec/core/202409/src/FullRoadAuthorityID.c b/j2735codec/core/j2735_202409/src/FullRoadAuthorityID.c similarity index 100% rename from j2735codec/core/202409/src/FullRoadAuthorityID.c rename to j2735codec/core/j2735_202409/src/FullRoadAuthorityID.c diff --git a/j2735codec/core/202409/src/FurtherInfoID.c b/j2735codec/core/j2735_202409/src/FurtherInfoID.c similarity index 100% rename from j2735codec/core/202409/src/FurtherInfoID.c rename to j2735codec/core/j2735_202409/src/FurtherInfoID.c diff --git a/j2735codec/core/202409/src/FutureCharacteristics.c b/j2735codec/core/j2735_202409/src/FutureCharacteristics.c similarity index 100% rename from j2735codec/core/202409/src/FutureCharacteristics.c rename to j2735codec/core/j2735_202409/src/FutureCharacteristics.c diff --git a/j2735codec/core/202409/src/GNSSstatus.c b/j2735codec/core/j2735_202409/src/GNSSstatus.c similarity index 100% rename from j2735codec/core/202409/src/GNSSstatus.c rename to j2735codec/core/j2735_202409/src/GNSSstatus.c diff --git a/j2735codec/core/202409/src/GeneralizedTime.c b/j2735codec/core/j2735_202409/src/GeneralizedTime.c similarity index 100% rename from j2735codec/core/202409/src/GeneralizedTime.c rename to j2735codec/core/j2735_202409/src/GeneralizedTime.c diff --git a/j2735codec/core/202409/src/GeneralizedTime_ber.c b/j2735codec/core/j2735_202409/src/GeneralizedTime_ber.c similarity index 100% rename from j2735codec/core/202409/src/GeneralizedTime_ber.c rename to j2735codec/core/j2735_202409/src/GeneralizedTime_ber.c diff --git a/j2735codec/core/202409/src/GeneralizedTime_jer.c b/j2735codec/core/j2735_202409/src/GeneralizedTime_jer.c similarity index 100% rename from j2735codec/core/202409/src/GeneralizedTime_jer.c rename to j2735codec/core/j2735_202409/src/GeneralizedTime_jer.c diff --git a/j2735codec/core/202409/src/GeneralizedTime_print.c b/j2735codec/core/j2735_202409/src/GeneralizedTime_print.c similarity index 100% rename from j2735codec/core/202409/src/GeneralizedTime_print.c rename to j2735codec/core/j2735_202409/src/GeneralizedTime_print.c diff --git a/j2735codec/core/202409/src/GeneralizedTime_rfill.c b/j2735codec/core/j2735_202409/src/GeneralizedTime_rfill.c similarity index 100% rename from j2735codec/core/202409/src/GeneralizedTime_rfill.c rename to j2735codec/core/j2735_202409/src/GeneralizedTime_rfill.c diff --git a/j2735codec/core/202409/src/GeneralizedTime_xer.c b/j2735codec/core/j2735_202409/src/GeneralizedTime_xer.c similarity index 100% rename from j2735codec/core/202409/src/GeneralizedTime_xer.c rename to j2735codec/core/j2735_202409/src/GeneralizedTime_xer.c diff --git a/j2735codec/core/202409/src/GenericLane.c b/j2735codec/core/j2735_202409/src/GenericLane.c similarity index 100% rename from j2735codec/core/202409/src/GenericLane.c rename to j2735codec/core/j2735_202409/src/GenericLane.c diff --git a/j2735codec/core/202409/src/GenericSignage.c b/j2735codec/core/j2735_202409/src/GenericSignage.c similarity index 100% rename from j2735codec/core/202409/src/GenericSignage.c rename to j2735codec/core/j2735_202409/src/GenericSignage.c diff --git a/j2735codec/core/202409/src/GeographicalPath.c b/j2735codec/core/j2735_202409/src/GeographicalPath.c similarity index 100% rename from j2735codec/core/202409/src/GeographicalPath.c rename to j2735codec/core/j2735_202409/src/GeographicalPath.c diff --git a/j2735codec/core/202409/src/GeometricProjection.c b/j2735codec/core/j2735_202409/src/GeometricProjection.c similarity index 100% rename from j2735codec/core/202409/src/GeometricProjection.c rename to j2735codec/core/j2735_202409/src/GeometricProjection.c diff --git a/j2735codec/core/202409/src/GraphicString.c b/j2735codec/core/j2735_202409/src/GraphicString.c similarity index 100% rename from j2735codec/core/202409/src/GraphicString.c rename to j2735codec/core/j2735_202409/src/GraphicString.c diff --git a/j2735codec/core/202409/src/Grass.c b/j2735codec/core/j2735_202409/src/Grass.c similarity index 100% rename from j2735codec/core/202409/src/Grass.c rename to j2735codec/core/j2735_202409/src/Grass.c diff --git a/j2735codec/core/202409/src/GrassType.c b/j2735codec/core/j2735_202409/src/GrassType.c similarity index 100% rename from j2735codec/core/202409/src/GrassType.c rename to j2735codec/core/j2735_202409/src/GrassType.c diff --git a/j2735codec/core/202409/src/Gravel.c b/j2735codec/core/j2735_202409/src/Gravel.c similarity index 100% rename from j2735codec/core/202409/src/Gravel.c rename to j2735codec/core/j2735_202409/src/Gravel.c diff --git a/j2735codec/core/202409/src/GravelType.c b/j2735codec/core/j2735_202409/src/GravelType.c similarity index 100% rename from j2735codec/core/202409/src/GravelType.c rename to j2735codec/core/j2735_202409/src/GravelType.c diff --git a/j2735codec/core/202409/src/GrossDistance.c b/j2735codec/core/j2735_202409/src/GrossDistance.c similarity index 100% rename from j2735codec/core/202409/src/GrossDistance.c rename to j2735codec/core/j2735_202409/src/GrossDistance.c diff --git a/j2735codec/core/202409/src/GrossSpeed.c b/j2735codec/core/j2735_202409/src/GrossSpeed.c similarity index 100% rename from j2735codec/core/202409/src/GrossSpeed.c rename to j2735codec/core/j2735_202409/src/GrossSpeed.c diff --git a/j2735codec/core/202409/src/Header.c b/j2735codec/core/j2735_202409/src/Header.c similarity index 100% rename from j2735codec/core/202409/src/Header.c rename to j2735codec/core/j2735_202409/src/Header.c diff --git a/j2735codec/core/202409/src/Heading.c b/j2735codec/core/j2735_202409/src/Heading.c similarity index 100% rename from j2735codec/core/202409/src/Heading.c rename to j2735codec/core/j2735_202409/src/Heading.c diff --git a/j2735codec/core/202409/src/HeadingConfidence.c b/j2735codec/core/j2735_202409/src/HeadingConfidence.c similarity index 100% rename from j2735codec/core/202409/src/HeadingConfidence.c rename to j2735codec/core/j2735_202409/src/HeadingConfidence.c diff --git a/j2735codec/core/202409/src/HeadingDeg.c b/j2735codec/core/j2735_202409/src/HeadingDeg.c similarity index 100% rename from j2735codec/core/202409/src/HeadingDeg.c rename to j2735codec/core/j2735_202409/src/HeadingDeg.c diff --git a/j2735codec/core/202409/src/HeadingSlice.c b/j2735codec/core/j2735_202409/src/HeadingSlice.c similarity index 100% rename from j2735codec/core/202409/src/HeadingSlice.c rename to j2735codec/core/j2735_202409/src/HeadingSlice.c diff --git a/j2735codec/core/202409/src/HeavyTruckCCMExtensions.c b/j2735codec/core/j2735_202409/src/HeavyTruckCCMExtensions.c similarity index 100% rename from j2735codec/core/202409/src/HeavyTruckCCMExtensions.c rename to j2735codec/core/j2735_202409/src/HeavyTruckCCMExtensions.c diff --git a/j2735codec/core/202409/src/Holiday.c b/j2735codec/core/j2735_202409/src/Holiday.c similarity index 100% rename from j2735codec/core/202409/src/Holiday.c rename to j2735codec/core/j2735_202409/src/Holiday.c diff --git a/j2735codec/core/202409/src/Hour.c b/j2735codec/core/j2735_202409/src/Hour.c similarity index 100% rename from j2735codec/core/202409/src/Hour.c rename to j2735codec/core/j2735_202409/src/Hour.c diff --git a/j2735codec/core/202409/src/HumanPropelledType.c b/j2735codec/core/j2735_202409/src/HumanPropelledType.c similarity index 100% rename from j2735codec/core/202409/src/HumanPropelledType.c rename to j2735codec/core/j2735_202409/src/HumanPropelledType.c diff --git a/j2735codec/core/202409/src/IA5String.c b/j2735codec/core/j2735_202409/src/IA5String.c similarity index 100% rename from j2735codec/core/202409/src/IA5String.c rename to j2735codec/core/j2735_202409/src/IA5String.c diff --git a/j2735codec/core/202409/src/INTEGER.c b/j2735codec/core/j2735_202409/src/INTEGER.c similarity index 100% rename from j2735codec/core/202409/src/INTEGER.c rename to j2735codec/core/j2735_202409/src/INTEGER.c diff --git a/j2735codec/core/202409/src/INTEGER_aper.c b/j2735codec/core/j2735_202409/src/INTEGER_aper.c similarity index 100% rename from j2735codec/core/202409/src/INTEGER_aper.c rename to j2735codec/core/j2735_202409/src/INTEGER_aper.c diff --git a/j2735codec/core/202409/src/INTEGER_ber.c b/j2735codec/core/j2735_202409/src/INTEGER_ber.c similarity index 100% rename from j2735codec/core/202409/src/INTEGER_ber.c rename to j2735codec/core/j2735_202409/src/INTEGER_ber.c diff --git a/j2735codec/core/202409/src/INTEGER_jer.c b/j2735codec/core/j2735_202409/src/INTEGER_jer.c similarity index 100% rename from j2735codec/core/202409/src/INTEGER_jer.c rename to j2735codec/core/j2735_202409/src/INTEGER_jer.c diff --git a/j2735codec/core/202409/src/INTEGER_oer.c b/j2735codec/core/j2735_202409/src/INTEGER_oer.c similarity index 100% rename from j2735codec/core/202409/src/INTEGER_oer.c rename to j2735codec/core/j2735_202409/src/INTEGER_oer.c diff --git a/j2735codec/core/202409/src/INTEGER_print.c b/j2735codec/core/j2735_202409/src/INTEGER_print.c similarity index 100% rename from j2735codec/core/202409/src/INTEGER_print.c rename to j2735codec/core/j2735_202409/src/INTEGER_print.c diff --git a/j2735codec/core/202409/src/INTEGER_rfill.c b/j2735codec/core/j2735_202409/src/INTEGER_rfill.c similarity index 100% rename from j2735codec/core/202409/src/INTEGER_rfill.c rename to j2735codec/core/j2735_202409/src/INTEGER_rfill.c diff --git a/j2735codec/core/202409/src/INTEGER_uper.c b/j2735codec/core/j2735_202409/src/INTEGER_uper.c similarity index 100% rename from j2735codec/core/202409/src/INTEGER_uper.c rename to j2735codec/core/j2735_202409/src/INTEGER_uper.c diff --git a/j2735codec/core/202409/src/INTEGER_xer.c b/j2735codec/core/j2735_202409/src/INTEGER_xer.c similarity index 100% rename from j2735codec/core/202409/src/INTEGER_xer.c rename to j2735codec/core/j2735_202409/src/INTEGER_xer.c diff --git a/j2735codec/core/202409/src/ITISEventType.c b/j2735codec/core/j2735_202409/src/ITISEventType.c similarity index 100% rename from j2735codec/core/202409/src/ITISEventType.c rename to j2735codec/core/j2735_202409/src/ITISEventType.c diff --git a/j2735codec/core/202409/src/ITIS_GenericLocations.c b/j2735codec/core/j2735_202409/src/ITIS_GenericLocations.c similarity index 100% rename from j2735codec/core/202409/src/ITIS_GenericLocations.c rename to j2735codec/core/j2735_202409/src/ITIS_GenericLocations.c diff --git a/j2735codec/core/202409/src/ITIS_ITIScodes.c b/j2735codec/core/j2735_202409/src/ITIS_ITIScodes.c similarity index 100% rename from j2735codec/core/202409/src/ITIS_ITIScodes.c rename to j2735codec/core/j2735_202409/src/ITIS_ITIScodes.c diff --git a/j2735codec/core/202409/src/ITIS_ITIScodesAndText.c b/j2735codec/core/j2735_202409/src/ITIS_ITIScodesAndText.c similarity index 100% rename from j2735codec/core/202409/src/ITIS_ITIScodesAndText.c rename to j2735codec/core/j2735_202409/src/ITIS_ITIScodesAndText.c diff --git a/j2735codec/core/202409/src/ITIS_ITIStext.c b/j2735codec/core/j2735_202409/src/ITIS_ITIStext.c similarity index 100% rename from j2735codec/core/202409/src/ITIS_ITIStext.c rename to j2735codec/core/j2735_202409/src/ITIS_ITIStext.c diff --git a/j2735codec/core/202409/src/ITIS_IncidentResponseEquipment.c b/j2735codec/core/j2735_202409/src/ITIS_IncidentResponseEquipment.c similarity index 100% rename from j2735codec/core/202409/src/ITIS_IncidentResponseEquipment.c rename to j2735codec/core/j2735_202409/src/ITIS_IncidentResponseEquipment.c diff --git a/j2735codec/core/202409/src/ITIS_ResponderGroupAffected.c b/j2735codec/core/j2735_202409/src/ITIS_ResponderGroupAffected.c similarity index 100% rename from j2735codec/core/202409/src/ITIS_ResponderGroupAffected.c rename to j2735codec/core/j2735_202409/src/ITIS_ResponderGroupAffected.c diff --git a/j2735codec/core/202409/src/ITIS_VehicleGroupAffected.c b/j2735codec/core/j2735_202409/src/ITIS_VehicleGroupAffected.c similarity index 100% rename from j2735codec/core/202409/src/ITIS_VehicleGroupAffected.c rename to j2735codec/core/j2735_202409/src/ITIS_VehicleGroupAffected.c diff --git a/j2735codec/core/202409/src/ITISgroups.c b/j2735codec/core/j2735_202409/src/ITISgroups.c similarity index 100% rename from j2735codec/core/202409/src/ITISgroups.c rename to j2735codec/core/j2735_202409/src/ITISgroups.c diff --git a/j2735codec/core/202409/src/ITIStextPhrase.c b/j2735codec/core/j2735_202409/src/ITIStextPhrase.c similarity index 100% rename from j2735codec/core/202409/src/ITIStextPhrase.c rename to j2735codec/core/j2735_202409/src/ITIStextPhrase.c diff --git a/j2735codec/core/202409/src/Ice.c b/j2735codec/core/j2735_202409/src/Ice.c similarity index 100% rename from j2735codec/core/202409/src/Ice.c rename to j2735codec/core/j2735_202409/src/Ice.c diff --git a/j2735codec/core/202409/src/IceType.c b/j2735codec/core/j2735_202409/src/IceType.c similarity index 100% rename from j2735codec/core/202409/src/IceType.c rename to j2735codec/core/j2735_202409/src/IceType.c diff --git a/j2735codec/core/202409/src/IncidentResponseStatus.c b/j2735codec/core/j2735_202409/src/IncidentResponseStatus.c similarity index 100% rename from j2735codec/core/202409/src/IncidentResponseStatus.c rename to j2735codec/core/j2735_202409/src/IncidentResponseStatus.c diff --git a/j2735codec/core/202409/src/IncidentsContainer.c b/j2735codec/core/j2735_202409/src/IncidentsContainer.c similarity index 100% rename from j2735codec/core/202409/src/IncidentsContainer.c rename to j2735codec/core/j2735_202409/src/IncidentsContainer.c diff --git a/j2735codec/core/202409/src/Int1Signed.c b/j2735codec/core/j2735_202409/src/Int1Signed.c similarity index 100% rename from j2735codec/core/202409/src/Int1Signed.c rename to j2735codec/core/j2735_202409/src/Int1Signed.c diff --git a/j2735codec/core/202409/src/Int1Unsigned.c b/j2735codec/core/j2735_202409/src/Int1Unsigned.c similarity index 100% rename from j2735codec/core/202409/src/Int1Unsigned.c rename to j2735codec/core/j2735_202409/src/Int1Unsigned.c diff --git a/j2735codec/core/202409/src/Int2Signed.c b/j2735codec/core/j2735_202409/src/Int2Signed.c similarity index 100% rename from j2735codec/core/202409/src/Int2Signed.c rename to j2735codec/core/j2735_202409/src/Int2Signed.c diff --git a/j2735codec/core/202409/src/Int2Unsigned.c b/j2735codec/core/j2735_202409/src/Int2Unsigned.c similarity index 100% rename from j2735codec/core/202409/src/Int2Unsigned.c rename to j2735codec/core/j2735_202409/src/Int2Unsigned.c diff --git a/j2735codec/core/202409/src/Int3Unsigned.c b/j2735codec/core/j2735_202409/src/Int3Unsigned.c similarity index 100% rename from j2735codec/core/202409/src/Int3Unsigned.c rename to j2735codec/core/j2735_202409/src/Int3Unsigned.c diff --git a/j2735codec/core/202409/src/Int4Signed.c b/j2735codec/core/j2735_202409/src/Int4Signed.c similarity index 100% rename from j2735codec/core/202409/src/Int4Signed.c rename to j2735codec/core/j2735_202409/src/Int4Signed.c diff --git a/j2735codec/core/202409/src/Int4Unsigned.c b/j2735codec/core/j2735_202409/src/Int4Unsigned.c similarity index 100% rename from j2735codec/core/202409/src/Int4Unsigned.c rename to j2735codec/core/j2735_202409/src/Int4Unsigned.c diff --git a/j2735codec/core/202409/src/Int8Signed.c b/j2735codec/core/j2735_202409/src/Int8Signed.c similarity index 100% rename from j2735codec/core/202409/src/Int8Signed.c rename to j2735codec/core/j2735_202409/src/Int8Signed.c diff --git a/j2735codec/core/202409/src/Int8Unsigned.c b/j2735codec/core/j2735_202409/src/Int8Unsigned.c similarity index 100% rename from j2735codec/core/202409/src/Int8Unsigned.c rename to j2735codec/core/j2735_202409/src/Int8Unsigned.c diff --git a/j2735codec/core/202409/src/IntersectionAccessPoint.c b/j2735codec/core/j2735_202409/src/IntersectionAccessPoint.c similarity index 100% rename from j2735codec/core/202409/src/IntersectionAccessPoint.c rename to j2735codec/core/j2735_202409/src/IntersectionAccessPoint.c diff --git a/j2735codec/core/202409/src/IntersectionCollision.c b/j2735codec/core/j2735_202409/src/IntersectionCollision.c similarity index 100% rename from j2735codec/core/202409/src/IntersectionCollision.c rename to j2735codec/core/j2735_202409/src/IntersectionCollision.c diff --git a/j2735codec/core/202409/src/IntersectionGeometry.c b/j2735codec/core/j2735_202409/src/IntersectionGeometry.c similarity index 100% rename from j2735codec/core/202409/src/IntersectionGeometry.c rename to j2735codec/core/j2735_202409/src/IntersectionGeometry.c diff --git a/j2735codec/core/202409/src/IntersectionGeometryList.c b/j2735codec/core/j2735_202409/src/IntersectionGeometryList.c similarity index 100% rename from j2735codec/core/202409/src/IntersectionGeometryList.c rename to j2735codec/core/j2735_202409/src/IntersectionGeometryList.c diff --git a/j2735codec/core/202409/src/IntersectionID.c b/j2735codec/core/j2735_202409/src/IntersectionID.c similarity index 100% rename from j2735codec/core/202409/src/IntersectionID.c rename to j2735codec/core/j2735_202409/src/IntersectionID.c diff --git a/j2735codec/core/202409/src/IntersectionReferenceID.c b/j2735codec/core/j2735_202409/src/IntersectionReferenceID.c similarity index 100% rename from j2735codec/core/202409/src/IntersectionReferenceID.c rename to j2735codec/core/j2735_202409/src/IntersectionReferenceID.c diff --git a/j2735codec/core/202409/src/IntersectionState-addGrpC.c b/j2735codec/core/j2735_202409/src/IntersectionState-addGrpC.c similarity index 100% rename from j2735codec/core/202409/src/IntersectionState-addGrpC.c rename to j2735codec/core/j2735_202409/src/IntersectionState-addGrpC.c diff --git a/j2735codec/core/202409/src/IntersectionState.c b/j2735codec/core/j2735_202409/src/IntersectionState.c similarity index 100% rename from j2735codec/core/202409/src/IntersectionState.c rename to j2735codec/core/j2735_202409/src/IntersectionState.c diff --git a/j2735codec/core/202409/src/IntersectionStateList.c b/j2735codec/core/j2735_202409/src/IntersectionStateList.c similarity index 100% rename from j2735codec/core/202409/src/IntersectionStateList.c rename to j2735codec/core/j2735_202409/src/IntersectionStateList.c diff --git a/j2735codec/core/202409/src/IntersectionStatusObject.c b/j2735codec/core/j2735_202409/src/IntersectionStatusObject.c similarity index 100% rename from j2735codec/core/202409/src/IntersectionStatusObject.c rename to j2735codec/core/j2735_202409/src/IntersectionStatusObject.c diff --git a/j2735codec/core/202409/src/IsDolly.c b/j2735codec/core/j2735_202409/src/IsDolly.c similarity index 100% rename from j2735codec/core/202409/src/IsDolly.c rename to j2735codec/core/j2735_202409/src/IsDolly.c diff --git a/j2735codec/core/202409/src/Iso3833VehicleType.c b/j2735codec/core/j2735_202409/src/Iso3833VehicleType.c similarity index 100% rename from j2735codec/core/202409/src/Iso3833VehicleType.c rename to j2735codec/core/j2735_202409/src/Iso3833VehicleType.c diff --git a/j2735codec/core/202409/src/IssuerIdentifier.c b/j2735codec/core/j2735_202409/src/IssuerIdentifier.c similarity index 100% rename from j2735codec/core/202409/src/IssuerIdentifier.c rename to j2735codec/core/j2735_202409/src/IssuerIdentifier.c diff --git a/j2735codec/core/202409/src/ItemizedChargerData.c b/j2735codec/core/j2735_202409/src/ItemizedChargerData.c similarity index 100% rename from j2735codec/core/202409/src/ItemizedChargerData.c rename to j2735codec/core/j2735_202409/src/ItemizedChargerData.c diff --git a/j2735codec/core/202409/src/ItemizedPaymentReport.c b/j2735codec/core/j2735_202409/src/ItemizedPaymentReport.c similarity index 100% rename from j2735codec/core/202409/src/ItemizedPaymentReport.c rename to j2735codec/core/j2735_202409/src/ItemizedPaymentReport.c diff --git a/j2735codec/core/202409/src/J1939data.c b/j2735codec/core/j2735_202409/src/J1939data.c similarity index 100% rename from j2735codec/core/202409/src/J1939data.c rename to j2735codec/core/j2735_202409/src/J1939data.c diff --git a/j2735codec/core/202409/src/J2540ITIS_GenericLocations.c b/j2735codec/core/j2735_202409/src/J2540ITIS_GenericLocations.c similarity index 100% rename from j2735codec/core/202409/src/J2540ITIS_GenericLocations.c rename to j2735codec/core/j2735_202409/src/J2540ITIS_GenericLocations.c diff --git a/j2735codec/core/202409/src/J2540ITIS_ITIScodes.c b/j2735codec/core/j2735_202409/src/J2540ITIS_ITIScodes.c similarity index 100% rename from j2735codec/core/202409/src/J2540ITIS_ITIScodes.c rename to j2735codec/core/j2735_202409/src/J2540ITIS_ITIScodes.c diff --git a/j2735codec/core/202409/src/J2540ITIS_ITIScodesAndText.c b/j2735codec/core/j2735_202409/src/J2540ITIS_ITIScodesAndText.c similarity index 100% rename from j2735codec/core/202409/src/J2540ITIS_ITIScodesAndText.c rename to j2735codec/core/j2735_202409/src/J2540ITIS_ITIScodesAndText.c diff --git a/j2735codec/core/202409/src/J2540ITIS_ITIStext.c b/j2735codec/core/j2735_202409/src/J2540ITIS_ITIStext.c similarity index 100% rename from j2735codec/core/202409/src/J2540ITIS_ITIStext.c rename to j2735codec/core/j2735_202409/src/J2540ITIS_ITIStext.c diff --git a/j2735codec/core/202409/src/J2540ITIS_IncidentResponseEquipment.c b/j2735codec/core/j2735_202409/src/J2540ITIS_IncidentResponseEquipment.c similarity index 100% rename from j2735codec/core/202409/src/J2540ITIS_IncidentResponseEquipment.c rename to j2735codec/core/j2735_202409/src/J2540ITIS_IncidentResponseEquipment.c diff --git a/j2735codec/core/202409/src/J2540ITIS_ResponderGroupAffected.c b/j2735codec/core/j2735_202409/src/J2540ITIS_ResponderGroupAffected.c similarity index 100% rename from j2735codec/core/202409/src/J2540ITIS_ResponderGroupAffected.c rename to j2735codec/core/j2735_202409/src/J2540ITIS_ResponderGroupAffected.c diff --git a/j2735codec/core/202409/src/J2540ITIS_VehicleGroupAffected.c b/j2735codec/core/j2735_202409/src/J2540ITIS_VehicleGroupAffected.c similarity index 100% rename from j2735codec/core/202409/src/J2540ITIS_VehicleGroupAffected.c rename to j2735codec/core/j2735_202409/src/J2540ITIS_VehicleGroupAffected.c diff --git a/j2735codec/core/202409/src/LaneAttributes-Barrier.c b/j2735codec/core/j2735_202409/src/LaneAttributes-Barrier.c similarity index 100% rename from j2735codec/core/202409/src/LaneAttributes-Barrier.c rename to j2735codec/core/j2735_202409/src/LaneAttributes-Barrier.c diff --git a/j2735codec/core/202409/src/LaneAttributes-Bike.c b/j2735codec/core/j2735_202409/src/LaneAttributes-Bike.c similarity index 100% rename from j2735codec/core/202409/src/LaneAttributes-Bike.c rename to j2735codec/core/j2735_202409/src/LaneAttributes-Bike.c diff --git a/j2735codec/core/202409/src/LaneAttributes-Crosswalk.c b/j2735codec/core/j2735_202409/src/LaneAttributes-Crosswalk.c similarity index 100% rename from j2735codec/core/202409/src/LaneAttributes-Crosswalk.c rename to j2735codec/core/j2735_202409/src/LaneAttributes-Crosswalk.c diff --git a/j2735codec/core/202409/src/LaneAttributes-Parking.c b/j2735codec/core/j2735_202409/src/LaneAttributes-Parking.c similarity index 100% rename from j2735codec/core/202409/src/LaneAttributes-Parking.c rename to j2735codec/core/j2735_202409/src/LaneAttributes-Parking.c diff --git a/j2735codec/core/202409/src/LaneAttributes-Sidewalk.c b/j2735codec/core/j2735_202409/src/LaneAttributes-Sidewalk.c similarity index 100% rename from j2735codec/core/202409/src/LaneAttributes-Sidewalk.c rename to j2735codec/core/j2735_202409/src/LaneAttributes-Sidewalk.c diff --git a/j2735codec/core/202409/src/LaneAttributes-Striping.c b/j2735codec/core/j2735_202409/src/LaneAttributes-Striping.c similarity index 100% rename from j2735codec/core/202409/src/LaneAttributes-Striping.c rename to j2735codec/core/j2735_202409/src/LaneAttributes-Striping.c diff --git a/j2735codec/core/202409/src/LaneAttributes-TrackedVehicle.c b/j2735codec/core/j2735_202409/src/LaneAttributes-TrackedVehicle.c similarity index 100% rename from j2735codec/core/202409/src/LaneAttributes-TrackedVehicle.c rename to j2735codec/core/j2735_202409/src/LaneAttributes-TrackedVehicle.c diff --git a/j2735codec/core/202409/src/LaneAttributes-Vehicle.c b/j2735codec/core/j2735_202409/src/LaneAttributes-Vehicle.c similarity index 100% rename from j2735codec/core/202409/src/LaneAttributes-Vehicle.c rename to j2735codec/core/j2735_202409/src/LaneAttributes-Vehicle.c diff --git a/j2735codec/core/202409/src/LaneAttributes.c b/j2735codec/core/j2735_202409/src/LaneAttributes.c similarity index 100% rename from j2735codec/core/202409/src/LaneAttributes.c rename to j2735codec/core/j2735_202409/src/LaneAttributes.c diff --git a/j2735codec/core/202409/src/LaneChargesTable.c b/j2735codec/core/j2735_202409/src/LaneChargesTable.c similarity index 100% rename from j2735codec/core/202409/src/LaneChargesTable.c rename to j2735codec/core/j2735_202409/src/LaneChargesTable.c diff --git a/j2735codec/core/202409/src/LaneClosed.c b/j2735codec/core/j2735_202409/src/LaneClosed.c similarity index 100% rename from j2735codec/core/202409/src/LaneClosed.c rename to j2735codec/core/j2735_202409/src/LaneClosed.c diff --git a/j2735codec/core/202409/src/LaneClosureContainer.c b/j2735codec/core/j2735_202409/src/LaneClosureContainer.c similarity index 100% rename from j2735codec/core/202409/src/LaneClosureContainer.c rename to j2735codec/core/j2735_202409/src/LaneClosureContainer.c diff --git a/j2735codec/core/202409/src/LaneConnectionID.c b/j2735codec/core/j2735_202409/src/LaneConnectionID.c similarity index 100% rename from j2735codec/core/202409/src/LaneConnectionID.c rename to j2735codec/core/j2735_202409/src/LaneConnectionID.c diff --git a/j2735codec/core/202409/src/LaneDataAttribute-addGrpB.c b/j2735codec/core/j2735_202409/src/LaneDataAttribute-addGrpB.c similarity index 100% rename from j2735codec/core/202409/src/LaneDataAttribute-addGrpB.c rename to j2735codec/core/j2735_202409/src/LaneDataAttribute-addGrpB.c diff --git a/j2735codec/core/202409/src/LaneDataAttribute.c b/j2735codec/core/j2735_202409/src/LaneDataAttribute.c similarity index 100% rename from j2735codec/core/202409/src/LaneDataAttribute.c rename to j2735codec/core/j2735_202409/src/LaneDataAttribute.c diff --git a/j2735codec/core/202409/src/LaneDataAttributeList.c b/j2735codec/core/j2735_202409/src/LaneDataAttributeList.c similarity index 100% rename from j2735codec/core/202409/src/LaneDataAttributeList.c rename to j2735codec/core/j2735_202409/src/LaneDataAttributeList.c diff --git a/j2735codec/core/202409/src/LaneDirection.c b/j2735codec/core/j2735_202409/src/LaneDirection.c similarity index 100% rename from j2735codec/core/202409/src/LaneDirection.c rename to j2735codec/core/j2735_202409/src/LaneDirection.c diff --git a/j2735codec/core/202409/src/LaneID.c b/j2735codec/core/j2735_202409/src/LaneID.c similarity index 100% rename from j2735codec/core/202409/src/LaneID.c rename to j2735codec/core/j2735_202409/src/LaneID.c diff --git a/j2735codec/core/202409/src/LaneInfo.c b/j2735codec/core/j2735_202409/src/LaneInfo.c similarity index 100% rename from j2735codec/core/202409/src/LaneInfo.c rename to j2735codec/core/j2735_202409/src/LaneInfo.c diff --git a/j2735codec/core/202409/src/LaneList.c b/j2735codec/core/j2735_202409/src/LaneList.c similarity index 100% rename from j2735codec/core/202409/src/LaneList.c rename to j2735codec/core/j2735_202409/src/LaneList.c diff --git a/j2735codec/core/202409/src/LaneOffset.c b/j2735codec/core/j2735_202409/src/LaneOffset.c similarity index 100% rename from j2735codec/core/202409/src/LaneOffset.c rename to j2735codec/core/j2735_202409/src/LaneOffset.c diff --git a/j2735codec/core/202409/src/LaneRoadway.c b/j2735codec/core/j2735_202409/src/LaneRoadway.c similarity index 100% rename from j2735codec/core/202409/src/LaneRoadway.c rename to j2735codec/core/j2735_202409/src/LaneRoadway.c diff --git a/j2735codec/core/202409/src/LaneSharing.c b/j2735codec/core/j2735_202409/src/LaneSharing.c similarity index 100% rename from j2735codec/core/202409/src/LaneSharing.c rename to j2735codec/core/j2735_202409/src/LaneSharing.c diff --git a/j2735codec/core/202409/src/LaneTypeAttributes.c b/j2735codec/core/j2735_202409/src/LaneTypeAttributes.c similarity index 100% rename from j2735codec/core/202409/src/LaneTypeAttributes.c rename to j2735codec/core/j2735_202409/src/LaneTypeAttributes.c diff --git a/j2735codec/core/202409/src/LaneWidth.c b/j2735codec/core/j2735_202409/src/LaneWidth.c similarity index 100% rename from j2735codec/core/202409/src/LaneWidth.c rename to j2735codec/core/j2735_202409/src/LaneWidth.c diff --git a/j2735codec/core/202409/src/LargeNumbers.c b/j2735codec/core/j2735_202409/src/LargeNumbers.c similarity index 100% rename from j2735codec/core/202409/src/LargeNumbers.c rename to j2735codec/core/j2735_202409/src/LargeNumbers.c diff --git a/j2735codec/core/202409/src/LastTollPointInfo.c b/j2735codec/core/j2735_202409/src/LastTollPointInfo.c similarity index 100% rename from j2735codec/core/202409/src/LastTollPointInfo.c rename to j2735codec/core/j2735_202409/src/LastTollPointInfo.c diff --git a/j2735codec/core/202409/src/LastTollPointInfos.c b/j2735codec/core/j2735_202409/src/LastTollPointInfos.c similarity index 100% rename from j2735codec/core/202409/src/LastTollPointInfos.c rename to j2735codec/core/j2735_202409/src/LastTollPointInfos.c diff --git a/j2735codec/core/202409/src/LatOffset.c b/j2735codec/core/j2735_202409/src/LatOffset.c similarity index 100% rename from j2735codec/core/202409/src/LatOffset.c rename to j2735codec/core/j2735_202409/src/LatOffset.c diff --git a/j2735codec/core/202409/src/LatitudeDMS.c b/j2735codec/core/j2735_202409/src/LatitudeDMS.c similarity index 100% rename from j2735codec/core/202409/src/LatitudeDMS.c rename to j2735codec/core/j2735_202409/src/LatitudeDMS.c diff --git a/j2735codec/core/202409/src/LatitudeDMS2.c b/j2735codec/core/j2735_202409/src/LatitudeDMS2.c similarity index 100% rename from j2735codec/core/202409/src/LatitudeDMS2.c rename to j2735codec/core/j2735_202409/src/LatitudeDMS2.c diff --git a/j2735codec/core/202409/src/LayerID.c b/j2735codec/core/j2735_202409/src/LayerID.c similarity index 100% rename from j2735codec/core/202409/src/LayerID.c rename to j2735codec/core/j2735_202409/src/LayerID.c diff --git a/j2735codec/core/202409/src/LayerType.c b/j2735codec/core/j2735_202409/src/LayerType.c similarity index 100% rename from j2735codec/core/202409/src/LayerType.c rename to j2735codec/core/j2735_202409/src/LayerType.c diff --git a/j2735codec/core/202409/src/LightVehicleCCMExtensions.c b/j2735codec/core/j2735_202409/src/LightVehicleCCMExtensions.c similarity index 100% rename from j2735codec/core/202409/src/LightVehicleCCMExtensions.c rename to j2735codec/core/j2735_202409/src/LightVehicleCCMExtensions.c diff --git a/j2735codec/core/202409/src/LightbarInUse.c b/j2735codec/core/j2735_202409/src/LightbarInUse.c similarity index 100% rename from j2735codec/core/202409/src/LightbarInUse.c rename to j2735codec/core/j2735_202409/src/LightbarInUse.c diff --git a/j2735codec/core/202409/src/LocAndTimeStamp.c b/j2735codec/core/j2735_202409/src/LocAndTimeStamp.c similarity index 100% rename from j2735codec/core/202409/src/LocAndTimeStamp.c rename to j2735codec/core/j2735_202409/src/LocAndTimeStamp.c diff --git a/j2735codec/core/202409/src/LocAndTimeStamps.c b/j2735codec/core/j2735_202409/src/LocAndTimeStamps.c similarity index 100% rename from j2735codec/core/202409/src/LocAndTimeStamps.c rename to j2735codec/core/j2735_202409/src/LocAndTimeStamps.c diff --git a/j2735codec/core/202409/src/LocalVehicleClassId.c b/j2735codec/core/j2735_202409/src/LocalVehicleClassId.c similarity index 100% rename from j2735codec/core/202409/src/LocalVehicleClassId.c rename to j2735codec/core/j2735_202409/src/LocalVehicleClassId.c diff --git a/j2735codec/core/202409/src/Location-quality.c b/j2735codec/core/j2735_202409/src/Location-quality.c similarity index 100% rename from j2735codec/core/202409/src/Location-quality.c rename to j2735codec/core/j2735_202409/src/Location-quality.c diff --git a/j2735codec/core/202409/src/Location-tech.c b/j2735codec/core/j2735_202409/src/Location-tech.c similarity index 100% rename from j2735codec/core/202409/src/Location-tech.c rename to j2735codec/core/j2735_202409/src/Location-tech.c diff --git a/j2735codec/core/202409/src/LocationClassId.c b/j2735codec/core/j2735_202409/src/LocationClassId.c similarity index 100% rename from j2735codec/core/202409/src/LocationClassId.c rename to j2735codec/core/j2735_202409/src/LocationClassId.c diff --git a/j2735codec/core/202409/src/LongOffset.c b/j2735codec/core/j2735_202409/src/LongOffset.c similarity index 100% rename from j2735codec/core/202409/src/LongOffset.c rename to j2735codec/core/j2735_202409/src/LongOffset.c diff --git a/j2735codec/core/202409/src/LongitudeDMS.c b/j2735codec/core/j2735_202409/src/LongitudeDMS.c similarity index 100% rename from j2735codec/core/202409/src/LongitudeDMS.c rename to j2735codec/core/j2735_202409/src/LongitudeDMS.c diff --git a/j2735codec/core/202409/src/LongitudeDMS2.c b/j2735codec/core/j2735_202409/src/LongitudeDMS2.c similarity index 100% rename from j2735codec/core/202409/src/LongitudeDMS2.c rename to j2735codec/core/j2735_202409/src/LongitudeDMS2.c diff --git a/j2735codec/core/202409/src/LongitudinalControlState.c b/j2735codec/core/j2735_202409/src/LongitudinalControlState.c similarity index 100% rename from j2735codec/core/202409/src/LongitudinalControlState.c rename to j2735codec/core/j2735_202409/src/LongitudinalControlState.c diff --git a/j2735codec/core/202409/src/Lpn.c b/j2735codec/core/j2735_202409/src/Lpn.c similarity index 100% rename from j2735codec/core/202409/src/Lpn.c rename to j2735codec/core/j2735_202409/src/Lpn.c diff --git a/j2735codec/core/202409/src/MSCMType.c b/j2735codec/core/j2735_202409/src/MSCMType.c similarity index 100% rename from j2735codec/core/202409/src/MSCMType.c rename to j2735codec/core/j2735_202409/src/MSCMType.c diff --git a/j2735codec/core/202409/src/MUTCDCode.c b/j2735codec/core/j2735_202409/src/MUTCDCode.c similarity index 100% rename from j2735codec/core/202409/src/MUTCDCode.c rename to j2735codec/core/j2735_202409/src/MUTCDCode.c diff --git a/j2735codec/core/202409/src/MUTCDLocations.c b/j2735codec/core/j2735_202409/src/MUTCDLocations.c similarity index 100% rename from j2735codec/core/202409/src/MUTCDLocations.c rename to j2735codec/core/j2735_202409/src/MUTCDLocations.c diff --git a/j2735codec/core/202409/src/Maneuver.c b/j2735codec/core/j2735_202409/src/Maneuver.c similarity index 100% rename from j2735codec/core/202409/src/Maneuver.c rename to j2735codec/core/j2735_202409/src/Maneuver.c diff --git a/j2735codec/core/202409/src/ManeuverAssistList.c b/j2735codec/core/j2735_202409/src/ManeuverAssistList.c similarity index 100% rename from j2735codec/core/202409/src/ManeuverAssistList.c rename to j2735codec/core/j2735_202409/src/ManeuverAssistList.c diff --git a/j2735codec/core/202409/src/ManeuverExecutionStatus.c b/j2735codec/core/j2735_202409/src/ManeuverExecutionStatus.c similarity index 100% rename from j2735codec/core/202409/src/ManeuverExecutionStatus.c rename to j2735codec/core/j2735_202409/src/ManeuverExecutionStatus.c diff --git a/j2735codec/core/202409/src/ManeuverSharingAndCoordinatingMessage.c b/j2735codec/core/j2735_202409/src/ManeuverSharingAndCoordinatingMessage.c similarity index 100% rename from j2735codec/core/202409/src/ManeuverSharingAndCoordinatingMessage.c rename to j2735codec/core/j2735_202409/src/ManeuverSharingAndCoordinatingMessage.c diff --git a/j2735codec/core/202409/src/ManeuverSharingAndCoordinatingMessage_ManeuverID.c b/j2735codec/core/j2735_202409/src/ManeuverSharingAndCoordinatingMessage_ManeuverID.c similarity index 100% rename from j2735codec/core/202409/src/ManeuverSharingAndCoordinatingMessage_ManeuverID.c rename to j2735codec/core/j2735_202409/src/ManeuverSharingAndCoordinatingMessage_ManeuverID.c diff --git a/j2735codec/core/202409/src/ManeuverSharingAndCoordinatingMessage_ObjectDistance.c b/j2735codec/core/j2735_202409/src/ManeuverSharingAndCoordinatingMessage_ObjectDistance.c similarity index 100% rename from j2735codec/core/202409/src/ManeuverSharingAndCoordinatingMessage_ObjectDistance.c rename to j2735codec/core/j2735_202409/src/ManeuverSharingAndCoordinatingMessage_ObjectDistance.c diff --git a/j2735codec/core/202409/src/ManeuverSharingAndCoordinatingMessage_PositionOffsetXYZ.c b/j2735codec/core/j2735_202409/src/ManeuverSharingAndCoordinatingMessage_PositionOffsetXYZ.c similarity index 100% rename from j2735codec/core/202409/src/ManeuverSharingAndCoordinatingMessage_PositionOffsetXYZ.c rename to j2735codec/core/j2735_202409/src/ManeuverSharingAndCoordinatingMessage_PositionOffsetXYZ.c diff --git a/j2735codec/core/202409/src/MapData-addGrpC.c b/j2735codec/core/j2735_202409/src/MapData-addGrpC.c similarity index 100% rename from j2735codec/core/202409/src/MapData-addGrpC.c rename to j2735codec/core/j2735_202409/src/MapData-addGrpC.c diff --git a/j2735codec/core/202409/src/MapData.c b/j2735codec/core/j2735_202409/src/MapData.c similarity index 100% rename from j2735codec/core/202409/src/MapData.c rename to j2735codec/core/j2735_202409/src/MapData.c diff --git a/j2735codec/core/202409/src/MaxAvailableAcceleration.c b/j2735codec/core/j2735_202409/src/MaxAvailableAcceleration.c similarity index 100% rename from j2735codec/core/202409/src/MaxAvailableAcceleration.c rename to j2735codec/core/j2735_202409/src/MaxAvailableAcceleration.c diff --git a/j2735codec/core/202409/src/MaxAvailableDeceleration.c b/j2735codec/core/j2735_202409/src/MaxAvailableDeceleration.c similarity index 100% rename from j2735codec/core/202409/src/MaxAvailableDeceleration.c rename to j2735codec/core/j2735_202409/src/MaxAvailableDeceleration.c diff --git a/j2735codec/core/202409/src/MaxTimetoChange.c b/j2735codec/core/j2735_202409/src/MaxTimetoChange.c similarity index 100% rename from j2735codec/core/202409/src/MaxTimetoChange.c rename to j2735codec/core/j2735_202409/src/MaxTimetoChange.c diff --git a/j2735codec/core/202409/src/MeasurementTimeOffset.c b/j2735codec/core/j2735_202409/src/MeasurementTimeOffset.c similarity index 100% rename from j2735codec/core/202409/src/MeasurementTimeOffset.c rename to j2735codec/core/j2735_202409/src/MeasurementTimeOffset.c diff --git a/j2735codec/core/202409/src/MergeDivergeNodeAngle.c b/j2735codec/core/j2735_202409/src/MergeDivergeNodeAngle.c similarity index 100% rename from j2735codec/core/202409/src/MergeDivergeNodeAngle.c rename to j2735codec/core/j2735_202409/src/MergeDivergeNodeAngle.c diff --git a/j2735codec/core/202409/src/MessageBLOB.c b/j2735codec/core/j2735_202409/src/MessageBLOB.c similarity index 100% rename from j2735codec/core/202409/src/MessageBLOB.c rename to j2735codec/core/j2735_202409/src/MessageBLOB.c diff --git a/j2735codec/core/202409/src/MessageFrame.c b/j2735codec/core/j2735_202409/src/MessageFrame.c similarity index 100% rename from j2735codec/core/202409/src/MessageFrame.c rename to j2735codec/core/j2735_202409/src/MessageFrame.c diff --git a/j2735codec/core/202409/src/MinTimetoChange.c b/j2735codec/core/j2735_202409/src/MinTimetoChange.c similarity index 100% rename from j2735codec/core/202409/src/MinTimetoChange.c rename to j2735codec/core/j2735_202409/src/MinTimetoChange.c diff --git a/j2735codec/core/202409/src/Minute.c b/j2735codec/core/j2735_202409/src/Minute.c similarity index 100% rename from j2735codec/core/202409/src/Minute.c rename to j2735codec/core/j2735_202409/src/Minute.c diff --git a/j2735codec/core/202409/src/MinuteOfTheYear.c b/j2735codec/core/j2735_202409/src/MinuteOfTheYear.c similarity index 100% rename from j2735codec/core/202409/src/MinuteOfTheYear.c rename to j2735codec/core/j2735_202409/src/MinuteOfTheYear.c diff --git a/j2735codec/core/202409/src/MinutesAngle.c b/j2735codec/core/j2735_202409/src/MinutesAngle.c similarity index 100% rename from j2735codec/core/202409/src/MinutesAngle.c rename to j2735codec/core/j2735_202409/src/MinutesAngle.c diff --git a/j2735codec/core/202409/src/MinutesDuration.c b/j2735codec/core/j2735_202409/src/MinutesDuration.c similarity index 100% rename from j2735codec/core/202409/src/MinutesDuration.c rename to j2735codec/core/j2735_202409/src/MinutesDuration.c diff --git a/j2735codec/core/202409/src/MobileSituation.c b/j2735codec/core/j2735_202409/src/MobileSituation.c similarity index 100% rename from j2735codec/core/202409/src/MobileSituation.c rename to j2735codec/core/j2735_202409/src/MobileSituation.c diff --git a/j2735codec/core/202409/src/Month.c b/j2735codec/core/j2735_202409/src/Month.c similarity index 100% rename from j2735codec/core/202409/src/Month.c rename to j2735codec/core/j2735_202409/src/Month.c diff --git a/j2735codec/core/202409/src/MotorizedPropelledType.c b/j2735codec/core/j2735_202409/src/MotorizedPropelledType.c similarity index 100% rename from j2735codec/core/202409/src/MotorizedPropelledType.c rename to j2735codec/core/j2735_202409/src/MotorizedPropelledType.c diff --git a/j2735codec/core/202409/src/MovementEvent-addGrpB.c b/j2735codec/core/j2735_202409/src/MovementEvent-addGrpB.c similarity index 100% rename from j2735codec/core/202409/src/MovementEvent-addGrpB.c rename to j2735codec/core/j2735_202409/src/MovementEvent-addGrpB.c diff --git a/j2735codec/core/202409/src/MovementEvent.c b/j2735codec/core/j2735_202409/src/MovementEvent.c similarity index 100% rename from j2735codec/core/202409/src/MovementEvent.c rename to j2735codec/core/j2735_202409/src/MovementEvent.c diff --git a/j2735codec/core/202409/src/MovementEventList.c b/j2735codec/core/j2735_202409/src/MovementEventList.c similarity index 100% rename from j2735codec/core/202409/src/MovementEventList.c rename to j2735codec/core/j2735_202409/src/MovementEventList.c diff --git a/j2735codec/core/202409/src/MovementList.c b/j2735codec/core/j2735_202409/src/MovementList.c similarity index 100% rename from j2735codec/core/202409/src/MovementList.c rename to j2735codec/core/j2735_202409/src/MovementList.c diff --git a/j2735codec/core/202409/src/MovementPhaseState.c b/j2735codec/core/j2735_202409/src/MovementPhaseState.c similarity index 100% rename from j2735codec/core/202409/src/MovementPhaseState.c rename to j2735codec/core/j2735_202409/src/MovementPhaseState.c diff --git a/j2735codec/core/202409/src/MovementState.c b/j2735codec/core/j2735_202409/src/MovementState.c similarity index 100% rename from j2735codec/core/202409/src/MovementState.c rename to j2735codec/core/j2735_202409/src/MovementState.c diff --git a/j2735codec/core/202409/src/MsgCRC.c b/j2735codec/core/j2735_202409/src/MsgCRC.c similarity index 100% rename from j2735codec/core/202409/src/MsgCRC.c rename to j2735codec/core/j2735_202409/src/MsgCRC.c diff --git a/j2735codec/core/202409/src/MultiVehicleResponse.c b/j2735codec/core/j2735_202409/src/MultiVehicleResponse.c similarity index 100% rename from j2735codec/core/202409/src/MultiVehicleResponse.c rename to j2735codec/core/j2735_202409/src/MultiVehicleResponse.c diff --git a/j2735codec/core/202409/src/NMEA-MsgType.c b/j2735codec/core/j2735_202409/src/NMEA-MsgType.c similarity index 100% rename from j2735codec/core/202409/src/NMEA-MsgType.c rename to j2735codec/core/j2735_202409/src/NMEA-MsgType.c diff --git a/j2735codec/core/202409/src/NMEA-Payload.c b/j2735codec/core/j2735_202409/src/NMEA-Payload.c similarity index 100% rename from j2735codec/core/202409/src/NMEA-Payload.c rename to j2735codec/core/j2735_202409/src/NMEA-Payload.c diff --git a/j2735codec/core/202409/src/NMEA-Revision.c b/j2735codec/core/j2735_202409/src/NMEA-Revision.c similarity index 100% rename from j2735codec/core/202409/src/NMEA-Revision.c rename to j2735codec/core/j2735_202409/src/NMEA-Revision.c diff --git a/j2735codec/core/202409/src/NMEAcorrections.c b/j2735codec/core/j2735_202409/src/NMEAcorrections.c similarity index 100% rename from j2735codec/core/202409/src/NMEAcorrections.c rename to j2735codec/core/j2735_202409/src/NMEAcorrections.c diff --git a/j2735codec/core/202409/src/NTCIPEssAirTemperature.c b/j2735codec/core/j2735_202409/src/NTCIPEssAirTemperature.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPEssAirTemperature.c rename to j2735codec/core/j2735_202409/src/NTCIPEssAirTemperature.c diff --git a/j2735codec/core/202409/src/NTCIPEssCloudSituationV4.c b/j2735codec/core/j2735_202409/src/NTCIPEssCloudSituationV4.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPEssCloudSituationV4.c rename to j2735codec/core/j2735_202409/src/NTCIPEssCloudSituationV4.c diff --git a/j2735codec/core/202409/src/NTCIPEssDewpointTemp.c b/j2735codec/core/j2735_202409/src/NTCIPEssDewpointTemp.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPEssDewpointTemp.c rename to j2735codec/core/j2735_202409/src/NTCIPEssDewpointTemp.c diff --git a/j2735codec/core/202409/src/NTCIPEssPaveTreatProductForm.c b/j2735codec/core/j2735_202409/src/NTCIPEssPaveTreatProductForm.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPEssPaveTreatProductForm.c rename to j2735codec/core/j2735_202409/src/NTCIPEssPaveTreatProductForm.c diff --git a/j2735codec/core/202409/src/NTCIPEssPaveTreatProductType.c b/j2735codec/core/j2735_202409/src/NTCIPEssPaveTreatProductType.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPEssPaveTreatProductType.c rename to j2735codec/core/j2735_202409/src/NTCIPEssPaveTreatProductType.c diff --git a/j2735codec/core/202409/src/NTCIPEssPaveTreatmentAmount.c b/j2735codec/core/j2735_202409/src/NTCIPEssPaveTreatmentAmount.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPEssPaveTreatmentAmount.c rename to j2735codec/core/j2735_202409/src/NTCIPEssPaveTreatmentAmount.c diff --git a/j2735codec/core/202409/src/NTCIPEssPaveTreatmentWidth.c b/j2735codec/core/j2735_202409/src/NTCIPEssPaveTreatmentWidth.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPEssPaveTreatmentWidth.c rename to j2735codec/core/j2735_202409/src/NTCIPEssPaveTreatmentWidth.c diff --git a/j2735codec/core/202409/src/NTCIPEssPavementTreatmentLatitude.c b/j2735codec/core/j2735_202409/src/NTCIPEssPavementTreatmentLatitude.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPEssPavementTreatmentLatitude.c rename to j2735codec/core/j2735_202409/src/NTCIPEssPavementTreatmentLatitude.c diff --git a/j2735codec/core/202409/src/NTCIPEssPavementTreatmentLocation.c b/j2735codec/core/j2735_202409/src/NTCIPEssPavementTreatmentLocation.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPEssPavementTreatmentLocation.c rename to j2735codec/core/j2735_202409/src/NTCIPEssPavementTreatmentLocation.c diff --git a/j2735codec/core/202409/src/NTCIPEssPavementTreatmentLongitude.c b/j2735codec/core/j2735_202409/src/NTCIPEssPavementTreatmentLongitude.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPEssPavementTreatmentLongitude.c rename to j2735codec/core/j2735_202409/src/NTCIPEssPavementTreatmentLongitude.c diff --git a/j2735codec/core/202409/src/NTCIPEssPercentProductMix.c b/j2735codec/core/j2735_202409/src/NTCIPEssPercentProductMix.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPEssPercentProductMix.c rename to j2735codec/core/j2735_202409/src/NTCIPEssPercentProductMix.c diff --git a/j2735codec/core/202409/src/NTCIPEssPressureSensorAtmosphericPressure.c b/j2735codec/core/j2735_202409/src/NTCIPEssPressureSensorAtmosphericPressure.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPEssPressureSensorAtmosphericPressure.c rename to j2735codec/core/j2735_202409/src/NTCIPEssPressureSensorAtmosphericPressure.c diff --git a/j2735codec/core/202409/src/NTCIPEssSurfaceIceOrWaterDepth.c b/j2735codec/core/j2735_202409/src/NTCIPEssSurfaceIceOrWaterDepth.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPEssSurfaceIceOrWaterDepth.c rename to j2735codec/core/j2735_202409/src/NTCIPEssSurfaceIceOrWaterDepth.c diff --git a/j2735codec/core/202409/src/NTCIPEssSurfaceTemperature.c b/j2735codec/core/j2735_202409/src/NTCIPEssSurfaceTemperature.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPEssSurfaceTemperature.c rename to j2735codec/core/j2735_202409/src/NTCIPEssSurfaceTemperature.c diff --git a/j2735codec/core/202409/src/NTCIPEssTemperatureSensorHeight.c b/j2735codec/core/j2735_202409/src/NTCIPEssTemperatureSensorHeight.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPEssTemperatureSensorHeight.c rename to j2735codec/core/j2735_202409/src/NTCIPEssTemperatureSensorHeight.c diff --git a/j2735codec/core/202409/src/NTCIPEssTotalRadiationPeriod.c b/j2735codec/core/j2735_202409/src/NTCIPEssTotalRadiationPeriod.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPEssTotalRadiationPeriod.c rename to j2735codec/core/j2735_202409/src/NTCIPEssTotalRadiationPeriod.c diff --git a/j2735codec/core/202409/src/NTCIPEssTotalRadiationV4.c b/j2735codec/core/j2735_202409/src/NTCIPEssTotalRadiationV4.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPEssTotalRadiationV4.c rename to j2735codec/core/j2735_202409/src/NTCIPEssTotalRadiationV4.c diff --git a/j2735codec/core/202409/src/NTCIPEssVisibility.c b/j2735codec/core/j2735_202409/src/NTCIPEssVisibility.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPEssVisibility.c rename to j2735codec/core/j2735_202409/src/NTCIPEssVisibility.c diff --git a/j2735codec/core/202409/src/NTCIPEssVisibilitySituation.c b/j2735codec/core/j2735_202409/src/NTCIPEssVisibilitySituation.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPEssVisibilitySituation.c rename to j2735codec/core/j2735_202409/src/NTCIPEssVisibilitySituation.c diff --git a/j2735codec/core/202409/src/NTCIPHumiditySensorRelativeHumidity.c b/j2735codec/core/j2735_202409/src/NTCIPHumiditySensorRelativeHumidity.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPHumiditySensorRelativeHumidity.c rename to j2735codec/core/j2735_202409/src/NTCIPHumiditySensorRelativeHumidity.c diff --git a/j2735codec/core/202409/src/NTCIPPavementSensorSurfaceCondition.c b/j2735codec/core/j2735_202409/src/NTCIPPavementSensorSurfaceCondition.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPPavementSensorSurfaceCondition.c rename to j2735codec/core/j2735_202409/src/NTCIPPavementSensorSurfaceCondition.c diff --git a/j2735codec/core/202409/src/NTCIPPrecipitationSensorPrecipSituation.c b/j2735codec/core/j2735_202409/src/NTCIPPrecipitationSensorPrecipSituation.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPPrecipitationSensorPrecipSituation.c rename to j2735codec/core/j2735_202409/src/NTCIPPrecipitationSensorPrecipSituation.c diff --git a/j2735codec/core/202409/src/NTCIPWindSensorAvgDirection.c b/j2735codec/core/j2735_202409/src/NTCIPWindSensorAvgDirection.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPWindSensorAvgDirection.c rename to j2735codec/core/j2735_202409/src/NTCIPWindSensorAvgDirection.c diff --git a/j2735codec/core/202409/src/NTCIPWindSensorAvgSpeed.c b/j2735codec/core/j2735_202409/src/NTCIPWindSensorAvgSpeed.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPWindSensorAvgSpeed.c rename to j2735codec/core/j2735_202409/src/NTCIPWindSensorAvgSpeed.c diff --git a/j2735codec/core/202409/src/NTCIPWindSensorGustDirection.c b/j2735codec/core/j2735_202409/src/NTCIPWindSensorGustDirection.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPWindSensorGustDirection.c rename to j2735codec/core/j2735_202409/src/NTCIPWindSensorGustDirection.c diff --git a/j2735codec/core/202409/src/NTCIPWindSensorGustSpeed.c b/j2735codec/core/j2735_202409/src/NTCIPWindSensorGustSpeed.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPWindSensorGustSpeed.c rename to j2735codec/core/j2735_202409/src/NTCIPWindSensorGustSpeed.c diff --git a/j2735codec/core/202409/src/NTCIPWindSensorSpotDirection.c b/j2735codec/core/j2735_202409/src/NTCIPWindSensorSpotDirection.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPWindSensorSpotDirection.c rename to j2735codec/core/j2735_202409/src/NTCIPWindSensorSpotDirection.c diff --git a/j2735codec/core/202409/src/NTCIPWindSensorSpotSpeed.c b/j2735codec/core/j2735_202409/src/NTCIPWindSensorSpotSpeed.c similarity index 100% rename from j2735codec/core/202409/src/NTCIPWindSensorSpotSpeed.c rename to j2735codec/core/j2735_202409/src/NTCIPWindSensorSpotSpeed.c diff --git a/j2735codec/core/202409/src/NULL.c b/j2735codec/core/j2735_202409/src/NULL.c similarity index 100% rename from j2735codec/core/202409/src/NULL.c rename to j2735codec/core/j2735_202409/src/NULL.c diff --git a/j2735codec/core/202409/src/NULL_aper.c b/j2735codec/core/j2735_202409/src/NULL_aper.c similarity index 100% rename from j2735codec/core/202409/src/NULL_aper.c rename to j2735codec/core/j2735_202409/src/NULL_aper.c diff --git a/j2735codec/core/202409/src/NULL_ber.c b/j2735codec/core/j2735_202409/src/NULL_ber.c similarity index 100% rename from j2735codec/core/202409/src/NULL_ber.c rename to j2735codec/core/j2735_202409/src/NULL_ber.c diff --git a/j2735codec/core/202409/src/NULL_jer.c b/j2735codec/core/j2735_202409/src/NULL_jer.c similarity index 100% rename from j2735codec/core/202409/src/NULL_jer.c rename to j2735codec/core/j2735_202409/src/NULL_jer.c diff --git a/j2735codec/core/202409/src/NULL_oer.c b/j2735codec/core/j2735_202409/src/NULL_oer.c similarity index 100% rename from j2735codec/core/202409/src/NULL_oer.c rename to j2735codec/core/j2735_202409/src/NULL_oer.c diff --git a/j2735codec/core/202409/src/NULL_print.c b/j2735codec/core/j2735_202409/src/NULL_print.c similarity index 100% rename from j2735codec/core/202409/src/NULL_print.c rename to j2735codec/core/j2735_202409/src/NULL_print.c diff --git a/j2735codec/core/202409/src/NULL_rfill.c b/j2735codec/core/j2735_202409/src/NULL_rfill.c similarity index 100% rename from j2735codec/core/202409/src/NULL_rfill.c rename to j2735codec/core/j2735_202409/src/NULL_rfill.c diff --git a/j2735codec/core/202409/src/NULL_uper.c b/j2735codec/core/j2735_202409/src/NULL_uper.c similarity index 100% rename from j2735codec/core/202409/src/NULL_uper.c rename to j2735codec/core/j2735_202409/src/NULL_uper.c diff --git a/j2735codec/core/202409/src/NULL_xer.c b/j2735codec/core/j2735_202409/src/NULL_xer.c similarity index 100% rename from j2735codec/core/202409/src/NULL_xer.c rename to j2735codec/core/j2735_202409/src/NULL_xer.c diff --git a/j2735codec/core/202409/src/NamedObjects.c b/j2735codec/core/j2735_202409/src/NamedObjects.c similarity index 100% rename from j2735codec/core/202409/src/NamedObjects.c rename to j2735codec/core/j2735_202409/src/NamedObjects.c diff --git a/j2735codec/core/202409/src/NativeEnumerated.c b/j2735codec/core/j2735_202409/src/NativeEnumerated.c similarity index 100% rename from j2735codec/core/202409/src/NativeEnumerated.c rename to j2735codec/core/j2735_202409/src/NativeEnumerated.c diff --git a/j2735codec/core/202409/src/NativeEnumerated_aper.c b/j2735codec/core/j2735_202409/src/NativeEnumerated_aper.c similarity index 100% rename from j2735codec/core/202409/src/NativeEnumerated_aper.c rename to j2735codec/core/j2735_202409/src/NativeEnumerated_aper.c diff --git a/j2735codec/core/202409/src/NativeEnumerated_ber.c b/j2735codec/core/j2735_202409/src/NativeEnumerated_ber.c similarity index 100% rename from j2735codec/core/202409/src/NativeEnumerated_ber.c rename to j2735codec/core/j2735_202409/src/NativeEnumerated_ber.c diff --git a/j2735codec/core/202409/src/NativeEnumerated_jer.c b/j2735codec/core/j2735_202409/src/NativeEnumerated_jer.c similarity index 100% rename from j2735codec/core/202409/src/NativeEnumerated_jer.c rename to j2735codec/core/j2735_202409/src/NativeEnumerated_jer.c diff --git a/j2735codec/core/202409/src/NativeEnumerated_oer.c b/j2735codec/core/j2735_202409/src/NativeEnumerated_oer.c similarity index 100% rename from j2735codec/core/202409/src/NativeEnumerated_oer.c rename to j2735codec/core/j2735_202409/src/NativeEnumerated_oer.c diff --git a/j2735codec/core/202409/src/NativeEnumerated_uper.c b/j2735codec/core/j2735_202409/src/NativeEnumerated_uper.c similarity index 100% rename from j2735codec/core/202409/src/NativeEnumerated_uper.c rename to j2735codec/core/j2735_202409/src/NativeEnumerated_uper.c diff --git a/j2735codec/core/202409/src/NativeEnumerated_xer.c b/j2735codec/core/j2735_202409/src/NativeEnumerated_xer.c similarity index 100% rename from j2735codec/core/202409/src/NativeEnumerated_xer.c rename to j2735codec/core/j2735_202409/src/NativeEnumerated_xer.c diff --git a/j2735codec/core/202409/src/NativeInteger.c b/j2735codec/core/j2735_202409/src/NativeInteger.c similarity index 100% rename from j2735codec/core/202409/src/NativeInteger.c rename to j2735codec/core/j2735_202409/src/NativeInteger.c diff --git a/j2735codec/core/202409/src/NativeInteger_aper.c b/j2735codec/core/j2735_202409/src/NativeInteger_aper.c similarity index 100% rename from j2735codec/core/202409/src/NativeInteger_aper.c rename to j2735codec/core/j2735_202409/src/NativeInteger_aper.c diff --git a/j2735codec/core/202409/src/NativeInteger_ber.c b/j2735codec/core/j2735_202409/src/NativeInteger_ber.c similarity index 100% rename from j2735codec/core/202409/src/NativeInteger_ber.c rename to j2735codec/core/j2735_202409/src/NativeInteger_ber.c diff --git a/j2735codec/core/202409/src/NativeInteger_jer.c b/j2735codec/core/j2735_202409/src/NativeInteger_jer.c similarity index 100% rename from j2735codec/core/202409/src/NativeInteger_jer.c rename to j2735codec/core/j2735_202409/src/NativeInteger_jer.c diff --git a/j2735codec/core/202409/src/NativeInteger_oer.c b/j2735codec/core/j2735_202409/src/NativeInteger_oer.c similarity index 100% rename from j2735codec/core/202409/src/NativeInteger_oer.c rename to j2735codec/core/j2735_202409/src/NativeInteger_oer.c diff --git a/j2735codec/core/202409/src/NativeInteger_print.c b/j2735codec/core/j2735_202409/src/NativeInteger_print.c similarity index 100% rename from j2735codec/core/202409/src/NativeInteger_print.c rename to j2735codec/core/j2735_202409/src/NativeInteger_print.c diff --git a/j2735codec/core/202409/src/NativeInteger_rfill.c b/j2735codec/core/j2735_202409/src/NativeInteger_rfill.c similarity index 100% rename from j2735codec/core/202409/src/NativeInteger_rfill.c rename to j2735codec/core/j2735_202409/src/NativeInteger_rfill.c diff --git a/j2735codec/core/202409/src/NativeInteger_uper.c b/j2735codec/core/j2735_202409/src/NativeInteger_uper.c similarity index 100% rename from j2735codec/core/202409/src/NativeInteger_uper.c rename to j2735codec/core/j2735_202409/src/NativeInteger_uper.c diff --git a/j2735codec/core/202409/src/NativeInteger_xer.c b/j2735codec/core/j2735_202409/src/NativeInteger_xer.c similarity index 100% rename from j2735codec/core/202409/src/NativeInteger_xer.c rename to j2735codec/core/j2735_202409/src/NativeInteger_xer.c diff --git a/j2735codec/core/202409/src/Node-LL-24B.c b/j2735codec/core/j2735_202409/src/Node-LL-24B.c similarity index 100% rename from j2735codec/core/202409/src/Node-LL-24B.c rename to j2735codec/core/j2735_202409/src/Node-LL-24B.c diff --git a/j2735codec/core/202409/src/Node-LL-28B.c b/j2735codec/core/j2735_202409/src/Node-LL-28B.c similarity index 100% rename from j2735codec/core/202409/src/Node-LL-28B.c rename to j2735codec/core/j2735_202409/src/Node-LL-28B.c diff --git a/j2735codec/core/202409/src/Node-LL-32B.c b/j2735codec/core/j2735_202409/src/Node-LL-32B.c similarity index 100% rename from j2735codec/core/202409/src/Node-LL-32B.c rename to j2735codec/core/j2735_202409/src/Node-LL-32B.c diff --git a/j2735codec/core/202409/src/Node-LL-36B.c b/j2735codec/core/j2735_202409/src/Node-LL-36B.c similarity index 100% rename from j2735codec/core/202409/src/Node-LL-36B.c rename to j2735codec/core/j2735_202409/src/Node-LL-36B.c diff --git a/j2735codec/core/202409/src/Node-LL-44B.c b/j2735codec/core/j2735_202409/src/Node-LL-44B.c similarity index 100% rename from j2735codec/core/202409/src/Node-LL-44B.c rename to j2735codec/core/j2735_202409/src/Node-LL-44B.c diff --git a/j2735codec/core/202409/src/Node-LL-48B.c b/j2735codec/core/j2735_202409/src/Node-LL-48B.c similarity index 100% rename from j2735codec/core/202409/src/Node-LL-48B.c rename to j2735codec/core/j2735_202409/src/Node-LL-48B.c diff --git a/j2735codec/core/202409/src/Node-LLdms-48b.c b/j2735codec/core/j2735_202409/src/Node-LLdms-48b.c similarity index 100% rename from j2735codec/core/202409/src/Node-LLdms-48b.c rename to j2735codec/core/j2735_202409/src/Node-LLdms-48b.c diff --git a/j2735codec/core/202409/src/Node-LLdms-80b.c b/j2735codec/core/j2735_202409/src/Node-LLdms-80b.c similarity index 100% rename from j2735codec/core/202409/src/Node-LLdms-80b.c rename to j2735codec/core/j2735_202409/src/Node-LLdms-80b.c diff --git a/j2735codec/core/202409/src/Node-LLmD-64b.c b/j2735codec/core/j2735_202409/src/Node-LLmD-64b.c similarity index 100% rename from j2735codec/core/202409/src/Node-LLmD-64b.c rename to j2735codec/core/j2735_202409/src/Node-LLmD-64b.c diff --git a/j2735codec/core/202409/src/Node-XY-20b.c b/j2735codec/core/j2735_202409/src/Node-XY-20b.c similarity index 100% rename from j2735codec/core/202409/src/Node-XY-20b.c rename to j2735codec/core/j2735_202409/src/Node-XY-20b.c diff --git a/j2735codec/core/202409/src/Node-XY-22b.c b/j2735codec/core/j2735_202409/src/Node-XY-22b.c similarity index 100% rename from j2735codec/core/202409/src/Node-XY-22b.c rename to j2735codec/core/j2735_202409/src/Node-XY-22b.c diff --git a/j2735codec/core/202409/src/Node-XY-24b.c b/j2735codec/core/j2735_202409/src/Node-XY-24b.c similarity index 100% rename from j2735codec/core/202409/src/Node-XY-24b.c rename to j2735codec/core/j2735_202409/src/Node-XY-24b.c diff --git a/j2735codec/core/202409/src/Node-XY-26b.c b/j2735codec/core/j2735_202409/src/Node-XY-26b.c similarity index 100% rename from j2735codec/core/202409/src/Node-XY-26b.c rename to j2735codec/core/j2735_202409/src/Node-XY-26b.c diff --git a/j2735codec/core/202409/src/Node-XY-28b.c b/j2735codec/core/j2735_202409/src/Node-XY-28b.c similarity index 100% rename from j2735codec/core/202409/src/Node-XY-28b.c rename to j2735codec/core/j2735_202409/src/Node-XY-28b.c diff --git a/j2735codec/core/202409/src/Node-XY-32b.c b/j2735codec/core/j2735_202409/src/Node-XY-32b.c similarity index 100% rename from j2735codec/core/202409/src/Node-XY-32b.c rename to j2735codec/core/j2735_202409/src/Node-XY-32b.c diff --git a/j2735codec/core/202409/src/NodeAttributeLL.c b/j2735codec/core/j2735_202409/src/NodeAttributeLL.c similarity index 100% rename from j2735codec/core/202409/src/NodeAttributeLL.c rename to j2735codec/core/j2735_202409/src/NodeAttributeLL.c diff --git a/j2735codec/core/202409/src/NodeAttributeLLList.c b/j2735codec/core/j2735_202409/src/NodeAttributeLLList.c similarity index 100% rename from j2735codec/core/202409/src/NodeAttributeLLList.c rename to j2735codec/core/j2735_202409/src/NodeAttributeLLList.c diff --git a/j2735codec/core/202409/src/NodeAttributeSetLL.c b/j2735codec/core/j2735_202409/src/NodeAttributeSetLL.c similarity index 100% rename from j2735codec/core/202409/src/NodeAttributeSetLL.c rename to j2735codec/core/j2735_202409/src/NodeAttributeSetLL.c diff --git a/j2735codec/core/202409/src/NodeAttributeSetXY.c b/j2735codec/core/j2735_202409/src/NodeAttributeSetXY.c similarity index 100% rename from j2735codec/core/202409/src/NodeAttributeSetXY.c rename to j2735codec/core/j2735_202409/src/NodeAttributeSetXY.c diff --git a/j2735codec/core/202409/src/NodeAttributeXY.c b/j2735codec/core/j2735_202409/src/NodeAttributeXY.c similarity index 100% rename from j2735codec/core/202409/src/NodeAttributeXY.c rename to j2735codec/core/j2735_202409/src/NodeAttributeXY.c diff --git a/j2735codec/core/202409/src/NodeAttributeXYList.c b/j2735codec/core/j2735_202409/src/NodeAttributeXYList.c similarity index 100% rename from j2735codec/core/202409/src/NodeAttributeXYList.c rename to j2735codec/core/j2735_202409/src/NodeAttributeXYList.c diff --git a/j2735codec/core/202409/src/NodeLL.c b/j2735codec/core/j2735_202409/src/NodeLL.c similarity index 100% rename from j2735codec/core/202409/src/NodeLL.c rename to j2735codec/core/j2735_202409/src/NodeLL.c diff --git a/j2735codec/core/202409/src/NodeListLL.c b/j2735codec/core/j2735_202409/src/NodeListLL.c similarity index 100% rename from j2735codec/core/202409/src/NodeListLL.c rename to j2735codec/core/j2735_202409/src/NodeListLL.c diff --git a/j2735codec/core/202409/src/NodeListXY.c b/j2735codec/core/j2735_202409/src/NodeListXY.c similarity index 100% rename from j2735codec/core/202409/src/NodeListXY.c rename to j2735codec/core/j2735_202409/src/NodeListXY.c diff --git a/j2735codec/core/202409/src/NodeOffsetPointLL.c b/j2735codec/core/j2735_202409/src/NodeOffsetPointLL.c similarity index 100% rename from j2735codec/core/202409/src/NodeOffsetPointLL.c rename to j2735codec/core/j2735_202409/src/NodeOffsetPointLL.c diff --git a/j2735codec/core/202409/src/NodeOffsetPointXY-addGrpB.c b/j2735codec/core/j2735_202409/src/NodeOffsetPointXY-addGrpB.c similarity index 100% rename from j2735codec/core/202409/src/NodeOffsetPointXY-addGrpB.c rename to j2735codec/core/j2735_202409/src/NodeOffsetPointXY-addGrpB.c diff --git a/j2735codec/core/202409/src/NodeOffsetPointXY.c b/j2735codec/core/j2735_202409/src/NodeOffsetPointXY.c similarity index 100% rename from j2735codec/core/202409/src/NodeOffsetPointXY.c rename to j2735codec/core/j2735_202409/src/NodeOffsetPointXY.c diff --git a/j2735codec/core/202409/src/NodePointLLE.c b/j2735codec/core/j2735_202409/src/NodePointLLE.c similarity index 100% rename from j2735codec/core/202409/src/NodePointLLE.c rename to j2735codec/core/j2735_202409/src/NodePointLLE.c diff --git a/j2735codec/core/202409/src/NodeSetLL.c b/j2735codec/core/j2735_202409/src/NodeSetLL.c similarity index 100% rename from j2735codec/core/202409/src/NodeSetLL.c rename to j2735codec/core/j2735_202409/src/NodeSetLL.c diff --git a/j2735codec/core/202409/src/NodeSetXY.c b/j2735codec/core/j2735_202409/src/NodeSetXY.c similarity index 100% rename from j2735codec/core/202409/src/NodeSetXY.c rename to j2735codec/core/j2735_202409/src/NodeSetXY.c diff --git a/j2735codec/core/202409/src/NodeXY.c b/j2735codec/core/j2735_202409/src/NodeXY.c similarity index 100% rename from j2735codec/core/202409/src/NodeXY.c rename to j2735codec/core/j2735_202409/src/NodeXY.c diff --git a/j2735codec/core/202409/src/NtcipAirTemperature.c b/j2735codec/core/j2735_202409/src/NtcipAirTemperature.c similarity index 100% rename from j2735codec/core/202409/src/NtcipAirTemperature.c rename to j2735codec/core/j2735_202409/src/NtcipAirTemperature.c diff --git a/j2735codec/core/202409/src/NtcipAtmosphericPressure.c b/j2735codec/core/j2735_202409/src/NtcipAtmosphericPressure.c similarity index 100% rename from j2735codec/core/202409/src/NtcipAtmosphericPressure.c rename to j2735codec/core/j2735_202409/src/NtcipAtmosphericPressure.c diff --git a/j2735codec/core/202409/src/NtcipCloudSituation.c b/j2735codec/core/j2735_202409/src/NtcipCloudSituation.c similarity index 100% rename from j2735codec/core/202409/src/NtcipCloudSituation.c rename to j2735codec/core/j2735_202409/src/NtcipCloudSituation.c diff --git a/j2735codec/core/202409/src/NtcipDewPoint.c b/j2735codec/core/j2735_202409/src/NtcipDewPoint.c similarity index 100% rename from j2735codec/core/202409/src/NtcipDewPoint.c rename to j2735codec/core/j2735_202409/src/NtcipDewPoint.c diff --git a/j2735codec/core/202409/src/NtcipEssData.c b/j2735codec/core/j2735_202409/src/NtcipEssData.c similarity index 100% rename from j2735codec/core/202409/src/NtcipEssData.c rename to j2735codec/core/j2735_202409/src/NtcipEssData.c diff --git a/j2735codec/core/202409/src/NtcipPavement.c b/j2735codec/core/j2735_202409/src/NtcipPavement.c similarity index 100% rename from j2735codec/core/202409/src/NtcipPavement.c rename to j2735codec/core/j2735_202409/src/NtcipPavement.c diff --git a/j2735codec/core/202409/src/NtcipPavementTreatment.c b/j2735codec/core/j2735_202409/src/NtcipPavementTreatment.c similarity index 100% rename from j2735codec/core/202409/src/NtcipPavementTreatment.c rename to j2735codec/core/j2735_202409/src/NtcipPavementTreatment.c diff --git a/j2735codec/core/202409/src/NtcipPrecipitation.c b/j2735codec/core/j2735_202409/src/NtcipPrecipitation.c similarity index 100% rename from j2735codec/core/202409/src/NtcipPrecipitation.c rename to j2735codec/core/j2735_202409/src/NtcipPrecipitation.c diff --git a/j2735codec/core/202409/src/NtcipRelativeHumidity.c b/j2735codec/core/j2735_202409/src/NtcipRelativeHumidity.c similarity index 100% rename from j2735codec/core/202409/src/NtcipRelativeHumidity.c rename to j2735codec/core/j2735_202409/src/NtcipRelativeHumidity.c diff --git a/j2735codec/core/202409/src/NtcipSolarRadiation.c b/j2735codec/core/j2735_202409/src/NtcipSolarRadiation.c similarity index 100% rename from j2735codec/core/202409/src/NtcipSolarRadiation.c rename to j2735codec/core/j2735_202409/src/NtcipSolarRadiation.c diff --git a/j2735codec/core/202409/src/NtcipVisibility.c b/j2735codec/core/j2735_202409/src/NtcipVisibility.c similarity index 100% rename from j2735codec/core/202409/src/NtcipVisibility.c rename to j2735codec/core/j2735_202409/src/NtcipVisibility.c diff --git a/j2735codec/core/202409/src/NtcipVisibilitySituation.c b/j2735codec/core/j2735_202409/src/NtcipVisibilitySituation.c similarity index 100% rename from j2735codec/core/202409/src/NtcipVisibilitySituation.c rename to j2735codec/core/j2735_202409/src/NtcipVisibilitySituation.c diff --git a/j2735codec/core/202409/src/NtcipWind.c b/j2735codec/core/j2735_202409/src/NtcipWind.c similarity index 100% rename from j2735codec/core/202409/src/NtcipWind.c rename to j2735codec/core/j2735_202409/src/NtcipWind.c diff --git a/j2735codec/core/202409/src/NumberOfAxles.c b/j2735codec/core/j2735_202409/src/NumberOfAxles.c similarity index 100% rename from j2735codec/core/202409/src/NumberOfAxles.c rename to j2735codec/core/j2735_202409/src/NumberOfAxles.c diff --git a/j2735codec/core/202409/src/NumberOfParticipantsInCluster.c b/j2735codec/core/j2735_202409/src/NumberOfParticipantsInCluster.c similarity index 100% rename from j2735codec/core/202409/src/NumberOfParticipantsInCluster.c rename to j2735codec/core/j2735_202409/src/NumberOfParticipantsInCluster.c diff --git a/j2735codec/core/202409/src/OBJECT_IDENTIFIER.c b/j2735codec/core/j2735_202409/src/OBJECT_IDENTIFIER.c similarity index 100% rename from j2735codec/core/202409/src/OBJECT_IDENTIFIER.c rename to j2735codec/core/j2735_202409/src/OBJECT_IDENTIFIER.c diff --git a/j2735codec/core/202409/src/OBJECT_IDENTIFIER_jer.c b/j2735codec/core/j2735_202409/src/OBJECT_IDENTIFIER_jer.c similarity index 100% rename from j2735codec/core/202409/src/OBJECT_IDENTIFIER_jer.c rename to j2735codec/core/j2735_202409/src/OBJECT_IDENTIFIER_jer.c diff --git a/j2735codec/core/202409/src/OBJECT_IDENTIFIER_print.c b/j2735codec/core/j2735_202409/src/OBJECT_IDENTIFIER_print.c similarity index 100% rename from j2735codec/core/202409/src/OBJECT_IDENTIFIER_print.c rename to j2735codec/core/j2735_202409/src/OBJECT_IDENTIFIER_print.c diff --git a/j2735codec/core/202409/src/OBJECT_IDENTIFIER_rfill.c b/j2735codec/core/j2735_202409/src/OBJECT_IDENTIFIER_rfill.c similarity index 100% rename from j2735codec/core/202409/src/OBJECT_IDENTIFIER_rfill.c rename to j2735codec/core/j2735_202409/src/OBJECT_IDENTIFIER_rfill.c diff --git a/j2735codec/core/202409/src/OBJECT_IDENTIFIER_xer.c b/j2735codec/core/j2735_202409/src/OBJECT_IDENTIFIER_xer.c similarity index 100% rename from j2735codec/core/202409/src/OBJECT_IDENTIFIER_xer.c rename to j2735codec/core/j2735_202409/src/OBJECT_IDENTIFIER_xer.c diff --git a/j2735codec/core/202409/src/OCTET_STRING.c b/j2735codec/core/j2735_202409/src/OCTET_STRING.c similarity index 100% rename from j2735codec/core/202409/src/OCTET_STRING.c rename to j2735codec/core/j2735_202409/src/OCTET_STRING.c diff --git a/j2735codec/core/202409/src/OCTET_STRING_aper.c b/j2735codec/core/j2735_202409/src/OCTET_STRING_aper.c similarity index 100% rename from j2735codec/core/202409/src/OCTET_STRING_aper.c rename to j2735codec/core/j2735_202409/src/OCTET_STRING_aper.c diff --git a/j2735codec/core/202409/src/OCTET_STRING_ber.c b/j2735codec/core/j2735_202409/src/OCTET_STRING_ber.c similarity index 100% rename from j2735codec/core/202409/src/OCTET_STRING_ber.c rename to j2735codec/core/j2735_202409/src/OCTET_STRING_ber.c diff --git a/j2735codec/core/202409/src/OCTET_STRING_jer.c b/j2735codec/core/j2735_202409/src/OCTET_STRING_jer.c similarity index 100% rename from j2735codec/core/202409/src/OCTET_STRING_jer.c rename to j2735codec/core/j2735_202409/src/OCTET_STRING_jer.c diff --git a/j2735codec/core/202409/src/OCTET_STRING_oer.c b/j2735codec/core/j2735_202409/src/OCTET_STRING_oer.c similarity index 100% rename from j2735codec/core/202409/src/OCTET_STRING_oer.c rename to j2735codec/core/j2735_202409/src/OCTET_STRING_oer.c diff --git a/j2735codec/core/202409/src/OCTET_STRING_print.c b/j2735codec/core/j2735_202409/src/OCTET_STRING_print.c similarity index 100% rename from j2735codec/core/202409/src/OCTET_STRING_print.c rename to j2735codec/core/j2735_202409/src/OCTET_STRING_print.c diff --git a/j2735codec/core/202409/src/OCTET_STRING_rfill.c b/j2735codec/core/j2735_202409/src/OCTET_STRING_rfill.c similarity index 100% rename from j2735codec/core/202409/src/OCTET_STRING_rfill.c rename to j2735codec/core/j2735_202409/src/OCTET_STRING_rfill.c diff --git a/j2735codec/core/202409/src/OCTET_STRING_uper.c b/j2735codec/core/j2735_202409/src/OCTET_STRING_uper.c similarity index 100% rename from j2735codec/core/202409/src/OCTET_STRING_uper.c rename to j2735codec/core/j2735_202409/src/OCTET_STRING_uper.c diff --git a/j2735codec/core/202409/src/OCTET_STRING_xer.c b/j2735codec/core/j2735_202409/src/OCTET_STRING_xer.c similarity index 100% rename from j2735codec/core/202409/src/OCTET_STRING_xer.c rename to j2735codec/core/j2735_202409/src/OCTET_STRING_xer.c diff --git a/j2735codec/core/202409/src/OPEN_TYPE.c b/j2735codec/core/j2735_202409/src/OPEN_TYPE.c similarity index 100% rename from j2735codec/core/202409/src/OPEN_TYPE.c rename to j2735codec/core/j2735_202409/src/OPEN_TYPE.c diff --git a/j2735codec/core/202409/src/OPEN_TYPE_aper.c b/j2735codec/core/j2735_202409/src/OPEN_TYPE_aper.c similarity index 100% rename from j2735codec/core/202409/src/OPEN_TYPE_aper.c rename to j2735codec/core/j2735_202409/src/OPEN_TYPE_aper.c diff --git a/j2735codec/core/202409/src/OPEN_TYPE_ber.c b/j2735codec/core/j2735_202409/src/OPEN_TYPE_ber.c similarity index 100% rename from j2735codec/core/202409/src/OPEN_TYPE_ber.c rename to j2735codec/core/j2735_202409/src/OPEN_TYPE_ber.c diff --git a/j2735codec/core/202409/src/OPEN_TYPE_jer.c b/j2735codec/core/j2735_202409/src/OPEN_TYPE_jer.c similarity index 100% rename from j2735codec/core/202409/src/OPEN_TYPE_jer.c rename to j2735codec/core/j2735_202409/src/OPEN_TYPE_jer.c diff --git a/j2735codec/core/202409/src/OPEN_TYPE_oer.c b/j2735codec/core/j2735_202409/src/OPEN_TYPE_oer.c similarity index 100% rename from j2735codec/core/202409/src/OPEN_TYPE_oer.c rename to j2735codec/core/j2735_202409/src/OPEN_TYPE_oer.c diff --git a/j2735codec/core/202409/src/OPEN_TYPE_uper.c b/j2735codec/core/j2735_202409/src/OPEN_TYPE_uper.c similarity index 100% rename from j2735codec/core/202409/src/OPEN_TYPE_uper.c rename to j2735codec/core/j2735_202409/src/OPEN_TYPE_uper.c diff --git a/j2735codec/core/202409/src/OPEN_TYPE_xer.c b/j2735codec/core/j2735_202409/src/OPEN_TYPE_xer.c similarity index 100% rename from j2735codec/core/202409/src/OPEN_TYPE_xer.c rename to j2735codec/core/j2735_202409/src/OPEN_TYPE_xer.c diff --git a/j2735codec/core/202409/src/ObeId.c b/j2735codec/core/j2735_202409/src/ObeId.c similarity index 100% rename from j2735codec/core/202409/src/ObeId.c rename to j2735codec/core/j2735_202409/src/ObeId.c diff --git a/j2735codec/core/202409/src/ObjectCount.c b/j2735codec/core/j2735_202409/src/ObjectCount.c similarity index 100% rename from j2735codec/core/202409/src/ObjectCount.c rename to j2735codec/core/j2735_202409/src/ObjectCount.c diff --git a/j2735codec/core/202409/src/ObjectDescriptor.c b/j2735codec/core/j2735_202409/src/ObjectDescriptor.c similarity index 100% rename from j2735codec/core/202409/src/ObjectDescriptor.c rename to j2735codec/core/j2735_202409/src/ObjectDescriptor.c diff --git a/j2735codec/core/202409/src/ObjectID.c b/j2735codec/core/j2735_202409/src/ObjectID.c similarity index 100% rename from j2735codec/core/202409/src/ObjectID.c rename to j2735codec/core/j2735_202409/src/ObjectID.c diff --git a/j2735codec/core/202409/src/ObjectType.c b/j2735codec/core/j2735_202409/src/ObjectType.c similarity index 100% rename from j2735codec/core/202409/src/ObjectType.c rename to j2735codec/core/j2735_202409/src/ObjectType.c diff --git a/j2735codec/core/202409/src/Objects.c b/j2735codec/core/j2735_202409/src/Objects.c similarity index 100% rename from j2735codec/core/202409/src/Objects.c rename to j2735codec/core/j2735_202409/src/Objects.c diff --git a/j2735codec/core/202409/src/ObstacleDetection.c b/j2735codec/core/j2735_202409/src/ObstacleDetection.c similarity index 100% rename from j2735codec/core/202409/src/ObstacleDetection.c rename to j2735codec/core/j2735_202409/src/ObstacleDetection.c diff --git a/j2735codec/core/202409/src/ObstacleDirection.c b/j2735codec/core/j2735_202409/src/ObstacleDirection.c similarity index 100% rename from j2735codec/core/202409/src/ObstacleDirection.c rename to j2735codec/core/j2735_202409/src/ObstacleDirection.c diff --git a/j2735codec/core/202409/src/ObstacleDistance.c b/j2735codec/core/j2735_202409/src/ObstacleDistance.c similarity index 100% rename from j2735codec/core/202409/src/ObstacleDistance.c rename to j2735codec/core/j2735_202409/src/ObstacleDistance.c diff --git a/j2735codec/core/202409/src/ObstacleSize.c b/j2735codec/core/j2735_202409/src/ObstacleSize.c similarity index 100% rename from j2735codec/core/202409/src/ObstacleSize.c rename to j2735codec/core/j2735_202409/src/ObstacleSize.c diff --git a/j2735codec/core/202409/src/ObstacleSizeConfidence.c b/j2735codec/core/j2735_202409/src/ObstacleSizeConfidence.c similarity index 100% rename from j2735codec/core/202409/src/ObstacleSizeConfidence.c rename to j2735codec/core/j2735_202409/src/ObstacleSizeConfidence.c diff --git a/j2735codec/core/202409/src/Obstruction.c b/j2735codec/core/j2735_202409/src/Obstruction.c similarity index 100% rename from j2735codec/core/202409/src/Obstruction.c rename to j2735codec/core/j2735_202409/src/Obstruction.c diff --git a/j2735codec/core/202409/src/Obstructions.c b/j2735codec/core/j2735_202409/src/Obstructions.c similarity index 100% rename from j2735codec/core/202409/src/Obstructions.c rename to j2735codec/core/j2735_202409/src/Obstructions.c diff --git a/j2735codec/core/202409/src/Offset-B09.c b/j2735codec/core/j2735_202409/src/Offset-B09.c similarity index 100% rename from j2735codec/core/202409/src/Offset-B09.c rename to j2735codec/core/j2735_202409/src/Offset-B09.c diff --git a/j2735codec/core/202409/src/Offset-B10.c b/j2735codec/core/j2735_202409/src/Offset-B10.c similarity index 100% rename from j2735codec/core/202409/src/Offset-B10.c rename to j2735codec/core/j2735_202409/src/Offset-B10.c diff --git a/j2735codec/core/202409/src/Offset-B11.c b/j2735codec/core/j2735_202409/src/Offset-B11.c similarity index 100% rename from j2735codec/core/202409/src/Offset-B11.c rename to j2735codec/core/j2735_202409/src/Offset-B11.c diff --git a/j2735codec/core/202409/src/Offset-B12.c b/j2735codec/core/j2735_202409/src/Offset-B12.c similarity index 100% rename from j2735codec/core/202409/src/Offset-B12.c rename to j2735codec/core/j2735_202409/src/Offset-B12.c diff --git a/j2735codec/core/202409/src/Offset-B13.c b/j2735codec/core/j2735_202409/src/Offset-B13.c similarity index 100% rename from j2735codec/core/202409/src/Offset-B13.c rename to j2735codec/core/j2735_202409/src/Offset-B13.c diff --git a/j2735codec/core/202409/src/Offset-B14.c b/j2735codec/core/j2735_202409/src/Offset-B14.c similarity index 100% rename from j2735codec/core/202409/src/Offset-B14.c rename to j2735codec/core/j2735_202409/src/Offset-B14.c diff --git a/j2735codec/core/202409/src/Offset-B16.c b/j2735codec/core/j2735_202409/src/Offset-B16.c similarity index 100% rename from j2735codec/core/202409/src/Offset-B16.c rename to j2735codec/core/j2735_202409/src/Offset-B16.c diff --git a/j2735codec/core/202409/src/Offset3D.c b/j2735codec/core/j2735_202409/src/Offset3D.c similarity index 100% rename from j2735codec/core/202409/src/Offset3D.c rename to j2735codec/core/j2735_202409/src/Offset3D.c diff --git a/j2735codec/core/202409/src/OffsetLL-B12.c b/j2735codec/core/j2735_202409/src/OffsetLL-B12.c similarity index 100% rename from j2735codec/core/202409/src/OffsetLL-B12.c rename to j2735codec/core/j2735_202409/src/OffsetLL-B12.c diff --git a/j2735codec/core/202409/src/OffsetLL-B14.c b/j2735codec/core/j2735_202409/src/OffsetLL-B14.c similarity index 100% rename from j2735codec/core/202409/src/OffsetLL-B14.c rename to j2735codec/core/j2735_202409/src/OffsetLL-B14.c diff --git a/j2735codec/core/202409/src/OffsetLL-B16.c b/j2735codec/core/j2735_202409/src/OffsetLL-B16.c similarity index 100% rename from j2735codec/core/202409/src/OffsetLL-B16.c rename to j2735codec/core/j2735_202409/src/OffsetLL-B16.c diff --git a/j2735codec/core/202409/src/OffsetLL-B18.c b/j2735codec/core/j2735_202409/src/OffsetLL-B18.c similarity index 100% rename from j2735codec/core/202409/src/OffsetLL-B18.c rename to j2735codec/core/j2735_202409/src/OffsetLL-B18.c diff --git a/j2735codec/core/202409/src/OffsetLL-B22.c b/j2735codec/core/j2735_202409/src/OffsetLL-B22.c similarity index 100% rename from j2735codec/core/202409/src/OffsetLL-B22.c rename to j2735codec/core/j2735_202409/src/OffsetLL-B22.c diff --git a/j2735codec/core/202409/src/OffsetLL-B24.c b/j2735codec/core/j2735_202409/src/OffsetLL-B24.c similarity index 100% rename from j2735codec/core/202409/src/OffsetLL-B24.c rename to j2735codec/core/j2735_202409/src/OffsetLL-B24.c diff --git a/j2735codec/core/202409/src/OffsetSystem.c b/j2735codec/core/j2735_202409/src/OffsetSystem.c similarity index 100% rename from j2735codec/core/202409/src/OffsetSystem.c rename to j2735codec/core/j2735_202409/src/OffsetSystem.c diff --git a/j2735codec/core/202409/src/OperatorDefined.c b/j2735codec/core/j2735_202409/src/OperatorDefined.c similarity index 100% rename from j2735codec/core/202409/src/OperatorDefined.c rename to j2735codec/core/j2735_202409/src/OperatorDefined.c diff --git a/j2735codec/core/202409/src/OverlayLaneList.c b/j2735codec/core/j2735_202409/src/OverlayLaneList.c similarity index 100% rename from j2735codec/core/202409/src/OverlayLaneList.c rename to j2735codec/core/j2735_202409/src/OverlayLaneList.c diff --git a/j2735codec/core/202409/src/Parked.c b/j2735codec/core/j2735_202409/src/Parked.c similarity index 100% rename from j2735codec/core/202409/src/Parked.c rename to j2735codec/core/j2735_202409/src/Parked.c diff --git a/j2735codec/core/202409/src/ParkingInformation.c b/j2735codec/core/j2735_202409/src/ParkingInformation.c similarity index 100% rename from j2735codec/core/202409/src/ParkingInformation.c rename to j2735codec/core/j2735_202409/src/ParkingInformation.c diff --git a/j2735codec/core/202409/src/PartIIcontent.c b/j2735codec/core/j2735_202409/src/PartIIcontent.c similarity index 100% rename from j2735codec/core/202409/src/PartIIcontent.c rename to j2735codec/core/j2735_202409/src/PartIIcontent.c diff --git a/j2735codec/core/202409/src/Particulate.c b/j2735codec/core/j2735_202409/src/Particulate.c similarity index 100% rename from j2735codec/core/202409/src/Particulate.c rename to j2735codec/core/j2735_202409/src/Particulate.c diff --git a/j2735codec/core/202409/src/PassengerCapacity.c b/j2735codec/core/j2735_202409/src/PassengerCapacity.c similarity index 100% rename from j2735codec/core/202409/src/PassengerCapacity.c rename to j2735codec/core/j2735_202409/src/PassengerCapacity.c diff --git a/j2735codec/core/202409/src/Path.c b/j2735codec/core/j2735_202409/src/Path.c similarity index 100% rename from j2735codec/core/202409/src/Path.c rename to j2735codec/core/j2735_202409/src/Path.c diff --git a/j2735codec/core/202409/src/PathHistory.c b/j2735codec/core/j2735_202409/src/PathHistory.c similarity index 100% rename from j2735codec/core/202409/src/PathHistory.c rename to j2735codec/core/j2735_202409/src/PathHistory.c diff --git a/j2735codec/core/202409/src/PathHistoryPoint.c b/j2735codec/core/j2735_202409/src/PathHistoryPoint.c similarity index 100% rename from j2735codec/core/202409/src/PathHistoryPoint.c rename to j2735codec/core/j2735_202409/src/PathHistoryPoint.c diff --git a/j2735codec/core/202409/src/PathHistoryPointList.c b/j2735codec/core/j2735_202409/src/PathHistoryPointList.c similarity index 100% rename from j2735codec/core/202409/src/PathHistoryPointList.c rename to j2735codec/core/j2735_202409/src/PathHistoryPointList.c diff --git a/j2735codec/core/202409/src/PathList.c b/j2735codec/core/j2735_202409/src/PathList.c similarity index 100% rename from j2735codec/core/202409/src/PathList.c rename to j2735codec/core/j2735_202409/src/PathList.c diff --git a/j2735codec/core/202409/src/PathPoints.c b/j2735codec/core/j2735_202409/src/PathPoints.c similarity index 100% rename from j2735codec/core/202409/src/PathPoints.c rename to j2735codec/core/j2735_202409/src/PathPoints.c diff --git a/j2735codec/core/202409/src/PathPrediction.c b/j2735codec/core/j2735_202409/src/PathPrediction.c similarity index 100% rename from j2735codec/core/202409/src/PathPrediction.c rename to j2735codec/core/j2735_202409/src/PathPrediction.c diff --git a/j2735codec/core/202409/src/PavementConditions.c b/j2735codec/core/j2735_202409/src/PavementConditions.c similarity index 100% rename from j2735codec/core/202409/src/PavementConditions.c rename to j2735codec/core/j2735_202409/src/PavementConditions.c diff --git a/j2735codec/core/202409/src/PayUnit.c b/j2735codec/core/j2735_202409/src/PayUnit.c similarity index 100% rename from j2735codec/core/202409/src/PayUnit.c rename to j2735codec/core/j2735_202409/src/PayUnit.c diff --git a/j2735codec/core/202409/src/PayloadData.c b/j2735codec/core/j2735_202409/src/PayloadData.c similarity index 100% rename from j2735codec/core/202409/src/PayloadData.c rename to j2735codec/core/j2735_202409/src/PayloadData.c diff --git a/j2735codec/core/202409/src/PaymentFee.c b/j2735codec/core/j2735_202409/src/PaymentFee.c similarity index 100% rename from j2735codec/core/202409/src/PaymentFee.c rename to j2735codec/core/j2735_202409/src/PaymentFee.c diff --git a/j2735codec/core/202409/src/PaymentMeans.c b/j2735codec/core/j2735_202409/src/PaymentMeans.c similarity index 100% rename from j2735codec/core/202409/src/PaymentMeans.c rename to j2735codec/core/j2735_202409/src/PaymentMeans.c diff --git a/j2735codec/core/202409/src/PaymentMeansBalance.c b/j2735codec/core/j2735_202409/src/PaymentMeansBalance.c similarity index 100% rename from j2735codec/core/202409/src/PaymentMeansBalance.c rename to j2735codec/core/j2735_202409/src/PaymentMeansBalance.c diff --git a/j2735codec/core/202409/src/PaymentSecurityData.c b/j2735codec/core/j2735_202409/src/PaymentSecurityData.c similarity index 100% rename from j2735codec/core/202409/src/PaymentSecurityData.c rename to j2735codec/core/j2735_202409/src/PaymentSecurityData.c diff --git a/j2735codec/core/202409/src/PedestrianBicycleDetect.c b/j2735codec/core/j2735_202409/src/PedestrianBicycleDetect.c similarity index 100% rename from j2735codec/core/202409/src/PedestrianBicycleDetect.c rename to j2735codec/core/j2735_202409/src/PedestrianBicycleDetect.c diff --git a/j2735codec/core/202409/src/PedestrianCall.c b/j2735codec/core/j2735_202409/src/PedestrianCall.c similarity index 100% rename from j2735codec/core/202409/src/PedestrianCall.c rename to j2735codec/core/j2735_202409/src/PedestrianCall.c diff --git a/j2735codec/core/202409/src/PerAxleWeightCharges.c b/j2735codec/core/j2735_202409/src/PerAxleWeightCharges.c similarity index 100% rename from j2735codec/core/202409/src/PerAxleWeightCharges.c rename to j2735codec/core/j2735_202409/src/PerAxleWeightCharges.c diff --git a/j2735codec/core/202409/src/Period.c b/j2735codec/core/j2735_202409/src/Period.c similarity index 100% rename from j2735codec/core/202409/src/Period.c rename to j2735codec/core/j2735_202409/src/Period.c diff --git a/j2735codec/core/202409/src/PermissiveNonProtected.c b/j2735codec/core/j2735_202409/src/PermissiveNonProtected.c similarity index 100% rename from j2735codec/core/202409/src/PermissiveNonProtected.c rename to j2735codec/core/j2735_202409/src/PermissiveNonProtected.c diff --git a/j2735codec/core/202409/src/PersonalAccountNumber.c b/j2735codec/core/j2735_202409/src/PersonalAccountNumber.c similarity index 100% rename from j2735codec/core/202409/src/PersonalAccountNumber.c rename to j2735codec/core/j2735_202409/src/PersonalAccountNumber.c diff --git a/j2735codec/core/202409/src/PersonalAssistive.c b/j2735codec/core/j2735_202409/src/PersonalAssistive.c similarity index 100% rename from j2735codec/core/202409/src/PersonalAssistive.c rename to j2735codec/core/j2735_202409/src/PersonalAssistive.c diff --git a/j2735codec/core/202409/src/PersonalClusterRadius.c b/j2735codec/core/j2735_202409/src/PersonalClusterRadius.c similarity index 100% rename from j2735codec/core/202409/src/PersonalClusterRadius.c rename to j2735codec/core/j2735_202409/src/PersonalClusterRadius.c diff --git a/j2735codec/core/202409/src/PersonalCrossingInProgress.c b/j2735codec/core/j2735_202409/src/PersonalCrossingInProgress.c similarity index 100% rename from j2735codec/core/202409/src/PersonalCrossingInProgress.c rename to j2735codec/core/j2735_202409/src/PersonalCrossingInProgress.c diff --git a/j2735codec/core/202409/src/PersonalCrossingRequest.c b/j2735codec/core/j2735_202409/src/PersonalCrossingRequest.c similarity index 100% rename from j2735codec/core/202409/src/PersonalCrossingRequest.c rename to j2735codec/core/j2735_202409/src/PersonalCrossingRequest.c diff --git a/j2735codec/core/202409/src/PersonalDeviceUsageState.c b/j2735codec/core/j2735_202409/src/PersonalDeviceUsageState.c similarity index 100% rename from j2735codec/core/202409/src/PersonalDeviceUsageState.c rename to j2735codec/core/j2735_202409/src/PersonalDeviceUsageState.c diff --git a/j2735codec/core/202409/src/PersonalDeviceUserType.c b/j2735codec/core/j2735_202409/src/PersonalDeviceUserType.c similarity index 100% rename from j2735codec/core/202409/src/PersonalDeviceUserType.c rename to j2735codec/core/j2735_202409/src/PersonalDeviceUserType.c diff --git a/j2735codec/core/202409/src/PersonalSafetyMessage.c b/j2735codec/core/j2735_202409/src/PersonalSafetyMessage.c similarity index 100% rename from j2735codec/core/202409/src/PersonalSafetyMessage.c rename to j2735codec/core/j2735_202409/src/PersonalSafetyMessage.c diff --git a/j2735codec/core/202409/src/PersonalSafetyMessage2.c b/j2735codec/core/j2735_202409/src/PersonalSafetyMessage2.c similarity index 100% rename from j2735codec/core/202409/src/PersonalSafetyMessage2.c rename to j2735codec/core/j2735_202409/src/PersonalSafetyMessage2.c diff --git a/j2735codec/core/202409/src/Pitch.c b/j2735codec/core/j2735_202409/src/Pitch.c similarity index 100% rename from j2735codec/core/202409/src/Pitch.c rename to j2735codec/core/j2735_202409/src/Pitch.c diff --git a/j2735codec/core/202409/src/PitchDetected.c b/j2735codec/core/j2735_202409/src/PitchDetected.c similarity index 100% rename from j2735codec/core/202409/src/PitchDetected.c rename to j2735codec/core/j2735_202409/src/PitchDetected.c diff --git a/j2735codec/core/202409/src/PitchRateConfidence.c b/j2735codec/core/j2735_202409/src/PitchRateConfidence.c similarity index 100% rename from j2735codec/core/202409/src/PitchRateConfidence.c rename to j2735codec/core/j2735_202409/src/PitchRateConfidence.c diff --git a/j2735codec/core/202409/src/PivotPointDescription.c b/j2735codec/core/j2735_202409/src/PivotPointDescription.c similarity index 100% rename from j2735codec/core/202409/src/PivotPointDescription.c rename to j2735codec/core/j2735_202409/src/PivotPointDescription.c diff --git a/j2735codec/core/202409/src/PivotingAllowed.c b/j2735codec/core/j2735_202409/src/PivotingAllowed.c similarity index 100% rename from j2735codec/core/202409/src/PivotingAllowed.c rename to j2735codec/core/j2735_202409/src/PivotingAllowed.c diff --git a/j2735codec/core/202409/src/Point.c b/j2735codec/core/j2735_202409/src/Point.c similarity index 100% rename from j2735codec/core/202409/src/Point.c rename to j2735codec/core/j2735_202409/src/Point.c diff --git a/j2735codec/core/202409/src/PortlandCement.c b/j2735codec/core/j2735_202409/src/PortlandCement.c similarity index 100% rename from j2735codec/core/202409/src/PortlandCement.c rename to j2735codec/core/j2735_202409/src/PortlandCement.c diff --git a/j2735codec/core/202409/src/PortlandCementType.c b/j2735codec/core/j2735_202409/src/PortlandCementType.c similarity index 100% rename from j2735codec/core/202409/src/PortlandCementType.c rename to j2735codec/core/j2735_202409/src/PortlandCementType.c diff --git a/j2735codec/core/202409/src/Position3D-addGrpB.c b/j2735codec/core/j2735_202409/src/Position3D-addGrpB.c similarity index 100% rename from j2735codec/core/202409/src/Position3D-addGrpB.c rename to j2735codec/core/j2735_202409/src/Position3D-addGrpB.c diff --git a/j2735codec/core/202409/src/Position3D-addGrpC.c b/j2735codec/core/j2735_202409/src/Position3D-addGrpC.c similarity index 100% rename from j2735codec/core/202409/src/Position3D-addGrpC.c rename to j2735codec/core/j2735_202409/src/Position3D-addGrpC.c diff --git a/j2735codec/core/202409/src/Position3D.c b/j2735codec/core/j2735_202409/src/Position3D.c similarity index 100% rename from j2735codec/core/202409/src/Position3D.c rename to j2735codec/core/j2735_202409/src/Position3D.c diff --git a/j2735codec/core/202409/src/PositionConfidence.c b/j2735codec/core/j2735_202409/src/PositionConfidence.c similarity index 100% rename from j2735codec/core/202409/src/PositionConfidence.c rename to j2735codec/core/j2735_202409/src/PositionConfidence.c diff --git a/j2735codec/core/202409/src/PositionConfidenceSet.c b/j2735codec/core/j2735_202409/src/PositionConfidenceSet.c similarity index 100% rename from j2735codec/core/202409/src/PositionConfidenceSet.c rename to j2735codec/core/j2735_202409/src/PositionConfidenceSet.c diff --git a/j2735codec/core/202409/src/PositionalAccuracy.c b/j2735codec/core/j2735_202409/src/PositionalAccuracy.c similarity index 100% rename from j2735codec/core/202409/src/PositionalAccuracy.c rename to j2735codec/core/j2735_202409/src/PositionalAccuracy.c diff --git a/j2735codec/core/202409/src/Precipitation.c b/j2735codec/core/j2735_202409/src/Precipitation.c similarity index 100% rename from j2735codec/core/202409/src/Precipitation.c rename to j2735codec/core/j2735_202409/src/Precipitation.c diff --git a/j2735codec/core/202409/src/PreemptPriorityList.c b/j2735codec/core/j2735_202409/src/PreemptPriorityList.c similarity index 100% rename from j2735codec/core/202409/src/PreemptPriorityList.c rename to j2735codec/core/j2735_202409/src/PreemptPriorityList.c diff --git a/j2735codec/core/202409/src/PrimaryRegionChargingInfo.c b/j2735codec/core/j2735_202409/src/PrimaryRegionChargingInfo.c similarity index 100% rename from j2735codec/core/202409/src/PrimaryRegionChargingInfo.c rename to j2735codec/core/j2735_202409/src/PrimaryRegionChargingInfo.c diff --git a/j2735codec/core/202409/src/PrimaryRegionState.c b/j2735codec/core/j2735_202409/src/PrimaryRegionState.c similarity index 100% rename from j2735codec/core/202409/src/PrimaryRegionState.c rename to j2735codec/core/j2735_202409/src/PrimaryRegionState.c diff --git a/j2735codec/core/202409/src/PrioritizationResponse.c b/j2735codec/core/j2735_202409/src/PrioritizationResponse.c similarity index 100% rename from j2735codec/core/202409/src/PrioritizationResponse.c rename to j2735codec/core/j2735_202409/src/PrioritizationResponse.c diff --git a/j2735codec/core/202409/src/PrioritizationResponseList.c b/j2735codec/core/j2735_202409/src/PrioritizationResponseList.c similarity index 100% rename from j2735codec/core/202409/src/PrioritizationResponseList.c rename to j2735codec/core/j2735_202409/src/PrioritizationResponseList.c diff --git a/j2735codec/core/202409/src/PrioritizationResponseStatus.c b/j2735codec/core/j2735_202409/src/PrioritizationResponseStatus.c similarity index 100% rename from j2735codec/core/202409/src/PrioritizationResponseStatus.c rename to j2735codec/core/j2735_202409/src/PrioritizationResponseStatus.c diff --git a/j2735codec/core/202409/src/Priority.c b/j2735codec/core/j2735_202409/src/Priority.c similarity index 100% rename from j2735codec/core/202409/src/Priority.c rename to j2735codec/core/j2735_202409/src/Priority.c diff --git a/j2735codec/core/202409/src/PriorityRequestType.c b/j2735codec/core/j2735_202409/src/PriorityRequestType.c similarity index 100% rename from j2735codec/core/202409/src/PriorityRequestType.c rename to j2735codec/core/j2735_202409/src/PriorityRequestType.c diff --git a/j2735codec/core/202409/src/PrivilegedEventFlags.c b/j2735codec/core/j2735_202409/src/PrivilegedEventFlags.c similarity index 100% rename from j2735codec/core/202409/src/PrivilegedEventFlags.c rename to j2735codec/core/j2735_202409/src/PrivilegedEventFlags.c diff --git a/j2735codec/core/202409/src/PrivilegedEvents.c b/j2735codec/core/j2735_202409/src/PrivilegedEvents.c similarity index 100% rename from j2735codec/core/202409/src/PrivilegedEvents.c rename to j2735codec/core/j2735_202409/src/PrivilegedEvents.c diff --git a/j2735codec/core/202409/src/ProbeDataConfig.c b/j2735codec/core/j2735_202409/src/ProbeDataConfig.c similarity index 100% rename from j2735codec/core/202409/src/ProbeDataConfig.c rename to j2735codec/core/j2735_202409/src/ProbeDataConfig.c diff --git a/j2735codec/core/202409/src/ProbeDataConfigMessage.c b/j2735codec/core/j2735_202409/src/ProbeDataConfigMessage.c similarity index 100% rename from j2735codec/core/202409/src/ProbeDataConfigMessage.c rename to j2735codec/core/j2735_202409/src/ProbeDataConfigMessage.c diff --git a/j2735codec/core/202409/src/ProbeDataManagement.c b/j2735codec/core/j2735_202409/src/ProbeDataManagement.c similarity index 100% rename from j2735codec/core/202409/src/ProbeDataManagement.c rename to j2735codec/core/j2735_202409/src/ProbeDataManagement.c diff --git a/j2735codec/core/202409/src/ProbeDataReportMessage.c b/j2735codec/core/j2735_202409/src/ProbeDataReportMessage.c similarity index 100% rename from j2735codec/core/202409/src/ProbeDataReportMessage.c rename to j2735codec/core/j2735_202409/src/ProbeDataReportMessage.c diff --git a/j2735codec/core/202409/src/ProbeDataReport_MeanVariation.c b/j2735codec/core/j2735_202409/src/ProbeDataReport_MeanVariation.c similarity index 100% rename from j2735codec/core/202409/src/ProbeDataReport_MeanVariation.c rename to j2735codec/core/j2735_202409/src/ProbeDataReport_MeanVariation.c diff --git a/j2735codec/core/202409/src/ProbeSegmentNumber.c b/j2735codec/core/j2735_202409/src/ProbeSegmentNumber.c similarity index 100% rename from j2735codec/core/202409/src/ProbeSegmentNumber.c rename to j2735codec/core/j2735_202409/src/ProbeSegmentNumber.c diff --git a/j2735codec/core/202409/src/ProbeVehicleData.c b/j2735codec/core/j2735_202409/src/ProbeVehicleData.c similarity index 100% rename from j2735codec/core/202409/src/ProbeVehicleData.c rename to j2735codec/core/j2735_202409/src/ProbeVehicleData.c diff --git a/j2735codec/core/202409/src/PropelledInformation.c b/j2735codec/core/j2735_202409/src/PropelledInformation.c similarity index 100% rename from j2735codec/core/202409/src/PropelledInformation.c rename to j2735codec/core/j2735_202409/src/PropelledInformation.c diff --git a/j2735codec/core/202409/src/Provider.c b/j2735codec/core/j2735_202409/src/Provider.c similarity index 100% rename from j2735codec/core/202409/src/Provider.c rename to j2735codec/core/j2735_202409/src/Provider.c diff --git a/j2735codec/core/202409/src/PublicSafetyAndRoadWorkerActivity.c b/j2735codec/core/j2735_202409/src/PublicSafetyAndRoadWorkerActivity.c similarity index 100% rename from j2735codec/core/202409/src/PublicSafetyAndRoadWorkerActivity.c rename to j2735codec/core/j2735_202409/src/PublicSafetyAndRoadWorkerActivity.c diff --git a/j2735codec/core/202409/src/PublicSafetyDirectingTrafficSubType.c b/j2735codec/core/j2735_202409/src/PublicSafetyDirectingTrafficSubType.c similarity index 100% rename from j2735codec/core/202409/src/PublicSafetyDirectingTrafficSubType.c rename to j2735codec/core/j2735_202409/src/PublicSafetyDirectingTrafficSubType.c diff --git a/j2735codec/core/202409/src/PublicSafetyEventResponderWorkerType.c b/j2735codec/core/j2735_202409/src/PublicSafetyEventResponderWorkerType.c similarity index 100% rename from j2735codec/core/202409/src/PublicSafetyEventResponderWorkerType.c rename to j2735codec/core/j2735_202409/src/PublicSafetyEventResponderWorkerType.c diff --git a/j2735codec/core/202409/src/PurseBalance.c b/j2735codec/core/j2735_202409/src/PurseBalance.c similarity index 100% rename from j2735codec/core/202409/src/PurseBalance.c rename to j2735codec/core/j2735_202409/src/PurseBalance.c diff --git a/j2735codec/core/202409/src/Qualifiers.c b/j2735codec/core/j2735_202409/src/Qualifiers.c similarity index 100% rename from j2735codec/core/202409/src/Qualifiers.c rename to j2735codec/core/j2735_202409/src/Qualifiers.c diff --git a/j2735codec/core/202409/src/RELATIVE-OID.c b/j2735codec/core/j2735_202409/src/RELATIVE-OID.c similarity index 100% rename from j2735codec/core/202409/src/RELATIVE-OID.c rename to j2735codec/core/j2735_202409/src/RELATIVE-OID.c diff --git a/j2735codec/core/202409/src/RELATIVE-OID_jer.c b/j2735codec/core/j2735_202409/src/RELATIVE-OID_jer.c similarity index 100% rename from j2735codec/core/202409/src/RELATIVE-OID_jer.c rename to j2735codec/core/j2735_202409/src/RELATIVE-OID_jer.c diff --git a/j2735codec/core/202409/src/RELATIVE-OID_print.c b/j2735codec/core/j2735_202409/src/RELATIVE-OID_print.c similarity index 100% rename from j2735codec/core/202409/src/RELATIVE-OID_print.c rename to j2735codec/core/j2735_202409/src/RELATIVE-OID_print.c diff --git a/j2735codec/core/202409/src/RELATIVE-OID_rfill.c b/j2735codec/core/j2735_202409/src/RELATIVE-OID_rfill.c similarity index 100% rename from j2735codec/core/202409/src/RELATIVE-OID_rfill.c rename to j2735codec/core/j2735_202409/src/RELATIVE-OID_rfill.c diff --git a/j2735codec/core/202409/src/RELATIVE-OID_xer.c b/j2735codec/core/j2735_202409/src/RELATIVE-OID_xer.c similarity index 100% rename from j2735codec/core/202409/src/RELATIVE-OID_xer.c rename to j2735codec/core/j2735_202409/src/RELATIVE-OID_xer.c diff --git a/j2735codec/core/202409/src/RSMLanePosition.c b/j2735codec/core/j2735_202409/src/RSMLanePosition.c similarity index 100% rename from j2735codec/core/202409/src/RSMLanePosition.c rename to j2735codec/core/j2735_202409/src/RSMLanePosition.c diff --git a/j2735codec/core/202409/src/RSMPolygon.c b/j2735codec/core/j2735_202409/src/RSMPolygon.c similarity index 100% rename from j2735codec/core/202409/src/RSMPolygon.c rename to j2735codec/core/j2735_202409/src/RSMPolygon.c diff --git a/j2735codec/core/202409/src/RTCM-Revision.c b/j2735codec/core/j2735_202409/src/RTCM-Revision.c similarity index 100% rename from j2735codec/core/202409/src/RTCM-Revision.c rename to j2735codec/core/j2735_202409/src/RTCM-Revision.c diff --git a/j2735codec/core/202409/src/RTCMPackage.c b/j2735codec/core/j2735_202409/src/RTCMPackage.c similarity index 100% rename from j2735codec/core/202409/src/RTCMPackage.c rename to j2735codec/core/j2735_202409/src/RTCMPackage.c diff --git a/j2735codec/core/202409/src/RTCMcorrections.c b/j2735codec/core/j2735_202409/src/RTCMcorrections.c similarity index 100% rename from j2735codec/core/202409/src/RTCMcorrections.c rename to j2735codec/core/j2735_202409/src/RTCMcorrections.c diff --git a/j2735codec/core/202409/src/RTCMheader.c b/j2735codec/core/j2735_202409/src/RTCMheader.c similarity index 100% rename from j2735codec/core/202409/src/RTCMheader.c rename to j2735codec/core/j2735_202409/src/RTCMheader.c diff --git a/j2735codec/core/202409/src/RTCMmessage.c b/j2735codec/core/j2735_202409/src/RTCMmessage.c similarity index 100% rename from j2735codec/core/202409/src/RTCMmessage.c rename to j2735codec/core/j2735_202409/src/RTCMmessage.c diff --git a/j2735codec/core/202409/src/RTCMmessageList.c b/j2735codec/core/j2735_202409/src/RTCMmessageList.c similarity index 100% rename from j2735codec/core/202409/src/RTCMmessageList.c rename to j2735codec/core/j2735_202409/src/RTCMmessageList.c diff --git a/j2735codec/core/202409/src/Radius-B12.c b/j2735codec/core/j2735_202409/src/Radius-B12.c similarity index 100% rename from j2735codec/core/202409/src/Radius-B12.c rename to j2735codec/core/j2735_202409/src/Radius-B12.c diff --git a/j2735codec/core/202409/src/Radius.c b/j2735codec/core/j2735_202409/src/Radius.c similarity index 100% rename from j2735codec/core/202409/src/Radius.c rename to j2735codec/core/j2735_202409/src/Radius.c diff --git a/j2735codec/core/202409/src/RadiusOfCurvature.c b/j2735codec/core/j2735_202409/src/RadiusOfCurvature.c similarity index 100% rename from j2735codec/core/202409/src/RadiusOfCurvature.c rename to j2735codec/core/j2735_202409/src/RadiusOfCurvature.c diff --git a/j2735codec/core/202409/src/RainSensor.c b/j2735codec/core/j2735_202409/src/RainSensor.c similarity index 100% rename from j2735codec/core/202409/src/RainSensor.c rename to j2735codec/core/j2735_202409/src/RainSensor.c diff --git a/j2735codec/core/202409/src/ReasonCode.c b/j2735codec/core/j2735_202409/src/ReasonCode.c similarity index 100% rename from j2735codec/core/202409/src/ReasonCode.c rename to j2735codec/core/j2735_202409/src/ReasonCode.c diff --git a/j2735codec/core/202409/src/ReceiptAuthenticator.c b/j2735codec/core/j2735_202409/src/ReceiptAuthenticator.c similarity index 100% rename from j2735codec/core/202409/src/ReceiptAuthenticator.c rename to j2735codec/core/j2735_202409/src/ReceiptAuthenticator.c diff --git a/j2735codec/core/202409/src/ReceiptContract.c b/j2735codec/core/j2735_202409/src/ReceiptContract.c similarity index 100% rename from j2735codec/core/202409/src/ReceiptContract.c rename to j2735codec/core/j2735_202409/src/ReceiptContract.c diff --git a/j2735codec/core/202409/src/ReceiptData.c b/j2735codec/core/j2735_202409/src/ReceiptData.c similarity index 100% rename from j2735codec/core/202409/src/ReceiptData.c rename to j2735codec/core/j2735_202409/src/ReceiptData.c diff --git a/j2735codec/core/202409/src/ReceiptDistance.c b/j2735codec/core/j2735_202409/src/ReceiptDistance.c similarity index 100% rename from j2735codec/core/202409/src/ReceiptDistance.c rename to j2735codec/core/j2735_202409/src/ReceiptDistance.c diff --git a/j2735codec/core/202409/src/ReceiptFinancialPart.c b/j2735codec/core/j2735_202409/src/ReceiptFinancialPart.c similarity index 100% rename from j2735codec/core/202409/src/ReceiptFinancialPart.c rename to j2735codec/core/j2735_202409/src/ReceiptFinancialPart.c diff --git a/j2735codec/core/202409/src/ReceiptIccId.c b/j2735codec/core/j2735_202409/src/ReceiptIccId.c similarity index 100% rename from j2735codec/core/202409/src/ReceiptIccId.c rename to j2735codec/core/j2735_202409/src/ReceiptIccId.c diff --git a/j2735codec/core/202409/src/ReceiptObuId.c b/j2735codec/core/j2735_202409/src/ReceiptObuId.c similarity index 100% rename from j2735codec/core/202409/src/ReceiptObuId.c rename to j2735codec/core/j2735_202409/src/ReceiptObuId.c diff --git a/j2735codec/core/202409/src/ReceiptServicePart.c b/j2735codec/core/j2735_202409/src/ReceiptServicePart.c similarity index 100% rename from j2735codec/core/202409/src/ReceiptServicePart.c rename to j2735codec/core/j2735_202409/src/ReceiptServicePart.c diff --git a/j2735codec/core/202409/src/ReceiptServiceSerialNumber.c b/j2735codec/core/j2735_202409/src/ReceiptServiceSerialNumber.c similarity index 100% rename from j2735codec/core/202409/src/ReceiptServiceSerialNumber.c rename to j2735codec/core/j2735_202409/src/ReceiptServiceSerialNumber.c diff --git a/j2735codec/core/202409/src/ReceiptText.c b/j2735codec/core/j2735_202409/src/ReceiptText.c similarity index 100% rename from j2735codec/core/202409/src/ReceiptText.c rename to j2735codec/core/j2735_202409/src/ReceiptText.c diff --git a/j2735codec/core/202409/src/RecreationalObjectsAndActivities.c b/j2735codec/core/j2735_202409/src/RecreationalObjectsAndActivities.c similarity index 100% rename from j2735codec/core/202409/src/RecreationalObjectsAndActivities.c rename to j2735codec/core/j2735_202409/src/RecreationalObjectsAndActivities.c diff --git a/j2735codec/core/202409/src/ReducedSpeedZoneContainer.c b/j2735codec/core/j2735_202409/src/ReducedSpeedZoneContainer.c similarity index 100% rename from j2735codec/core/202409/src/ReducedSpeedZoneContainer.c rename to j2735codec/core/j2735_202409/src/ReducedSpeedZoneContainer.c diff --git a/j2735codec/core/202409/src/ReferencePointType.c b/j2735codec/core/j2735_202409/src/ReferencePointType.c similarity index 100% rename from j2735codec/core/202409/src/ReferencePointType.c rename to j2735codec/core/j2735_202409/src/ReferencePointType.c diff --git a/j2735codec/core/202409/src/RegionId.c b/j2735codec/core/j2735_202409/src/RegionId.c similarity index 100% rename from j2735codec/core/202409/src/RegionId.c rename to j2735codec/core/j2735_202409/src/RegionId.c diff --git a/j2735codec/core/202409/src/RegionInfo.c b/j2735codec/core/j2735_202409/src/RegionInfo.c similarity index 100% rename from j2735codec/core/202409/src/RegionInfo.c rename to j2735codec/core/j2735_202409/src/RegionInfo.c diff --git a/j2735codec/core/202409/src/RegionList.c b/j2735codec/core/j2735_202409/src/RegionList.c similarity index 100% rename from j2735codec/core/202409/src/RegionList.c rename to j2735codec/core/j2735_202409/src/RegionList.c diff --git a/j2735codec/core/202409/src/RegionOffsets.c b/j2735codec/core/j2735_202409/src/RegionOffsets.c similarity index 100% rename from j2735codec/core/202409/src/RegionOffsets.c rename to j2735codec/core/j2735_202409/src/RegionOffsets.c diff --git a/j2735codec/core/202409/src/RegionPointSet.c b/j2735codec/core/j2735_202409/src/RegionPointSet.c similarity index 100% rename from j2735codec/core/202409/src/RegionPointSet.c rename to j2735codec/core/j2735_202409/src/RegionPointSet.c diff --git a/j2735codec/core/202409/src/RegionUncertainty.c b/j2735codec/core/j2735_202409/src/RegionUncertainty.c similarity index 100% rename from j2735codec/core/202409/src/RegionUncertainty.c rename to j2735codec/core/j2735_202409/src/RegionUncertainty.c diff --git a/j2735codec/core/202409/src/RegionalExtension.c b/j2735codec/core/j2735_202409/src/RegionalExtension.c similarity index 100% rename from j2735codec/core/202409/src/RegionalExtension.c rename to j2735codec/core/j2735_202409/src/RegionalExtension.c diff --git a/j2735codec/core/202409/src/RegulatoryAndWarningSigns.c b/j2735codec/core/j2735_202409/src/RegulatoryAndWarningSigns.c similarity index 100% rename from j2735codec/core/202409/src/RegulatoryAndWarningSigns.c rename to j2735codec/core/j2735_202409/src/RegulatoryAndWarningSigns.c diff --git a/j2735codec/core/202409/src/RegulatorySpeedLimit.c b/j2735codec/core/j2735_202409/src/RegulatorySpeedLimit.c similarity index 100% rename from j2735codec/core/202409/src/RegulatorySpeedLimit.c rename to j2735codec/core/j2735_202409/src/RegulatorySpeedLimit.c diff --git a/j2735codec/core/202409/src/RelativePosition3d.c b/j2735codec/core/j2735_202409/src/RelativePosition3d.c similarity index 100% rename from j2735codec/core/202409/src/RelativePosition3d.c rename to j2735codec/core/j2735_202409/src/RelativePosition3d.c diff --git a/j2735codec/core/202409/src/RelativeRoadAuthorityID.c b/j2735codec/core/j2735_202409/src/RelativeRoadAuthorityID.c similarity index 100% rename from j2735codec/core/202409/src/RelativeRoadAuthorityID.c rename to j2735codec/core/j2735_202409/src/RelativeRoadAuthorityID.c diff --git a/j2735codec/core/202409/src/ReportCharacteristics.c b/j2735codec/core/j2735_202409/src/ReportCharacteristics.c similarity index 100% rename from j2735codec/core/202409/src/ReportCharacteristics.c rename to j2735codec/core/j2735_202409/src/ReportCharacteristics.c diff --git a/j2735codec/core/202409/src/RequestID.c b/j2735codec/core/j2735_202409/src/RequestID.c similarity index 100% rename from j2735codec/core/202409/src/RequestID.c rename to j2735codec/core/j2735_202409/src/RequestID.c diff --git a/j2735codec/core/202409/src/RequestImportanceLevel.c b/j2735codec/core/j2735_202409/src/RequestImportanceLevel.c similarity index 100% rename from j2735codec/core/202409/src/RequestImportanceLevel.c rename to j2735codec/core/j2735_202409/src/RequestImportanceLevel.c diff --git a/j2735codec/core/202409/src/RequestSubRole.c b/j2735codec/core/j2735_202409/src/RequestSubRole.c similarity index 100% rename from j2735codec/core/202409/src/RequestSubRole.c rename to j2735codec/core/j2735_202409/src/RequestSubRole.c diff --git a/j2735codec/core/202409/src/RequestedItem.c b/j2735codec/core/j2735_202409/src/RequestedItem.c similarity index 100% rename from j2735codec/core/202409/src/RequestedItem.c rename to j2735codec/core/j2735_202409/src/RequestedItem.c diff --git a/j2735codec/core/202409/src/RequestedItemList.c b/j2735codec/core/j2735_202409/src/RequestedItemList.c similarity index 100% rename from j2735codec/core/202409/src/RequestedItemList.c rename to j2735codec/core/j2735_202409/src/RequestedItemList.c diff --git a/j2735codec/core/202409/src/RequestorDescription.c b/j2735codec/core/j2735_202409/src/RequestorDescription.c similarity index 100% rename from j2735codec/core/202409/src/RequestorDescription.c rename to j2735codec/core/j2735_202409/src/RequestorDescription.c diff --git a/j2735codec/core/202409/src/RequestorPositionVector.c b/j2735codec/core/j2735_202409/src/RequestorPositionVector.c similarity index 100% rename from j2735codec/core/202409/src/RequestorPositionVector.c rename to j2735codec/core/j2735_202409/src/RequestorPositionVector.c diff --git a/j2735codec/core/202409/src/RequestorType.c b/j2735codec/core/j2735_202409/src/RequestorType.c similarity index 100% rename from j2735codec/core/202409/src/RequestorType.c rename to j2735codec/core/j2735_202409/src/RequestorType.c diff --git a/j2735codec/core/202409/src/ReservedBit.c b/j2735codec/core/j2735_202409/src/ReservedBit.c similarity index 100% rename from j2735codec/core/202409/src/ReservedBit.c rename to j2735codec/core/j2735_202409/src/ReservedBit.c diff --git a/j2735codec/core/202409/src/ResponseFlag.c b/j2735codec/core/j2735_202409/src/ResponseFlag.c similarity index 100% rename from j2735codec/core/202409/src/ResponseFlag.c rename to j2735codec/core/j2735_202409/src/ResponseFlag.c diff --git a/j2735codec/core/202409/src/ResponseType.c b/j2735codec/core/j2735_202409/src/ResponseType.c similarity index 100% rename from j2735codec/core/202409/src/ResponseType.c rename to j2735codec/core/j2735_202409/src/ResponseType.c diff --git a/j2735codec/core/202409/src/RestrictionAppliesTo.c b/j2735codec/core/j2735_202409/src/RestrictionAppliesTo.c similarity index 100% rename from j2735codec/core/202409/src/RestrictionAppliesTo.c rename to j2735codec/core/j2735_202409/src/RestrictionAppliesTo.c diff --git a/j2735codec/core/202409/src/RestrictionClass.c b/j2735codec/core/j2735_202409/src/RestrictionClass.c similarity index 100% rename from j2735codec/core/202409/src/RestrictionClass.c rename to j2735codec/core/j2735_202409/src/RestrictionClass.c diff --git a/j2735codec/core/202409/src/RestrictionClassAssignment.c b/j2735codec/core/j2735_202409/src/RestrictionClassAssignment.c similarity index 100% rename from j2735codec/core/202409/src/RestrictionClassAssignment.c rename to j2735codec/core/j2735_202409/src/RestrictionClassAssignment.c diff --git a/j2735codec/core/202409/src/RestrictionClassID.c b/j2735codec/core/j2735_202409/src/RestrictionClassID.c similarity index 100% rename from j2735codec/core/202409/src/RestrictionClassID.c rename to j2735codec/core/j2735_202409/src/RestrictionClassID.c diff --git a/j2735codec/core/202409/src/RestrictionClassList.c b/j2735codec/core/j2735_202409/src/RestrictionClassList.c similarity index 100% rename from j2735codec/core/202409/src/RestrictionClassList.c rename to j2735codec/core/j2735_202409/src/RestrictionClassList.c diff --git a/j2735codec/core/202409/src/RestrictionUserType-addGrpC.c b/j2735codec/core/j2735_202409/src/RestrictionUserType-addGrpC.c similarity index 100% rename from j2735codec/core/202409/src/RestrictionUserType-addGrpC.c rename to j2735codec/core/j2735_202409/src/RestrictionUserType-addGrpC.c diff --git a/j2735codec/core/202409/src/RestrictionUserType.c b/j2735codec/core/j2735_202409/src/RestrictionUserType.c similarity index 100% rename from j2735codec/core/202409/src/RestrictionUserType.c rename to j2735codec/core/j2735_202409/src/RestrictionUserType.c diff --git a/j2735codec/core/202409/src/RestrictionUserTypeList.c b/j2735codec/core/j2735_202409/src/RestrictionUserTypeList.c similarity index 100% rename from j2735codec/core/202409/src/RestrictionUserTypeList.c rename to j2735codec/core/j2735_202409/src/RestrictionUserTypeList.c diff --git a/j2735codec/core/202409/src/ResultFin.c b/j2735codec/core/j2735_202409/src/ResultFin.c similarity index 100% rename from j2735codec/core/202409/src/ResultFin.c rename to j2735codec/core/j2735_202409/src/ResultFin.c diff --git a/j2735codec/core/202409/src/ResultOp.c b/j2735codec/core/j2735_202409/src/ResultOp.c similarity index 100% rename from j2735codec/core/202409/src/ResultOp.c rename to j2735codec/core/j2735_202409/src/ResultOp.c diff --git a/j2735codec/core/202409/src/RoadAuthorityID.c b/j2735codec/core/j2735_202409/src/RoadAuthorityID.c similarity index 100% rename from j2735codec/core/202409/src/RoadAuthorityID.c rename to j2735codec/core/j2735_202409/src/RoadAuthorityID.c diff --git a/j2735codec/core/202409/src/RoadGeometryAndAttributes.c b/j2735codec/core/j2735_202409/src/RoadGeometryAndAttributes.c similarity index 100% rename from j2735codec/core/202409/src/RoadGeometryAndAttributes.c rename to j2735codec/core/j2735_202409/src/RoadGeometryAndAttributes.c diff --git a/j2735codec/core/202409/src/RoadGrade.c b/j2735codec/core/j2735_202409/src/RoadGrade.c similarity index 100% rename from j2735codec/core/202409/src/RoadGrade.c rename to j2735codec/core/j2735_202409/src/RoadGrade.c diff --git a/j2735codec/core/202409/src/RoadLaneSetList.c b/j2735codec/core/j2735_202409/src/RoadLaneSetList.c similarity index 100% rename from j2735codec/core/202409/src/RoadLaneSetList.c rename to j2735codec/core/j2735_202409/src/RoadLaneSetList.c diff --git a/j2735codec/core/202409/src/RoadRegulatorID.c b/j2735codec/core/j2735_202409/src/RoadRegulatorID.c similarity index 100% rename from j2735codec/core/202409/src/RoadRegulatorID.c rename to j2735codec/core/j2735_202409/src/RoadRegulatorID.c diff --git a/j2735codec/core/202409/src/RoadRoughness.c b/j2735codec/core/j2735_202409/src/RoadRoughness.c similarity index 100% rename from j2735codec/core/202409/src/RoadRoughness.c rename to j2735codec/core/j2735_202409/src/RoadRoughness.c diff --git a/j2735codec/core/202409/src/RoadSafetyMessage.c b/j2735codec/core/j2735_202409/src/RoadSafetyMessage.c similarity index 100% rename from j2735codec/core/202409/src/RoadSafetyMessage.c rename to j2735codec/core/j2735_202409/src/RoadSafetyMessage.c diff --git a/j2735codec/core/202409/src/RoadSegment.c b/j2735codec/core/j2735_202409/src/RoadSegment.c similarity index 100% rename from j2735codec/core/202409/src/RoadSegment.c rename to j2735codec/core/j2735_202409/src/RoadSegment.c diff --git a/j2735codec/core/202409/src/RoadSegmentID.c b/j2735codec/core/j2735_202409/src/RoadSegmentID.c similarity index 100% rename from j2735codec/core/202409/src/RoadSegmentID.c rename to j2735codec/core/j2735_202409/src/RoadSegmentID.c diff --git a/j2735codec/core/202409/src/RoadSegmentList.c b/j2735codec/core/j2735_202409/src/RoadSegmentList.c similarity index 100% rename from j2735codec/core/202409/src/RoadSegmentList.c rename to j2735codec/core/j2735_202409/src/RoadSegmentList.c diff --git a/j2735codec/core/202409/src/RoadSegmentReferenceID.c b/j2735codec/core/j2735_202409/src/RoadSegmentReferenceID.c similarity index 100% rename from j2735codec/core/202409/src/RoadSegmentReferenceID.c rename to j2735codec/core/j2735_202409/src/RoadSegmentReferenceID.c diff --git a/j2735codec/core/202409/src/RoadSideAlert.c b/j2735codec/core/j2735_202409/src/RoadSideAlert.c similarity index 100% rename from j2735codec/core/202409/src/RoadSideAlert.c rename to j2735codec/core/j2735_202409/src/RoadSideAlert.c diff --git a/j2735codec/core/202409/src/RoadSignID.c b/j2735codec/core/j2735_202409/src/RoadSignID.c similarity index 100% rename from j2735codec/core/202409/src/RoadSignID.c rename to j2735codec/core/j2735_202409/src/RoadSignID.c diff --git a/j2735codec/core/202409/src/RoadSnapShot.c b/j2735codec/core/j2735_202409/src/RoadSnapShot.c similarity index 100% rename from j2735codec/core/202409/src/RoadSnapShot.c rename to j2735codec/core/j2735_202409/src/RoadSnapShot.c diff --git a/j2735codec/core/202409/src/RoadSurfaceCondition.c b/j2735codec/core/j2735_202409/src/RoadSurfaceCondition.c similarity index 100% rename from j2735codec/core/202409/src/RoadSurfaceCondition.c rename to j2735codec/core/j2735_202409/src/RoadSurfaceCondition.c diff --git a/j2735codec/core/202409/src/RoadUserChargingConfigMessage.c b/j2735codec/core/j2735_202409/src/RoadUserChargingConfigMessage.c similarity index 100% rename from j2735codec/core/202409/src/RoadUserChargingConfigMessage.c rename to j2735codec/core/j2735_202409/src/RoadUserChargingConfigMessage.c diff --git a/j2735codec/core/202409/src/RoadUserChargingReportMessage.c b/j2735codec/core/j2735_202409/src/RoadUserChargingReportMessage.c similarity index 100% rename from j2735codec/core/202409/src/RoadUserChargingReportMessage.c rename to j2735codec/core/j2735_202409/src/RoadUserChargingReportMessage.c diff --git a/j2735codec/core/202409/src/RoadWeatherDownload.c b/j2735codec/core/j2735_202409/src/RoadWeatherDownload.c similarity index 100% rename from j2735codec/core/202409/src/RoadWeatherDownload.c rename to j2735codec/core/j2735_202409/src/RoadWeatherDownload.c diff --git a/j2735codec/core/202409/src/RoadWeatherMessage.c b/j2735codec/core/j2735_202409/src/RoadWeatherMessage.c similarity index 100% rename from j2735codec/core/202409/src/RoadWeatherMessage.c rename to j2735codec/core/j2735_202409/src/RoadWeatherMessage.c diff --git a/j2735codec/core/202409/src/RoadWeatherUpload.c b/j2735codec/core/j2735_202409/src/RoadWeatherUpload.c similarity index 100% rename from j2735codec/core/202409/src/RoadWeatherUpload.c rename to j2735codec/core/j2735_202409/src/RoadWeatherUpload.c diff --git a/j2735codec/core/202409/src/RoadsideAssets.c b/j2735codec/core/j2735_202409/src/RoadsideAssets.c similarity index 100% rename from j2735codec/core/202409/src/RoadsideAssets.c rename to j2735codec/core/j2735_202409/src/RoadsideAssets.c diff --git a/j2735codec/core/202409/src/RoadwayCrownAngle.c b/j2735codec/core/j2735_202409/src/RoadwayCrownAngle.c similarity index 100% rename from j2735codec/core/202409/src/RoadwayCrownAngle.c rename to j2735codec/core/j2735_202409/src/RoadwayCrownAngle.c diff --git a/j2735codec/core/202409/src/Roadwork.c b/j2735codec/core/j2735_202409/src/Roadwork.c similarity index 100% rename from j2735codec/core/202409/src/Roadwork.c rename to j2735codec/core/j2735_202409/src/Roadwork.c diff --git a/j2735codec/core/202409/src/Rock.c b/j2735codec/core/j2735_202409/src/Rock.c similarity index 100% rename from j2735codec/core/202409/src/Rock.c rename to j2735codec/core/j2735_202409/src/Rock.c diff --git a/j2735codec/core/202409/src/RockType.c b/j2735codec/core/j2735_202409/src/RockType.c similarity index 100% rename from j2735codec/core/202409/src/RockType.c rename to j2735codec/core/j2735_202409/src/RockType.c diff --git a/j2735codec/core/202409/src/Roll.c b/j2735codec/core/j2735_202409/src/Roll.c similarity index 100% rename from j2735codec/core/202409/src/Roll.c rename to j2735codec/core/j2735_202409/src/Roll.c diff --git a/j2735codec/core/202409/src/RollDetected.c b/j2735codec/core/j2735_202409/src/RollDetected.c similarity index 100% rename from j2735codec/core/202409/src/RollDetected.c rename to j2735codec/core/j2735_202409/src/RollDetected.c diff --git a/j2735codec/core/202409/src/RollRateConfidence.c b/j2735codec/core/j2735_202409/src/RollRateConfidence.c similarity index 100% rename from j2735codec/core/202409/src/RollRateConfidence.c rename to j2735codec/core/j2735_202409/src/RollRateConfidence.c diff --git a/j2735codec/core/202409/src/RptAveragedAndSummaryRecord.c b/j2735codec/core/j2735_202409/src/RptAveragedAndSummaryRecord.c similarity index 100% rename from j2735codec/core/202409/src/RptAveragedAndSummaryRecord.c rename to j2735codec/core/j2735_202409/src/RptAveragedAndSummaryRecord.c diff --git a/j2735codec/core/202409/src/RptAveragedRecord.c b/j2735codec/core/j2735_202409/src/RptAveragedRecord.c similarity index 100% rename from j2735codec/core/202409/src/RptAveragedRecord.c rename to j2735codec/core/j2735_202409/src/RptAveragedRecord.c diff --git a/j2735codec/core/202409/src/RptAvgAndSummaryRecordData.c b/j2735codec/core/j2735_202409/src/RptAvgAndSummaryRecordData.c similarity index 100% rename from j2735codec/core/202409/src/RptAvgAndSummaryRecordData.c rename to j2735codec/core/j2735_202409/src/RptAvgAndSummaryRecordData.c diff --git a/j2735codec/core/202409/src/RptCommSysPerfEvents.c b/j2735codec/core/j2735_202409/src/RptCommSysPerfEvents.c similarity index 100% rename from j2735codec/core/202409/src/RptCommSysPerfEvents.c rename to j2735codec/core/j2735_202409/src/RptCommSysPerfEvents.c diff --git a/j2735codec/core/202409/src/RptDevType.c b/j2735codec/core/j2735_202409/src/RptDevType.c similarity index 100% rename from j2735codec/core/202409/src/RptDevType.c rename to j2735codec/core/j2735_202409/src/RptDevType.c diff --git a/j2735codec/core/202409/src/RptDriverAlertsAndWarnings.c b/j2735codec/core/j2735_202409/src/RptDriverAlertsAndWarnings.c similarity index 100% rename from j2735codec/core/202409/src/RptDriverAlertsAndWarnings.c rename to j2735codec/core/j2735_202409/src/RptDriverAlertsAndWarnings.c diff --git a/j2735codec/core/202409/src/RptEmissions.c b/j2735codec/core/j2735_202409/src/RptEmissions.c similarity index 100% rename from j2735codec/core/202409/src/RptEmissions.c rename to j2735codec/core/j2735_202409/src/RptEmissions.c diff --git a/j2735codec/core/202409/src/RptEvents.c b/j2735codec/core/j2735_202409/src/RptEvents.c similarity index 100% rename from j2735codec/core/202409/src/RptEvents.c rename to j2735codec/core/j2735_202409/src/RptEvents.c diff --git a/j2735codec/core/202409/src/RptHysteresis.c b/j2735codec/core/j2735_202409/src/RptHysteresis.c similarity index 100% rename from j2735codec/core/202409/src/RptHysteresis.c rename to j2735codec/core/j2735_202409/src/RptHysteresis.c diff --git a/j2735codec/core/202409/src/RptHysteresisRecord.c b/j2735codec/core/j2735_202409/src/RptHysteresisRecord.c similarity index 100% rename from j2735codec/core/202409/src/RptHysteresisRecord.c rename to j2735codec/core/j2735_202409/src/RptHysteresisRecord.c diff --git a/j2735codec/core/202409/src/RptInstantaneousRecord.c b/j2735codec/core/j2735_202409/src/RptInstantaneousRecord.c similarity index 100% rename from j2735codec/core/202409/src/RptInstantaneousRecord.c rename to j2735codec/core/j2735_202409/src/RptInstantaneousRecord.c diff --git a/j2735codec/core/202409/src/RptInstantaneousRecordData.c b/j2735codec/core/j2735_202409/src/RptInstantaneousRecordData.c similarity index 100% rename from j2735codec/core/202409/src/RptInstantaneousRecordData.c rename to j2735codec/core/j2735_202409/src/RptInstantaneousRecordData.c diff --git a/j2735codec/core/202409/src/RptInstantaneousRecords.c b/j2735codec/core/j2735_202409/src/RptInstantaneousRecords.c similarity index 100% rename from j2735codec/core/202409/src/RptInstantaneousRecords.c rename to j2735codec/core/j2735_202409/src/RptInstantaneousRecords.c diff --git a/j2735codec/core/202409/src/RptIntervalEvents.c b/j2735codec/core/j2735_202409/src/RptIntervalEvents.c similarity index 100% rename from j2735codec/core/202409/src/RptIntervalEvents.c rename to j2735codec/core/j2735_202409/src/RptIntervalEvents.c diff --git a/j2735codec/core/202409/src/RptKinematicEvents.c b/j2735codec/core/j2735_202409/src/RptKinematicEvents.c similarity index 100% rename from j2735codec/core/202409/src/RptKinematicEvents.c rename to j2735codec/core/j2735_202409/src/RptKinematicEvents.c diff --git a/j2735codec/core/202409/src/RptLocOfStops.c b/j2735codec/core/j2735_202409/src/RptLocOfStops.c similarity index 100% rename from j2735codec/core/202409/src/RptLocOfStops.c rename to j2735codec/core/j2735_202409/src/RptLocOfStops.c diff --git a/j2735codec/core/202409/src/RptRoadRoughness.c b/j2735codec/core/j2735_202409/src/RptRoadRoughness.c similarity index 100% rename from j2735codec/core/202409/src/RptRoadRoughness.c rename to j2735codec/core/j2735_202409/src/RptRoadRoughness.c diff --git a/j2735codec/core/202409/src/RptRoadwayEvents.c b/j2735codec/core/j2735_202409/src/RptRoadwayEvents.c similarity index 100% rename from j2735codec/core/202409/src/RptRoadwayEvents.c rename to j2735codec/core/j2735_202409/src/RptRoadwayEvents.c diff --git a/j2735codec/core/202409/src/RptSummaryRecord.c b/j2735codec/core/j2735_202409/src/RptSummaryRecord.c similarity index 100% rename from j2735codec/core/202409/src/RptSummaryRecord.c rename to j2735codec/core/j2735_202409/src/RptSummaryRecord.c diff --git a/j2735codec/core/202409/src/RptTrafficMetrics.c b/j2735codec/core/j2735_202409/src/RptTrafficMetrics.c similarity index 100% rename from j2735codec/core/202409/src/RptTrafficMetrics.c rename to j2735codec/core/j2735_202409/src/RptTrafficMetrics.c diff --git a/j2735codec/core/202409/src/RptTrafficSigEncounters.c b/j2735codec/core/j2735_202409/src/RptTrafficSigEncounters.c similarity index 100% rename from j2735codec/core/202409/src/RptTrafficSigEncounters.c rename to j2735codec/core/j2735_202409/src/RptTrafficSigEncounters.c diff --git a/j2735codec/core/202409/src/RptTransitVehData.c b/j2735codec/core/j2735_202409/src/RptTransitVehData.c similarity index 100% rename from j2735codec/core/202409/src/RptTransitVehData.c rename to j2735codec/core/j2735_202409/src/RptTransitVehData.c diff --git a/j2735codec/core/202409/src/RptVehicleClass.c b/j2735codec/core/j2735_202409/src/RptVehicleClass.c similarity index 100% rename from j2735codec/core/202409/src/RptVehicleClass.c rename to j2735codec/core/j2735_202409/src/RptVehicleClass.c diff --git a/j2735codec/core/202409/src/RptVehicleEvents.c b/j2735codec/core/j2735_202409/src/RptVehicleEvents.c similarity index 100% rename from j2735codec/core/202409/src/RptVehicleEvents.c rename to j2735codec/core/j2735_202409/src/RptVehicleEvents.c diff --git a/j2735codec/core/202409/src/RptVehicleReport.c b/j2735codec/core/j2735_202409/src/RptVehicleReport.c similarity index 100% rename from j2735codec/core/202409/src/RptVehicleReport.c rename to j2735codec/core/j2735_202409/src/RptVehicleReport.c diff --git a/j2735codec/core/202409/src/RptVelocity.c b/j2735codec/core/j2735_202409/src/RptVelocity.c similarity index 100% rename from j2735codec/core/202409/src/RptVelocity.c rename to j2735codec/core/j2735_202409/src/RptVelocity.c diff --git a/j2735codec/core/202409/src/RptWiperStatus.c b/j2735codec/core/j2735_202409/src/RptWiperStatus.c similarity index 100% rename from j2735codec/core/202409/src/RptWiperStatus.c rename to j2735codec/core/j2735_202409/src/RptWiperStatus.c diff --git a/j2735codec/core/202409/src/SPAT.c b/j2735codec/core/j2735_202409/src/SPAT.c similarity index 100% rename from j2735codec/core/202409/src/SPAT.c rename to j2735codec/core/j2735_202409/src/SPAT.c diff --git a/j2735codec/core/202409/src/SPAT_TimeMark.c b/j2735codec/core/j2735_202409/src/SPAT_TimeMark.c similarity index 100% rename from j2735codec/core/202409/src/SPAT_TimeMark.c rename to j2735codec/core/j2735_202409/src/SPAT_TimeMark.c diff --git a/j2735codec/core/202409/src/SSPindex.c b/j2735codec/core/j2735_202409/src/SSPindex.c similarity index 100% rename from j2735codec/core/202409/src/SSPindex.c rename to j2735codec/core/j2735_202409/src/SSPindex.c diff --git a/j2735codec/core/202409/src/Sample.c b/j2735codec/core/j2735_202409/src/Sample.c similarity index 100% rename from j2735codec/core/202409/src/Sample.c rename to j2735codec/core/j2735_202409/src/Sample.c diff --git a/j2735codec/core/202409/src/Scale-B12.c b/j2735codec/core/j2735_202409/src/Scale-B12.c similarity index 100% rename from j2735codec/core/202409/src/Scale-B12.c rename to j2735codec/core/j2735_202409/src/Scale-B12.c diff --git a/j2735codec/core/202409/src/SchoolBusJ2945Slash1C.c b/j2735codec/core/j2735_202409/src/SchoolBusJ2945Slash1C.c similarity index 100% rename from j2735codec/core/202409/src/SchoolBusJ2945Slash1C.c rename to j2735codec/core/j2735_202409/src/SchoolBusJ2945Slash1C.c diff --git a/j2735codec/core/202409/src/Second.c b/j2735codec/core/j2735_202409/src/Second.c similarity index 100% rename from j2735codec/core/202409/src/Second.c rename to j2735codec/core/j2735_202409/src/Second.c diff --git a/j2735codec/core/202409/src/SecondOfTime.c b/j2735codec/core/j2735_202409/src/SecondOfTime.c similarity index 100% rename from j2735codec/core/202409/src/SecondOfTime.c rename to j2735codec/core/j2735_202409/src/SecondOfTime.c diff --git a/j2735codec/core/202409/src/SecondsAngle.c b/j2735codec/core/j2735_202409/src/SecondsAngle.c similarity index 100% rename from j2735codec/core/202409/src/SecondsAngle.c rename to j2735codec/core/j2735_202409/src/SecondsAngle.c diff --git a/j2735codec/core/202409/src/Segment.c b/j2735codec/core/j2735_202409/src/Segment.c similarity index 100% rename from j2735codec/core/202409/src/Segment.c rename to j2735codec/core/j2735_202409/src/Segment.c diff --git a/j2735codec/core/202409/src/SegmentAttributeLL.c b/j2735codec/core/j2735_202409/src/SegmentAttributeLL.c similarity index 100% rename from j2735codec/core/202409/src/SegmentAttributeLL.c rename to j2735codec/core/j2735_202409/src/SegmentAttributeLL.c diff --git a/j2735codec/core/202409/src/SegmentAttributeLLList.c b/j2735codec/core/j2735_202409/src/SegmentAttributeLLList.c similarity index 100% rename from j2735codec/core/202409/src/SegmentAttributeLLList.c rename to j2735codec/core/j2735_202409/src/SegmentAttributeLLList.c diff --git a/j2735codec/core/202409/src/SegmentAttributeXY.c b/j2735codec/core/j2735_202409/src/SegmentAttributeXY.c similarity index 100% rename from j2735codec/core/202409/src/SegmentAttributeXY.c rename to j2735codec/core/j2735_202409/src/SegmentAttributeXY.c diff --git a/j2735codec/core/202409/src/SegmentAttributeXYList.c b/j2735codec/core/j2735_202409/src/SegmentAttributeXYList.c similarity index 100% rename from j2735codec/core/202409/src/SegmentAttributeXYList.c rename to j2735codec/core/j2735_202409/src/SegmentAttributeXYList.c diff --git a/j2735codec/core/202409/src/SemiMajorAxisAccuracy.c b/j2735codec/core/j2735_202409/src/SemiMajorAxisAccuracy.c similarity index 100% rename from j2735codec/core/202409/src/SemiMajorAxisAccuracy.c rename to j2735codec/core/j2735_202409/src/SemiMajorAxisAccuracy.c diff --git a/j2735codec/core/202409/src/SemiMajorAxisOrientation.c b/j2735codec/core/j2735_202409/src/SemiMajorAxisOrientation.c similarity index 100% rename from j2735codec/core/202409/src/SemiMajorAxisOrientation.c rename to j2735codec/core/j2735_202409/src/SemiMajorAxisOrientation.c diff --git a/j2735codec/core/202409/src/SemiMinorAxisAccuracy.c b/j2735codec/core/j2735_202409/src/SemiMinorAxisAccuracy.c similarity index 100% rename from j2735codec/core/202409/src/SemiMinorAxisAccuracy.c rename to j2735codec/core/j2735_202409/src/SemiMinorAxisAccuracy.c diff --git a/j2735codec/core/202409/src/SensorDataSharingMessage.c b/j2735codec/core/j2735_202409/src/SensorDataSharingMessage.c similarity index 100% rename from j2735codec/core/202409/src/SensorDataSharingMessage.c rename to j2735codec/core/j2735_202409/src/SensorDataSharingMessage.c diff --git a/j2735codec/core/202409/src/SensorDataSharingMessage_ObjectDistance.c b/j2735codec/core/j2735_202409/src/SensorDataSharingMessage_ObjectDistance.c similarity index 100% rename from j2735codec/core/202409/src/SensorDataSharingMessage_ObjectDistance.c rename to j2735codec/core/j2735_202409/src/SensorDataSharingMessage_ObjectDistance.c diff --git a/j2735codec/core/202409/src/SensorDataSharingMessage_PitchRate.c b/j2735codec/core/j2735_202409/src/SensorDataSharingMessage_PitchRate.c similarity index 100% rename from j2735codec/core/202409/src/SensorDataSharingMessage_PitchRate.c rename to j2735codec/core/j2735_202409/src/SensorDataSharingMessage_PitchRate.c diff --git a/j2735codec/core/202409/src/SensorDataSharingMessage_PositionOffsetXYZ.c b/j2735codec/core/j2735_202409/src/SensorDataSharingMessage_PositionOffsetXYZ.c similarity index 100% rename from j2735codec/core/202409/src/SensorDataSharingMessage_PositionOffsetXYZ.c rename to j2735codec/core/j2735_202409/src/SensorDataSharingMessage_PositionOffsetXYZ.c diff --git a/j2735codec/core/202409/src/SensorDataSharingMessage_RollRate.c b/j2735codec/core/j2735_202409/src/SensorDataSharingMessage_RollRate.c similarity index 100% rename from j2735codec/core/202409/src/SensorDataSharingMessage_RollRate.c rename to j2735codec/core/j2735_202409/src/SensorDataSharingMessage_RollRate.c diff --git a/j2735codec/core/202409/src/SeparationDistance.c b/j2735codec/core/j2735_202409/src/SeparationDistance.c similarity index 100% rename from j2735codec/core/202409/src/SeparationDistance.c rename to j2735codec/core/j2735_202409/src/SeparationDistance.c diff --git a/j2735codec/core/202409/src/SessionClass.c b/j2735codec/core/j2735_202409/src/SessionClass.c similarity index 100% rename from j2735codec/core/202409/src/SessionClass.c rename to j2735codec/core/j2735_202409/src/SessionClass.c diff --git a/j2735codec/core/202409/src/SessionLocation.c b/j2735codec/core/j2735_202409/src/SessionLocation.c similarity index 100% rename from j2735codec/core/202409/src/SessionLocation.c rename to j2735codec/core/j2735_202409/src/SessionLocation.c diff --git a/j2735codec/core/202409/src/ShapePointSet.c b/j2735codec/core/j2735_202409/src/ShapePointSet.c similarity index 100% rename from j2735codec/core/202409/src/ShapePointSet.c rename to j2735codec/core/j2735_202409/src/ShapePointSet.c diff --git a/j2735codec/core/202409/src/ShortString.c b/j2735codec/core/j2735_202409/src/ShortString.c similarity index 100% rename from j2735codec/core/202409/src/ShortString.c rename to j2735codec/core/j2735_202409/src/ShortString.c diff --git a/j2735codec/core/202409/src/SignPriority.c b/j2735codec/core/j2735_202409/src/SignPriority.c similarity index 100% rename from j2735codec/core/202409/src/SignPriority.c rename to j2735codec/core/j2735_202409/src/SignPriority.c diff --git a/j2735codec/core/202409/src/SignalControlAndPrioritizationRequest.c b/j2735codec/core/j2735_202409/src/SignalControlAndPrioritizationRequest.c similarity index 100% rename from j2735codec/core/202409/src/SignalControlAndPrioritizationRequest.c rename to j2735codec/core/j2735_202409/src/SignalControlAndPrioritizationRequest.c diff --git a/j2735codec/core/202409/src/SignalControlAndPrioritizationStatus.c b/j2735codec/core/j2735_202409/src/SignalControlAndPrioritizationStatus.c similarity index 100% rename from j2735codec/core/202409/src/SignalControlAndPrioritizationStatus.c rename to j2735codec/core/j2735_202409/src/SignalControlAndPrioritizationStatus.c diff --git a/j2735codec/core/202409/src/SignalControlZone.c b/j2735codec/core/j2735_202409/src/SignalControlZone.c similarity index 100% rename from j2735codec/core/202409/src/SignalControlZone.c rename to j2735codec/core/j2735_202409/src/SignalControlZone.c diff --git a/j2735codec/core/202409/src/SignalGroupID.c b/j2735codec/core/j2735_202409/src/SignalGroupID.c similarity index 100% rename from j2735codec/core/202409/src/SignalGroupID.c rename to j2735codec/core/j2735_202409/src/SignalGroupID.c diff --git a/j2735codec/core/202409/src/SignalHeadLocation.c b/j2735codec/core/j2735_202409/src/SignalHeadLocation.c similarity index 100% rename from j2735codec/core/202409/src/SignalHeadLocation.c rename to j2735codec/core/j2735_202409/src/SignalHeadLocation.c diff --git a/j2735codec/core/202409/src/SignalHeadLocationList.c b/j2735codec/core/j2735_202409/src/SignalHeadLocationList.c similarity index 100% rename from j2735codec/core/202409/src/SignalHeadLocationList.c rename to j2735codec/core/j2735_202409/src/SignalHeadLocationList.c diff --git a/j2735codec/core/202409/src/SignalReqScheme.c b/j2735codec/core/j2735_202409/src/SignalReqScheme.c similarity index 100% rename from j2735codec/core/202409/src/SignalReqScheme.c rename to j2735codec/core/j2735_202409/src/SignalReqScheme.c diff --git a/j2735codec/core/202409/src/SignalRequest.c b/j2735codec/core/j2735_202409/src/SignalRequest.c similarity index 100% rename from j2735codec/core/202409/src/SignalRequest.c rename to j2735codec/core/j2735_202409/src/SignalRequest.c diff --git a/j2735codec/core/202409/src/SignalRequestList.c b/j2735codec/core/j2735_202409/src/SignalRequestList.c similarity index 100% rename from j2735codec/core/202409/src/SignalRequestList.c rename to j2735codec/core/j2735_202409/src/SignalRequestList.c diff --git a/j2735codec/core/202409/src/SignalRequestMessage.c b/j2735codec/core/j2735_202409/src/SignalRequestMessage.c similarity index 100% rename from j2735codec/core/202409/src/SignalRequestMessage.c rename to j2735codec/core/j2735_202409/src/SignalRequestMessage.c diff --git a/j2735codec/core/202409/src/SignalRequestPackage.c b/j2735codec/core/j2735_202409/src/SignalRequestPackage.c similarity index 100% rename from j2735codec/core/202409/src/SignalRequestPackage.c rename to j2735codec/core/j2735_202409/src/SignalRequestPackage.c diff --git a/j2735codec/core/202409/src/SignalRequesterInfo.c b/j2735codec/core/j2735_202409/src/SignalRequesterInfo.c similarity index 100% rename from j2735codec/core/202409/src/SignalRequesterInfo.c rename to j2735codec/core/j2735_202409/src/SignalRequesterInfo.c diff --git a/j2735codec/core/202409/src/SignalStatus.c b/j2735codec/core/j2735_202409/src/SignalStatus.c similarity index 100% rename from j2735codec/core/202409/src/SignalStatus.c rename to j2735codec/core/j2735_202409/src/SignalStatus.c diff --git a/j2735codec/core/202409/src/SignalStatusList.c b/j2735codec/core/j2735_202409/src/SignalStatusList.c similarity index 100% rename from j2735codec/core/202409/src/SignalStatusList.c rename to j2735codec/core/j2735_202409/src/SignalStatusList.c diff --git a/j2735codec/core/202409/src/SignalStatusMessage.c b/j2735codec/core/j2735_202409/src/SignalStatusMessage.c similarity index 100% rename from j2735codec/core/202409/src/SignalStatusMessage.c rename to j2735codec/core/j2735_202409/src/SignalStatusMessage.c diff --git a/j2735codec/core/202409/src/SignalStatusPackage.c b/j2735codec/core/j2735_202409/src/SignalStatusPackage.c similarity index 100% rename from j2735codec/core/202409/src/SignalStatusPackage.c rename to j2735codec/core/j2735_202409/src/SignalStatusPackage.c diff --git a/j2735codec/core/202409/src/SignalStatusPackageList.c b/j2735codec/core/j2735_202409/src/SignalStatusPackageList.c similarity index 100% rename from j2735codec/core/202409/src/SignalStatusPackageList.c rename to j2735codec/core/j2735_202409/src/SignalStatusPackageList.c diff --git a/j2735codec/core/202409/src/SignedValue.c b/j2735codec/core/j2735_202409/src/SignedValue.c similarity index 100% rename from j2735codec/core/202409/src/SignedValue.c rename to j2735codec/core/j2735_202409/src/SignedValue.c diff --git a/j2735codec/core/202409/src/SirenInUse.c b/j2735codec/core/j2735_202409/src/SirenInUse.c similarity index 100% rename from j2735codec/core/202409/src/SirenInUse.c rename to j2735codec/core/j2735_202409/src/SirenInUse.c diff --git a/j2735codec/core/202409/src/SituationalContainer.c b/j2735codec/core/j2735_202409/src/SituationalContainer.c similarity index 100% rename from j2735codec/core/202409/src/SituationalContainer.c rename to j2735codec/core/j2735_202409/src/SituationalContainer.c diff --git a/j2735codec/core/202409/src/SizeValue.c b/j2735codec/core/j2735_202409/src/SizeValue.c similarity index 100% rename from j2735codec/core/202409/src/SizeValue.c rename to j2735codec/core/j2735_202409/src/SizeValue.c diff --git a/j2735codec/core/202409/src/SizeValueConfidence.c b/j2735codec/core/j2735_202409/src/SizeValueConfidence.c similarity index 100% rename from j2735codec/core/202409/src/SizeValueConfidence.c rename to j2735codec/core/j2735_202409/src/SizeValueConfidence.c diff --git a/j2735codec/core/202409/src/SmallNumbers.c b/j2735codec/core/j2735_202409/src/SmallNumbers.c similarity index 100% rename from j2735codec/core/202409/src/SmallNumbers.c rename to j2735codec/core/j2735_202409/src/SmallNumbers.c diff --git a/j2735codec/core/202409/src/Snapshot.c b/j2735codec/core/j2735_202409/src/Snapshot.c similarity index 100% rename from j2735codec/core/202409/src/Snapshot.c rename to j2735codec/core/j2735_202409/src/Snapshot.c diff --git a/j2735codec/core/202409/src/SnapshotDistance.c b/j2735codec/core/j2735_202409/src/SnapshotDistance.c similarity index 100% rename from j2735codec/core/202409/src/SnapshotDistance.c rename to j2735codec/core/j2735_202409/src/SnapshotDistance.c diff --git a/j2735codec/core/202409/src/SnapshotTime.c b/j2735codec/core/j2735_202409/src/SnapshotTime.c similarity index 100% rename from j2735codec/core/202409/src/SnapshotTime.c rename to j2735codec/core/j2735_202409/src/SnapshotTime.c diff --git a/j2735codec/core/202409/src/Snow.c b/j2735codec/core/j2735_202409/src/Snow.c similarity index 100% rename from j2735codec/core/202409/src/Snow.c rename to j2735codec/core/j2735_202409/src/Snow.c diff --git a/j2735codec/core/202409/src/SnowType.c b/j2735codec/core/j2735_202409/src/SnowType.c similarity index 100% rename from j2735codec/core/202409/src/SnowType.c rename to j2735codec/core/j2735_202409/src/SnowType.c diff --git a/j2735codec/core/202409/src/SoundLevel.c b/j2735codec/core/j2735_202409/src/SoundLevel.c similarity index 100% rename from j2735codec/core/202409/src/SoundLevel.c rename to j2735codec/core/j2735_202409/src/SoundLevel.c diff --git a/j2735codec/core/202409/src/SpecialCharges.c b/j2735codec/core/j2735_202409/src/SpecialCharges.c similarity index 100% rename from j2735codec/core/202409/src/SpecialCharges.c rename to j2735codec/core/j2735_202409/src/SpecialCharges.c diff --git a/j2735codec/core/202409/src/SpecialEvents.c b/j2735codec/core/j2735_202409/src/SpecialEvents.c similarity index 100% rename from j2735codec/core/202409/src/SpecialEvents.c rename to j2735codec/core/j2735_202409/src/SpecialEvents.c diff --git a/j2735codec/core/202409/src/SpecialVehicleExtensions.c b/j2735codec/core/j2735_202409/src/SpecialVehicleExtensions.c similarity index 100% rename from j2735codec/core/202409/src/SpecialVehicleExtensions.c rename to j2735codec/core/j2735_202409/src/SpecialVehicleExtensions.c diff --git a/j2735codec/core/202409/src/Speed.c b/j2735codec/core/j2735_202409/src/Speed.c similarity index 100% rename from j2735codec/core/202409/src/Speed.c rename to j2735codec/core/j2735_202409/src/Speed.c diff --git a/j2735codec/core/202409/src/SpeedAdvice.c b/j2735codec/core/j2735_202409/src/SpeedAdvice.c similarity index 100% rename from j2735codec/core/202409/src/SpeedAdvice.c rename to j2735codec/core/j2735_202409/src/SpeedAdvice.c diff --git a/j2735codec/core/202409/src/SpeedConfidence.c b/j2735codec/core/j2735_202409/src/SpeedConfidence.c similarity index 100% rename from j2735codec/core/202409/src/SpeedConfidence.c rename to j2735codec/core/j2735_202409/src/SpeedConfidence.c diff --git a/j2735codec/core/202409/src/SpeedLimit.c b/j2735codec/core/j2735_202409/src/SpeedLimit.c similarity index 100% rename from j2735codec/core/202409/src/SpeedLimit.c rename to j2735codec/core/j2735_202409/src/SpeedLimit.c diff --git a/j2735codec/core/202409/src/SpeedLimitList.c b/j2735codec/core/j2735_202409/src/SpeedLimitList.c similarity index 100% rename from j2735codec/core/202409/src/SpeedLimitList.c rename to j2735codec/core/j2735_202409/src/SpeedLimitList.c diff --git a/j2735codec/core/202409/src/SpeedLimitType.c b/j2735codec/core/j2735_202409/src/SpeedLimitType.c similarity index 100% rename from j2735codec/core/202409/src/SpeedLimitType.c rename to j2735codec/core/j2735_202409/src/SpeedLimitType.c diff --git a/j2735codec/core/202409/src/SpeedProfile.c b/j2735codec/core/j2735_202409/src/SpeedProfile.c similarity index 100% rename from j2735codec/core/202409/src/SpeedProfile.c rename to j2735codec/core/j2735_202409/src/SpeedProfile.c diff --git a/j2735codec/core/202409/src/SpeedProfileMeasurement.c b/j2735codec/core/j2735_202409/src/SpeedProfileMeasurement.c similarity index 100% rename from j2735codec/core/202409/src/SpeedProfileMeasurement.c rename to j2735codec/core/j2735_202409/src/SpeedProfileMeasurement.c diff --git a/j2735codec/core/202409/src/SpeedProfileMeasurementList.c b/j2735codec/core/j2735_202409/src/SpeedProfileMeasurementList.c similarity index 100% rename from j2735codec/core/202409/src/SpeedProfileMeasurementList.c rename to j2735codec/core/j2735_202409/src/SpeedProfileMeasurementList.c diff --git a/j2735codec/core/202409/src/SpeedandHeadingandThrottleConfidence.c b/j2735codec/core/j2735_202409/src/SpeedandHeadingandThrottleConfidence.c similarity index 100% rename from j2735codec/core/202409/src/SpeedandHeadingandThrottleConfidence.c rename to j2735codec/core/j2735_202409/src/SpeedandHeadingandThrottleConfidence.c diff --git a/j2735codec/core/202409/src/SportingEvents.c b/j2735codec/core/j2735_202409/src/SportingEvents.c similarity index 100% rename from j2735codec/core/202409/src/SportingEvents.c rename to j2735codec/core/j2735_202409/src/SportingEvents.c diff --git a/j2735codec/core/202409/src/StabilityControlStatus.c b/j2735codec/core/j2735_202409/src/StabilityControlStatus.c similarity index 100% rename from j2735codec/core/202409/src/StabilityControlStatus.c rename to j2735codec/core/j2735_202409/src/StabilityControlStatus.c diff --git a/j2735codec/core/202409/src/StatesAndTerritories.c b/j2735codec/core/j2735_202409/src/StatesAndTerritories.c similarity index 100% rename from j2735codec/core/202409/src/StatesAndTerritories.c rename to j2735codec/core/j2735_202409/src/StatesAndTerritories.c diff --git a/j2735codec/core/202409/src/StationID.c b/j2735codec/core/j2735_202409/src/StationID.c similarity index 100% rename from j2735codec/core/202409/src/StationID.c rename to j2735codec/core/j2735_202409/src/StationID.c diff --git a/j2735codec/core/202409/src/StationType.c b/j2735codec/core/j2735_202409/src/StationType.c similarity index 100% rename from j2735codec/core/202409/src/StationType.c rename to j2735codec/core/j2735_202409/src/StationType.c diff --git a/j2735codec/core/202409/src/StdDev.c b/j2735codec/core/j2735_202409/src/StdDev.c similarity index 100% rename from j2735codec/core/202409/src/StdDev.c rename to j2735codec/core/j2735_202409/src/StdDev.c diff --git a/j2735codec/core/202409/src/SteeringAxleLubePressure.c b/j2735codec/core/j2735_202409/src/SteeringAxleLubePressure.c similarity index 100% rename from j2735codec/core/202409/src/SteeringAxleLubePressure.c rename to j2735codec/core/j2735_202409/src/SteeringAxleLubePressure.c diff --git a/j2735codec/core/202409/src/SteeringAxleTemperature.c b/j2735codec/core/j2735_202409/src/SteeringAxleTemperature.c similarity index 100% rename from j2735codec/core/202409/src/SteeringAxleTemperature.c rename to j2735codec/core/j2735_202409/src/SteeringAxleTemperature.c diff --git a/j2735codec/core/202409/src/SteeringWheelAngle.c b/j2735codec/core/j2735_202409/src/SteeringWheelAngle.c similarity index 100% rename from j2735codec/core/202409/src/SteeringWheelAngle.c rename to j2735codec/core/j2735_202409/src/SteeringWheelAngle.c diff --git a/j2735codec/core/202409/src/SteeringWheelAngleConfidence.c b/j2735codec/core/j2735_202409/src/SteeringWheelAngleConfidence.c similarity index 100% rename from j2735codec/core/202409/src/SteeringWheelAngleConfidence.c rename to j2735codec/core/j2735_202409/src/SteeringWheelAngleConfidence.c diff --git a/j2735codec/core/202409/src/SteeringWheelAngleRateOfChange.c b/j2735codec/core/j2735_202409/src/SteeringWheelAngleRateOfChange.c similarity index 100% rename from j2735codec/core/202409/src/SteeringWheelAngleRateOfChange.c rename to j2735codec/core/j2735_202409/src/SteeringWheelAngleRateOfChange.c diff --git a/j2735codec/core/202409/src/StreetSuffixes.c b/j2735codec/core/j2735_202409/src/StreetSuffixes.c similarity index 100% rename from j2735codec/core/202409/src/StreetSuffixes.c rename to j2735codec/core/j2735_202409/src/StreetSuffixes.c diff --git a/j2735codec/core/202409/src/Structures.c b/j2735codec/core/j2735_202409/src/Structures.c similarity index 100% rename from j2735codec/core/202409/src/Structures.c rename to j2735codec/core/j2735_202409/src/Structures.c diff --git a/j2735codec/core/202409/src/SubManeuver.c b/j2735codec/core/j2735_202409/src/SubManeuver.c similarity index 100% rename from j2735codec/core/202409/src/SubManeuver.c rename to j2735codec/core/j2735_202409/src/SubManeuver.c diff --git a/j2735codec/core/202409/src/SubManeuverList.c b/j2735codec/core/j2735_202409/src/SubManeuverList.c similarity index 100% rename from j2735codec/core/202409/src/SubManeuverList.c rename to j2735codec/core/j2735_202409/src/SubManeuverList.c diff --git a/j2735codec/core/202409/src/SubRegionChargingInfo.c b/j2735codec/core/j2735_202409/src/SubRegionChargingInfo.c similarity index 100% rename from j2735codec/core/202409/src/SubRegionChargingInfo.c rename to j2735codec/core/j2735_202409/src/SubRegionChargingInfo.c diff --git a/j2735codec/core/202409/src/SuggestionAdvice.c b/j2735codec/core/j2735_202409/src/SuggestionAdvice.c similarity index 100% rename from j2735codec/core/202409/src/SuggestionAdvice.c rename to j2735codec/core/j2735_202409/src/SuggestionAdvice.c diff --git a/j2735codec/core/202409/src/SummerTime.c b/j2735codec/core/j2735_202409/src/SummerTime.c similarity index 100% rename from j2735codec/core/202409/src/SummerTime.c rename to j2735codec/core/j2735_202409/src/SummerTime.c diff --git a/j2735codec/core/202409/src/SunSensor.c b/j2735codec/core/j2735_202409/src/SunSensor.c similarity index 100% rename from j2735codec/core/202409/src/SunSensor.c rename to j2735codec/core/j2735_202409/src/SunSensor.c diff --git a/j2735codec/core/202409/src/SupplementalVehicleExtensions.c b/j2735codec/core/j2735_202409/src/SupplementalVehicleExtensions.c similarity index 100% rename from j2735codec/core/202409/src/SupplementalVehicleExtensions.c rename to j2735codec/core/j2735_202409/src/SupplementalVehicleExtensions.c diff --git a/j2735codec/core/202409/src/SurfaceTempMeasurementStdDev.c b/j2735codec/core/j2735_202409/src/SurfaceTempMeasurementStdDev.c similarity index 100% rename from j2735codec/core/202409/src/SurfaceTempMeasurementStdDev.c rename to j2735codec/core/j2735_202409/src/SurfaceTempMeasurementStdDev.c diff --git a/j2735codec/core/202409/src/SurroundingVehicleInfo.c b/j2735codec/core/j2735_202409/src/SurroundingVehicleInfo.c similarity index 100% rename from j2735codec/core/202409/src/SurroundingVehicleInfo.c rename to j2735codec/core/j2735_202409/src/SurroundingVehicleInfo.c diff --git a/j2735codec/core/202409/src/SystemInformation.c b/j2735codec/core/j2735_202409/src/SystemInformation.c similarity index 100% rename from j2735codec/core/202409/src/SystemInformation.c rename to j2735codec/core/j2735_202409/src/SystemInformation.c diff --git a/j2735codec/core/202409/src/TRRLength.c b/j2735codec/core/j2735_202409/src/TRRLength.c similarity index 100% rename from j2735codec/core/202409/src/TRRLength.c rename to j2735codec/core/j2735_202409/src/TRRLength.c diff --git a/j2735codec/core/202409/src/TRRLocation.c b/j2735codec/core/j2735_202409/src/TRRLocation.c similarity index 100% rename from j2735codec/core/202409/src/TRRLocation.c rename to j2735codec/core/j2735_202409/src/TRRLocation.c diff --git a/j2735codec/core/202409/src/TRRLocationType1.c b/j2735codec/core/j2735_202409/src/TRRLocationType1.c similarity index 100% rename from j2735codec/core/202409/src/TRRLocationType1.c rename to j2735codec/core/j2735_202409/src/TRRLocationType1.c diff --git a/j2735codec/core/202409/src/TRRLocationType2.c b/j2735codec/core/j2735_202409/src/TRRLocationType2.c similarity index 100% rename from j2735codec/core/202409/src/TRRLocationType2.c rename to j2735codec/core/j2735_202409/src/TRRLocationType2.c diff --git a/j2735codec/core/202409/src/TRRLocationType3.c b/j2735codec/core/j2735_202409/src/TRRLocationType3.c similarity index 100% rename from j2735codec/core/202409/src/TRRLocationType3.c rename to j2735codec/core/j2735_202409/src/TRRLocationType3.c diff --git a/j2735codec/core/202409/src/TRRType.c b/j2735codec/core/j2735_202409/src/TRRType.c similarity index 100% rename from j2735codec/core/202409/src/TRRType.c rename to j2735codec/core/j2735_202409/src/TRRType.c diff --git a/j2735codec/core/202409/src/TargetRoadResource.c b/j2735codec/core/j2735_202409/src/TargetRoadResource.c similarity index 100% rename from j2735codec/core/202409/src/TargetRoadResource.c rename to j2735codec/core/j2735_202409/src/TargetRoadResource.c diff --git a/j2735codec/core/202409/src/TariffClassDescription.c b/j2735codec/core/j2735_202409/src/TariffClassDescription.c similarity index 100% rename from j2735codec/core/202409/src/TariffClassDescription.c rename to j2735codec/core/j2735_202409/src/TariffClassDescription.c diff --git a/j2735codec/core/202409/src/TariffClassId.c b/j2735codec/core/j2735_202409/src/TariffClassId.c similarity index 100% rename from j2735codec/core/202409/src/TariffClassId.c rename to j2735codec/core/j2735_202409/src/TariffClassId.c diff --git a/j2735codec/core/202409/src/Temperature.c b/j2735codec/core/j2735_202409/src/Temperature.c similarity index 100% rename from j2735codec/core/202409/src/Temperature.c rename to j2735codec/core/j2735_202409/src/Temperature.c diff --git a/j2735codec/core/202409/src/TemperatureMeasurementStdDev.c b/j2735codec/core/j2735_202409/src/TemperatureMeasurementStdDev.c similarity index 100% rename from j2735codec/core/202409/src/TemperatureMeasurementStdDev.c rename to j2735codec/core/j2735_202409/src/TemperatureMeasurementStdDev.c diff --git a/j2735codec/core/202409/src/TemporaryID.c b/j2735codec/core/j2735_202409/src/TemporaryID.c similarity index 100% rename from j2735codec/core/202409/src/TemporaryID.c rename to j2735codec/core/j2735_202409/src/TemporaryID.c diff --git a/j2735codec/core/202409/src/TemporaryIDList.c b/j2735codec/core/j2735_202409/src/TemporaryIDList.c similarity index 100% rename from j2735codec/core/202409/src/TemporaryIDList.c rename to j2735codec/core/j2735_202409/src/TemporaryIDList.c diff --git a/j2735codec/core/202409/src/TemporaryIDPointer.c b/j2735codec/core/j2735_202409/src/TemporaryIDPointer.c similarity index 100% rename from j2735codec/core/202409/src/TemporaryIDPointer.c rename to j2735codec/core/j2735_202409/src/TemporaryIDPointer.c diff --git a/j2735codec/core/202409/src/TenthSecond.c b/j2735codec/core/j2735_202409/src/TenthSecond.c similarity index 100% rename from j2735codec/core/202409/src/TenthSecond.c rename to j2735codec/core/j2735_202409/src/TenthSecond.c diff --git a/j2735codec/core/202409/src/TermDistance.c b/j2735codec/core/j2735_202409/src/TermDistance.c similarity index 100% rename from j2735codec/core/202409/src/TermDistance.c rename to j2735codec/core/j2735_202409/src/TermDistance.c diff --git a/j2735codec/core/202409/src/TermTime.c b/j2735codec/core/j2735_202409/src/TermTime.c similarity index 100% rename from j2735codec/core/202409/src/TermTime.c rename to j2735codec/core/j2735_202409/src/TermTime.c diff --git a/j2735codec/core/202409/src/TestMessage00.c b/j2735codec/core/j2735_202409/src/TestMessage00.c similarity index 100% rename from j2735codec/core/202409/src/TestMessage00.c rename to j2735codec/core/j2735_202409/src/TestMessage00.c diff --git a/j2735codec/core/202409/src/TestMessage01.c b/j2735codec/core/j2735_202409/src/TestMessage01.c similarity index 100% rename from j2735codec/core/202409/src/TestMessage01.c rename to j2735codec/core/j2735_202409/src/TestMessage01.c diff --git a/j2735codec/core/202409/src/TestMessage02.c b/j2735codec/core/j2735_202409/src/TestMessage02.c similarity index 100% rename from j2735codec/core/202409/src/TestMessage02.c rename to j2735codec/core/j2735_202409/src/TestMessage02.c diff --git a/j2735codec/core/202409/src/TestMessage03.c b/j2735codec/core/j2735_202409/src/TestMessage03.c similarity index 100% rename from j2735codec/core/202409/src/TestMessage03.c rename to j2735codec/core/j2735_202409/src/TestMessage03.c diff --git a/j2735codec/core/202409/src/TestMessage04.c b/j2735codec/core/j2735_202409/src/TestMessage04.c similarity index 100% rename from j2735codec/core/202409/src/TestMessage04.c rename to j2735codec/core/j2735_202409/src/TestMessage04.c diff --git a/j2735codec/core/202409/src/TestMessage05.c b/j2735codec/core/j2735_202409/src/TestMessage05.c similarity index 100% rename from j2735codec/core/202409/src/TestMessage05.c rename to j2735codec/core/j2735_202409/src/TestMessage05.c diff --git a/j2735codec/core/202409/src/TestMessage06.c b/j2735codec/core/j2735_202409/src/TestMessage06.c similarity index 100% rename from j2735codec/core/202409/src/TestMessage06.c rename to j2735codec/core/j2735_202409/src/TestMessage06.c diff --git a/j2735codec/core/202409/src/TestMessage07.c b/j2735codec/core/j2735_202409/src/TestMessage07.c similarity index 100% rename from j2735codec/core/202409/src/TestMessage07.c rename to j2735codec/core/j2735_202409/src/TestMessage07.c diff --git a/j2735codec/core/202409/src/TestMessage08.c b/j2735codec/core/j2735_202409/src/TestMessage08.c similarity index 100% rename from j2735codec/core/202409/src/TestMessage08.c rename to j2735codec/core/j2735_202409/src/TestMessage08.c diff --git a/j2735codec/core/202409/src/TestMessage09.c b/j2735codec/core/j2735_202409/src/TestMessage09.c similarity index 100% rename from j2735codec/core/202409/src/TestMessage09.c rename to j2735codec/core/j2735_202409/src/TestMessage09.c diff --git a/j2735codec/core/202409/src/TestMessage10.c b/j2735codec/core/j2735_202409/src/TestMessage10.c similarity index 100% rename from j2735codec/core/202409/src/TestMessage10.c rename to j2735codec/core/j2735_202409/src/TestMessage10.c diff --git a/j2735codec/core/202409/src/TestMessage11.c b/j2735codec/core/j2735_202409/src/TestMessage11.c similarity index 100% rename from j2735codec/core/202409/src/TestMessage11.c rename to j2735codec/core/j2735_202409/src/TestMessage11.c diff --git a/j2735codec/core/202409/src/TestMessage12.c b/j2735codec/core/j2735_202409/src/TestMessage12.c similarity index 100% rename from j2735codec/core/202409/src/TestMessage12.c rename to j2735codec/core/j2735_202409/src/TestMessage12.c diff --git a/j2735codec/core/202409/src/TestMessage13.c b/j2735codec/core/j2735_202409/src/TestMessage13.c similarity index 100% rename from j2735codec/core/202409/src/TestMessage13.c rename to j2735codec/core/j2735_202409/src/TestMessage13.c diff --git a/j2735codec/core/202409/src/TestMessage14.c b/j2735codec/core/j2735_202409/src/TestMessage14.c similarity index 100% rename from j2735codec/core/202409/src/TestMessage14.c rename to j2735codec/core/j2735_202409/src/TestMessage14.c diff --git a/j2735codec/core/202409/src/TestMessage15.c b/j2735codec/core/j2735_202409/src/TestMessage15.c similarity index 100% rename from j2735codec/core/202409/src/TestMessage15.c rename to j2735codec/core/j2735_202409/src/TestMessage15.c diff --git a/j2735codec/core/202409/src/ThrottleConfidence.c b/j2735codec/core/j2735_202409/src/ThrottleConfidence.c similarity index 100% rename from j2735codec/core/202409/src/ThrottleConfidence.c rename to j2735codec/core/j2735_202409/src/ThrottleConfidence.c diff --git a/j2735codec/core/202409/src/ThrottlePosition.c b/j2735codec/core/j2735_202409/src/ThrottlePosition.c similarity index 100% rename from j2735codec/core/202409/src/ThrottlePosition.c rename to j2735codec/core/j2735_202409/src/ThrottlePosition.c diff --git a/j2735codec/core/202409/src/TimeChangeDetails.c b/j2735codec/core/j2735_202409/src/TimeChangeDetails.c similarity index 100% rename from j2735codec/core/202409/src/TimeChangeDetails.c rename to j2735codec/core/j2735_202409/src/TimeChangeDetails.c diff --git a/j2735codec/core/202409/src/TimeChargesTable.c b/j2735codec/core/j2735_202409/src/TimeChargesTable.c similarity index 100% rename from j2735codec/core/202409/src/TimeChargesTable.c rename to j2735codec/core/j2735_202409/src/TimeChargesTable.c diff --git a/j2735codec/core/202409/src/TimeClassId.c b/j2735codec/core/j2735_202409/src/TimeClassId.c similarity index 100% rename from j2735codec/core/202409/src/TimeClassId.c rename to j2735codec/core/j2735_202409/src/TimeClassId.c diff --git a/j2735codec/core/202409/src/TimeCompact.c b/j2735codec/core/j2735_202409/src/TimeCompact.c similarity index 100% rename from j2735codec/core/202409/src/TimeCompact.c rename to j2735codec/core/j2735_202409/src/TimeCompact.c diff --git a/j2735codec/core/202409/src/TimeConfidence.c b/j2735codec/core/j2735_202409/src/TimeConfidence.c similarity index 100% rename from j2735codec/core/202409/src/TimeConfidence.c rename to j2735codec/core/j2735_202409/src/TimeConfidence.c diff --git a/j2735codec/core/202409/src/TimeConstant.c b/j2735codec/core/j2735_202409/src/TimeConstant.c similarity index 100% rename from j2735codec/core/202409/src/TimeConstant.c rename to j2735codec/core/j2735_202409/src/TimeConstant.c diff --git a/j2735codec/core/202409/src/TimeInSecond-B16.c b/j2735codec/core/j2735_202409/src/TimeInSecond-B16.c similarity index 100% rename from j2735codec/core/202409/src/TimeInSecond-B16.c rename to j2735codec/core/j2735_202409/src/TimeInSecond-B16.c diff --git a/j2735codec/core/202409/src/TimeInSecond-B8.c b/j2735codec/core/j2735_202409/src/TimeInSecond-B8.c similarity index 100% rename from j2735codec/core/202409/src/TimeInSecond-B8.c rename to j2735codec/core/j2735_202409/src/TimeInSecond-B8.c diff --git a/j2735codec/core/202409/src/TimeIntervalConfidence.c b/j2735codec/core/j2735_202409/src/TimeIntervalConfidence.c similarity index 100% rename from j2735codec/core/202409/src/TimeIntervalConfidence.c rename to j2735codec/core/j2735_202409/src/TimeIntervalConfidence.c diff --git a/j2735codec/core/202409/src/TimeOffset.c b/j2735codec/core/j2735_202409/src/TimeOffset.c similarity index 100% rename from j2735codec/core/202409/src/TimeOffset.c rename to j2735codec/core/j2735_202409/src/TimeOffset.c diff --git a/j2735codec/core/202409/src/TimePeriod.c b/j2735codec/core/j2735_202409/src/TimePeriod.c similarity index 100% rename from j2735codec/core/202409/src/TimePeriod.c rename to j2735codec/core/j2735_202409/src/TimePeriod.c diff --git a/j2735codec/core/202409/src/TimeRemaining.c b/j2735codec/core/j2735_202409/src/TimeRemaining.c similarity index 100% rename from j2735codec/core/202409/src/TimeRemaining.c rename to j2735codec/core/j2735_202409/src/TimeRemaining.c diff --git a/j2735codec/core/202409/src/TimeUnit.c b/j2735codec/core/j2735_202409/src/TimeUnit.c similarity index 100% rename from j2735codec/core/202409/src/TimeUnit.c rename to j2735codec/core/j2735_202409/src/TimeUnit.c diff --git a/j2735codec/core/202409/src/TireData.c b/j2735codec/core/j2735_202409/src/TireData.c similarity index 100% rename from j2735codec/core/202409/src/TireData.c rename to j2735codec/core/j2735_202409/src/TireData.c diff --git a/j2735codec/core/202409/src/TireDataList.c b/j2735codec/core/j2735_202409/src/TireDataList.c similarity index 100% rename from j2735codec/core/202409/src/TireDataList.c rename to j2735codec/core/j2735_202409/src/TireDataList.c diff --git a/j2735codec/core/202409/src/TireLeakageRate.c b/j2735codec/core/j2735_202409/src/TireLeakageRate.c similarity index 100% rename from j2735codec/core/202409/src/TireLeakageRate.c rename to j2735codec/core/j2735_202409/src/TireLeakageRate.c diff --git a/j2735codec/core/202409/src/TireLocation.c b/j2735codec/core/j2735_202409/src/TireLocation.c similarity index 100% rename from j2735codec/core/202409/src/TireLocation.c rename to j2735codec/core/j2735_202409/src/TireLocation.c diff --git a/j2735codec/core/202409/src/TirePressure.c b/j2735codec/core/j2735_202409/src/TirePressure.c similarity index 100% rename from j2735codec/core/202409/src/TirePressure.c rename to j2735codec/core/j2735_202409/src/TirePressure.c diff --git a/j2735codec/core/202409/src/TirePressureThresholdDetection.c b/j2735codec/core/j2735_202409/src/TirePressureThresholdDetection.c similarity index 100% rename from j2735codec/core/202409/src/TirePressureThresholdDetection.c rename to j2735codec/core/j2735_202409/src/TirePressureThresholdDetection.c diff --git a/j2735codec/core/202409/src/TireTemp.c b/j2735codec/core/j2735_202409/src/TireTemp.c similarity index 100% rename from j2735codec/core/202409/src/TireTemp.c rename to j2735codec/core/j2735_202409/src/TireTemp.c diff --git a/j2735codec/core/202409/src/Tolerance.c b/j2735codec/core/j2735_202409/src/Tolerance.c similarity index 100% rename from j2735codec/core/202409/src/Tolerance.c rename to j2735codec/core/j2735_202409/src/Tolerance.c diff --git a/j2735codec/core/202409/src/TollAdvertisementInfo.c b/j2735codec/core/j2735_202409/src/TollAdvertisementInfo.c similarity index 100% rename from j2735codec/core/202409/src/TollAdvertisementInfo.c rename to j2735codec/core/j2735_202409/src/TollAdvertisementInfo.c diff --git a/j2735codec/core/202409/src/TollAdvertisementMessage.c b/j2735codec/core/j2735_202409/src/TollAdvertisementMessage.c similarity index 100% rename from j2735codec/core/202409/src/TollAdvertisementMessage.c rename to j2735codec/core/j2735_202409/src/TollAdvertisementMessage.c diff --git a/j2735codec/core/202409/src/TollChargerInfo.c b/j2735codec/core/j2735_202409/src/TollChargerInfo.c similarity index 100% rename from j2735codec/core/202409/src/TollChargerInfo.c rename to j2735codec/core/j2735_202409/src/TollChargerInfo.c diff --git a/j2735codec/core/202409/src/TollChargesTable.c b/j2735codec/core/j2735_202409/src/TollChargesTable.c similarity index 100% rename from j2735codec/core/202409/src/TollChargesTable.c rename to j2735codec/core/j2735_202409/src/TollChargesTable.c diff --git a/j2735codec/core/202409/src/TollPointID.c b/j2735codec/core/j2735_202409/src/TollPointID.c similarity index 100% rename from j2735codec/core/202409/src/TollPointID.c rename to j2735codec/core/j2735_202409/src/TollPointID.c diff --git a/j2735codec/core/202409/src/TollPointMap.c b/j2735codec/core/j2735_202409/src/TollPointMap.c similarity index 100% rename from j2735codec/core/202409/src/TollPointMap.c rename to j2735codec/core/j2735_202409/src/TollPointMap.c diff --git a/j2735codec/core/202409/src/TollServiceProviderData.c b/j2735codec/core/j2735_202409/src/TollServiceProviderData.c similarity index 100% rename from j2735codec/core/202409/src/TollServiceProviderData.c rename to j2735codec/core/j2735_202409/src/TollServiceProviderData.c diff --git a/j2735codec/core/202409/src/TollUsageAckMessage.c b/j2735codec/core/j2735_202409/src/TollUsageAckMessage.c similarity index 100% rename from j2735codec/core/202409/src/TollUsageAckMessage.c rename to j2735codec/core/j2735_202409/src/TollUsageAckMessage.c diff --git a/j2735codec/core/202409/src/TollUsageMessage.c b/j2735codec/core/j2735_202409/src/TollUsageMessage.c similarity index 100% rename from j2735codec/core/202409/src/TollUsageMessage.c rename to j2735codec/core/j2735_202409/src/TollUsageMessage.c diff --git a/j2735codec/core/202409/src/TollUserData.c b/j2735codec/core/j2735_202409/src/TollUserData.c similarity index 100% rename from j2735codec/core/202409/src/TollUserData.c rename to j2735codec/core/j2735_202409/src/TollUserData.c diff --git a/j2735codec/core/202409/src/TollVehicleId.c b/j2735codec/core/j2735_202409/src/TollVehicleId.c similarity index 100% rename from j2735codec/core/202409/src/TollVehicleId.c rename to j2735codec/core/j2735_202409/src/TollVehicleId.c diff --git a/j2735codec/core/202409/src/Torque.c b/j2735codec/core/j2735_202409/src/Torque.c similarity index 100% rename from j2735codec/core/202409/src/Torque.c rename to j2735codec/core/j2735_202409/src/Torque.c diff --git a/j2735codec/core/202409/src/TotalMass.c b/j2735codec/core/j2735_202409/src/TotalMass.c similarity index 100% rename from j2735codec/core/202409/src/TotalMass.c rename to j2735codec/core/j2735_202409/src/TotalMass.c diff --git a/j2735codec/core/202409/src/TotalWeightCharges.c b/j2735codec/core/j2735_202409/src/TotalWeightCharges.c similarity index 100% rename from j2735codec/core/202409/src/TotalWeightCharges.c rename to j2735codec/core/j2735_202409/src/TotalWeightCharges.c diff --git a/j2735codec/core/202409/src/TractionControlStatus.c b/j2735codec/core/j2735_202409/src/TractionControlStatus.c similarity index 100% rename from j2735codec/core/202409/src/TractionControlStatus.c rename to j2735codec/core/j2735_202409/src/TractionControlStatus.c diff --git a/j2735codec/core/202409/src/TrafficConditions.c b/j2735codec/core/j2735_202409/src/TrafficConditions.c similarity index 100% rename from j2735codec/core/202409/src/TrafficConditions.c rename to j2735codec/core/j2735_202409/src/TrafficConditions.c diff --git a/j2735codec/core/202409/src/TrafficLightControllerStatus.c b/j2735codec/core/j2735_202409/src/TrafficLightControllerStatus.c similarity index 100% rename from j2735codec/core/202409/src/TrafficLightControllerStatus.c rename to j2735codec/core/j2735_202409/src/TrafficLightControllerStatus.c diff --git a/j2735codec/core/202409/src/TrafficLightDirectionCode.c b/j2735codec/core/j2735_202409/src/TrafficLightDirectionCode.c similarity index 100% rename from j2735codec/core/202409/src/TrafficLightDirectionCode.c rename to j2735codec/core/j2735_202409/src/TrafficLightDirectionCode.c diff --git a/j2735codec/core/202409/src/TrafficLightID.c b/j2735codec/core/j2735_202409/src/TrafficLightID.c similarity index 100% rename from j2735codec/core/202409/src/TrafficLightID.c rename to j2735codec/core/j2735_202409/src/TrafficLightID.c diff --git a/j2735codec/core/202409/src/TrafficLightIntervalType.c b/j2735codec/core/j2735_202409/src/TrafficLightIntervalType.c similarity index 100% rename from j2735codec/core/202409/src/TrafficLightIntervalType.c rename to j2735codec/core/j2735_202409/src/TrafficLightIntervalType.c diff --git a/j2735codec/core/202409/src/TrafficLightOperationStatus.c b/j2735codec/core/j2735_202409/src/TrafficLightOperationStatus.c similarity index 100% rename from j2735codec/core/202409/src/TrafficLightOperationStatus.c rename to j2735codec/core/j2735_202409/src/TrafficLightOperationStatus.c diff --git a/j2735codec/core/202409/src/TrafficLightStatus.c b/j2735codec/core/j2735_202409/src/TrafficLightStatus.c similarity index 100% rename from j2735codec/core/202409/src/TrafficLightStatus.c rename to j2735codec/core/j2735_202409/src/TrafficLightStatus.c diff --git a/j2735codec/core/202409/src/TrafficLightStatusList.c b/j2735codec/core/j2735_202409/src/TrafficLightStatusList.c similarity index 100% rename from j2735codec/core/202409/src/TrafficLightStatusList.c rename to j2735codec/core/j2735_202409/src/TrafficLightStatusList.c diff --git a/j2735codec/core/202409/src/TrafficLightStatusMessage.c b/j2735codec/core/j2735_202409/src/TrafficLightStatusMessage.c similarity index 100% rename from j2735codec/core/202409/src/TrafficLightStatusMessage.c rename to j2735codec/core/j2735_202409/src/TrafficLightStatusMessage.c diff --git a/j2735codec/core/202409/src/TrafficLightType.c b/j2735codec/core/j2735_202409/src/TrafficLightType.c similarity index 100% rename from j2735codec/core/202409/src/TrafficLightType.c rename to j2735codec/core/j2735_202409/src/TrafficLightType.c diff --git a/j2735codec/core/202409/src/TrafficLightingStatus.c b/j2735codec/core/j2735_202409/src/TrafficLightingStatus.c similarity index 100% rename from j2735codec/core/202409/src/TrafficLightingStatus.c rename to j2735codec/core/j2735_202409/src/TrafficLightingStatus.c diff --git a/j2735codec/core/202409/src/TrafficSignalPhaseAndTiming.c b/j2735codec/core/j2735_202409/src/TrafficSignalPhaseAndTiming.c similarity index 100% rename from j2735codec/core/202409/src/TrafficSignalPhaseAndTiming.c rename to j2735codec/core/j2735_202409/src/TrafficSignalPhaseAndTiming.c diff --git a/j2735codec/core/202409/src/TrailerCharacteristics.c b/j2735codec/core/j2735_202409/src/TrailerCharacteristics.c similarity index 100% rename from j2735codec/core/202409/src/TrailerCharacteristics.c rename to j2735codec/core/j2735_202409/src/TrailerCharacteristics.c diff --git a/j2735codec/core/202409/src/TrailerData.c b/j2735codec/core/j2735_202409/src/TrailerData.c similarity index 100% rename from j2735codec/core/202409/src/TrailerData.c rename to j2735codec/core/j2735_202409/src/TrailerData.c diff --git a/j2735codec/core/202409/src/TrailerDetails.c b/j2735codec/core/j2735_202409/src/TrailerDetails.c similarity index 100% rename from j2735codec/core/202409/src/TrailerDetails.c rename to j2735codec/core/j2735_202409/src/TrailerDetails.c diff --git a/j2735codec/core/202409/src/TrailerHistoryPoint.c b/j2735codec/core/j2735_202409/src/TrailerHistoryPoint.c similarity index 100% rename from j2735codec/core/202409/src/TrailerHistoryPoint.c rename to j2735codec/core/j2735_202409/src/TrailerHistoryPoint.c diff --git a/j2735codec/core/202409/src/TrailerHistoryPointList.c b/j2735codec/core/j2735_202409/src/TrailerHistoryPointList.c similarity index 100% rename from j2735codec/core/202409/src/TrailerHistoryPointList.c rename to j2735codec/core/j2735_202409/src/TrailerHistoryPointList.c diff --git a/j2735codec/core/202409/src/TrailerMass.c b/j2735codec/core/j2735_202409/src/TrailerMass.c similarity index 100% rename from j2735codec/core/202409/src/TrailerMass.c rename to j2735codec/core/j2735_202409/src/TrailerMass.c diff --git a/j2735codec/core/202409/src/TrailerType.c b/j2735codec/core/j2735_202409/src/TrailerType.c similarity index 100% rename from j2735codec/core/202409/src/TrailerType.c rename to j2735codec/core/j2735_202409/src/TrailerType.c diff --git a/j2735codec/core/202409/src/TrailerUnitDescJ2945Slash1B.c b/j2735codec/core/j2735_202409/src/TrailerUnitDescJ2945Slash1B.c similarity index 100% rename from j2735codec/core/202409/src/TrailerUnitDescJ2945Slash1B.c rename to j2735codec/core/j2735_202409/src/TrailerUnitDescJ2945Slash1B.c diff --git a/j2735codec/core/202409/src/TrailerUnitDescription.c b/j2735codec/core/j2735_202409/src/TrailerUnitDescription.c similarity index 100% rename from j2735codec/core/202409/src/TrailerUnitDescription.c rename to j2735codec/core/j2735_202409/src/TrailerUnitDescription.c diff --git a/j2735codec/core/202409/src/TrailerUnitDescriptionList.c b/j2735codec/core/j2735_202409/src/TrailerUnitDescriptionList.c similarity index 100% rename from j2735codec/core/202409/src/TrailerUnitDescriptionList.c rename to j2735codec/core/j2735_202409/src/TrailerUnitDescriptionList.c diff --git a/j2735codec/core/202409/src/TrailerWeight.c b/j2735codec/core/j2735_202409/src/TrailerWeight.c similarity index 100% rename from j2735codec/core/202409/src/TrailerWeight.c rename to j2735codec/core/j2735_202409/src/TrailerWeight.c diff --git a/j2735codec/core/202409/src/TrailersJ2945Slash1B.c b/j2735codec/core/j2735_202409/src/TrailersJ2945Slash1B.c similarity index 100% rename from j2735codec/core/202409/src/TrailersJ2945Slash1B.c rename to j2735codec/core/j2735_202409/src/TrailersJ2945Slash1B.c diff --git a/j2735codec/core/202409/src/TransitMode.c b/j2735codec/core/j2735_202409/src/TransitMode.c similarity index 100% rename from j2735codec/core/202409/src/TransitMode.c rename to j2735codec/core/j2735_202409/src/TransitMode.c diff --git a/j2735codec/core/202409/src/TransitOperations.c b/j2735codec/core/j2735_202409/src/TransitOperations.c similarity index 100% rename from j2735codec/core/202409/src/TransitOperations.c rename to j2735codec/core/j2735_202409/src/TransitOperations.c diff --git a/j2735codec/core/202409/src/TransitStatus.c b/j2735codec/core/j2735_202409/src/TransitStatus.c similarity index 100% rename from j2735codec/core/202409/src/TransitStatus.c rename to j2735codec/core/j2735_202409/src/TransitStatus.c diff --git a/j2735codec/core/202409/src/TransitVehicleOccupancy.c b/j2735codec/core/j2735_202409/src/TransitVehicleOccupancy.c similarity index 100% rename from j2735codec/core/202409/src/TransitVehicleOccupancy.c rename to j2735codec/core/j2735_202409/src/TransitVehicleOccupancy.c diff --git a/j2735codec/core/202409/src/TransitVehicleStatus.c b/j2735codec/core/j2735_202409/src/TransitVehicleStatus.c similarity index 100% rename from j2735codec/core/202409/src/TransitVehicleStatus.c rename to j2735codec/core/j2735_202409/src/TransitVehicleStatus.c diff --git a/j2735codec/core/202409/src/TransmissionAndSpeed.c b/j2735codec/core/j2735_202409/src/TransmissionAndSpeed.c similarity index 100% rename from j2735codec/core/202409/src/TransmissionAndSpeed.c rename to j2735codec/core/j2735_202409/src/TransmissionAndSpeed.c diff --git a/j2735codec/core/202409/src/TransmissionState.c b/j2735codec/core/j2735_202409/src/TransmissionState.c similarity index 100% rename from j2735codec/core/202409/src/TransmissionState.c rename to j2735codec/core/j2735_202409/src/TransmissionState.c diff --git a/j2735codec/core/202409/src/TravelerDataFrame.c b/j2735codec/core/j2735_202409/src/TravelerDataFrame.c similarity index 100% rename from j2735codec/core/202409/src/TravelerDataFrame.c rename to j2735codec/core/j2735_202409/src/TravelerDataFrame.c diff --git a/j2735codec/core/202409/src/TravelerDataFrameList.c b/j2735codec/core/j2735_202409/src/TravelerDataFrameList.c similarity index 100% rename from j2735codec/core/202409/src/TravelerDataFrameList.c rename to j2735codec/core/j2735_202409/src/TravelerDataFrameList.c diff --git a/j2735codec/core/202409/src/TravelerDataFrameNewPartIIIContent.c b/j2735codec/core/j2735_202409/src/TravelerDataFrameNewPartIIIContent.c similarity index 100% rename from j2735codec/core/202409/src/TravelerDataFrameNewPartIIIContent.c rename to j2735codec/core/j2735_202409/src/TravelerDataFrameNewPartIIIContent.c diff --git a/j2735codec/core/202409/src/TravelerGroupAffected.c b/j2735codec/core/j2735_202409/src/TravelerGroupAffected.c similarity index 100% rename from j2735codec/core/202409/src/TravelerGroupAffected.c rename to j2735codec/core/j2735_202409/src/TravelerGroupAffected.c diff --git a/j2735codec/core/202409/src/TravelerInfoType.c b/j2735codec/core/j2735_202409/src/TravelerInfoType.c similarity index 100% rename from j2735codec/core/202409/src/TravelerInfoType.c rename to j2735codec/core/j2735_202409/src/TravelerInfoType.c diff --git a/j2735codec/core/202409/src/TravelerInformation.c b/j2735codec/core/j2735_202409/src/TravelerInformation.c similarity index 100% rename from j2735codec/core/202409/src/TravelerInformation.c rename to j2735codec/core/j2735_202409/src/TravelerInformation.c diff --git a/j2735codec/core/202409/src/TripInfo.c b/j2735codec/core/j2735_202409/src/TripInfo.c similarity index 100% rename from j2735codec/core/202409/src/TripInfo.c rename to j2735codec/core/j2735_202409/src/TripInfo.c diff --git a/j2735codec/core/202409/src/TumAck.c b/j2735codec/core/j2735_202409/src/TumAck.c similarity index 100% rename from j2735codec/core/202409/src/TumAck.c rename to j2735codec/core/j2735_202409/src/TumAck.c diff --git a/j2735codec/core/202409/src/TumAckHash.c b/j2735codec/core/j2735_202409/src/TumAckHash.c similarity index 100% rename from j2735codec/core/202409/src/TumAckHash.c rename to j2735codec/core/j2735_202409/src/TumAckHash.c diff --git a/j2735codec/core/202409/src/TumData.c b/j2735codec/core/j2735_202409/src/TumData.c similarity index 100% rename from j2735codec/core/202409/src/TumData.c rename to j2735codec/core/j2735_202409/src/TumData.c diff --git a/j2735codec/core/202409/src/TumHash.c b/j2735codec/core/j2735_202409/src/TumHash.c similarity index 100% rename from j2735codec/core/202409/src/TumHash.c rename to j2735codec/core/j2735_202409/src/TumHash.c diff --git a/j2735codec/core/202409/src/TumInstructions.c b/j2735codec/core/j2735_202409/src/TumInstructions.c similarity index 100% rename from j2735codec/core/202409/src/TumInstructions.c rename to j2735codec/core/j2735_202409/src/TumInstructions.c diff --git a/j2735codec/core/202409/src/TyreConfiguration.c b/j2735codec/core/j2735_202409/src/TyreConfiguration.c similarity index 100% rename from j2735codec/core/202409/src/TyreConfiguration.c rename to j2735codec/core/j2735_202409/src/TyreConfiguration.c diff --git a/j2735codec/core/202409/src/URL-Base.c b/j2735codec/core/j2735_202409/src/URL-Base.c similarity index 100% rename from j2735codec/core/202409/src/URL-Base.c rename to j2735codec/core/j2735_202409/src/URL-Base.c diff --git a/j2735codec/core/202409/src/URL-Link.c b/j2735codec/core/j2735_202409/src/URL-Link.c similarity index 100% rename from j2735codec/core/202409/src/URL-Link.c rename to j2735codec/core/j2735_202409/src/URL-Link.c diff --git a/j2735codec/core/202409/src/URL-Short.c b/j2735codec/core/j2735_202409/src/URL-Short.c similarity index 100% rename from j2735codec/core/202409/src/URL-Short.c rename to j2735codec/core/j2735_202409/src/URL-Short.c diff --git a/j2735codec/core/202409/src/UniqueMSGID.c b/j2735codec/core/j2735_202409/src/UniqueMSGID.c similarity index 100% rename from j2735codec/core/202409/src/UniqueMSGID.c rename to j2735codec/core/j2735_202409/src/UniqueMSGID.c diff --git a/j2735codec/core/202409/src/Units.c b/j2735codec/core/j2735_202409/src/Units.c similarity index 100% rename from j2735codec/core/202409/src/Units.c rename to j2735codec/core/j2735_202409/src/Units.c diff --git a/j2735codec/core/202409/src/UnusualDriving.c b/j2735codec/core/j2735_202409/src/UnusualDriving.c similarity index 100% rename from j2735codec/core/202409/src/UnusualDriving.c rename to j2735codec/core/j2735_202409/src/UnusualDriving.c diff --git a/j2735codec/core/202409/src/UsageReport.c b/j2735codec/core/j2735_202409/src/UsageReport.c similarity index 100% rename from j2735codec/core/202409/src/UsageReport.c rename to j2735codec/core/j2735_202409/src/UsageReport.c diff --git a/j2735codec/core/202409/src/UserClassId.c b/j2735codec/core/j2735_202409/src/UserClassId.c similarity index 100% rename from j2735codec/core/202409/src/UserClassId.c rename to j2735codec/core/j2735_202409/src/UserClassId.c diff --git a/j2735codec/core/202409/src/UserData.c b/j2735codec/core/j2735_202409/src/UserData.c similarity index 100% rename from j2735codec/core/202409/src/UserData.c rename to j2735codec/core/j2735_202409/src/UserData.c diff --git a/j2735codec/core/202409/src/UserFeeInfo.c b/j2735codec/core/j2735_202409/src/UserFeeInfo.c similarity index 100% rename from j2735codec/core/202409/src/UserFeeInfo.c rename to j2735codec/core/j2735_202409/src/UserFeeInfo.c diff --git a/j2735codec/core/202409/src/UserId.c b/j2735codec/core/j2735_202409/src/UserId.c similarity index 100% rename from j2735codec/core/202409/src/UserId.c rename to j2735codec/core/j2735_202409/src/UserId.c diff --git a/j2735codec/core/202409/src/UserSizeAndBehaviour.c b/j2735codec/core/j2735_202409/src/UserSizeAndBehaviour.c similarity index 100% rename from j2735codec/core/202409/src/UserSizeAndBehaviour.c rename to j2735codec/core/j2735_202409/src/UserSizeAndBehaviour.c diff --git a/j2735codec/core/202409/src/VINstring.c b/j2735codec/core/j2735_202409/src/VINstring.c similarity index 100% rename from j2735codec/core/202409/src/VINstring.c rename to j2735codec/core/j2735_202409/src/VINstring.c diff --git a/j2735codec/core/202409/src/ValidManeuvers.c b/j2735codec/core/j2735_202409/src/ValidManeuvers.c similarity index 100% rename from j2735codec/core/202409/src/ValidManeuvers.c rename to j2735codec/core/j2735_202409/src/ValidManeuvers.c diff --git a/j2735codec/core/202409/src/ValidRegion.c b/j2735codec/core/j2735_202409/src/ValidRegion.c similarity index 100% rename from j2735codec/core/202409/src/ValidRegion.c rename to j2735codec/core/j2735_202409/src/ValidRegion.c diff --git a/j2735codec/core/202409/src/ValidityOfContract.c b/j2735codec/core/j2735_202409/src/ValidityOfContract.c similarity index 100% rename from j2735codec/core/202409/src/ValidityOfContract.c rename to j2735codec/core/j2735_202409/src/ValidityOfContract.c diff --git a/j2735codec/core/202409/src/VariationStdDev.c b/j2735codec/core/j2735_202409/src/VariationStdDev.c similarity index 100% rename from j2735codec/core/202409/src/VariationStdDev.c rename to j2735codec/core/j2735_202409/src/VariationStdDev.c diff --git a/j2735codec/core/202409/src/VehTypeCharges.c b/j2735codec/core/j2735_202409/src/VehTypeCharges.c similarity index 100% rename from j2735codec/core/202409/src/VehTypeCharges.c rename to j2735codec/core/j2735_202409/src/VehTypeCharges.c diff --git a/j2735codec/core/202409/src/VehTypeChargesTable.c b/j2735codec/core/j2735_202409/src/VehTypeChargesTable.c similarity index 100% rename from j2735codec/core/202409/src/VehTypeChargesTable.c rename to j2735codec/core/j2735_202409/src/VehTypeChargesTable.c diff --git a/j2735codec/core/202409/src/VehicleAuthenticator.c b/j2735codec/core/j2735_202409/src/VehicleAuthenticator.c similarity index 100% rename from j2735codec/core/202409/src/VehicleAuthenticator.c rename to j2735codec/core/j2735_202409/src/VehicleAuthenticator.c diff --git a/j2735codec/core/202409/src/VehicleAxles.c b/j2735codec/core/j2735_202409/src/VehicleAxles.c similarity index 100% rename from j2735codec/core/202409/src/VehicleAxles.c rename to j2735codec/core/j2735_202409/src/VehicleAxles.c diff --git a/j2735codec/core/202409/src/VehicleAxlesAndWeightInfo.c b/j2735codec/core/j2735_202409/src/VehicleAxlesAndWeightInfo.c similarity index 100% rename from j2735codec/core/202409/src/VehicleAxlesAndWeightInfo.c rename to j2735codec/core/j2735_202409/src/VehicleAxlesAndWeightInfo.c diff --git a/j2735codec/core/202409/src/VehicleAxlesNumber.c b/j2735codec/core/j2735_202409/src/VehicleAxlesNumber.c similarity index 100% rename from j2735codec/core/202409/src/VehicleAxlesNumber.c rename to j2735codec/core/j2735_202409/src/VehicleAxlesNumber.c diff --git a/j2735codec/core/202409/src/VehicleClass.c b/j2735codec/core/j2735_202409/src/VehicleClass.c similarity index 100% rename from j2735codec/core/202409/src/VehicleClass.c rename to j2735codec/core/j2735_202409/src/VehicleClass.c diff --git a/j2735codec/core/202409/src/VehicleClassification.c b/j2735codec/core/j2735_202409/src/VehicleClassification.c similarity index 100% rename from j2735codec/core/202409/src/VehicleClassification.c rename to j2735codec/core/j2735_202409/src/VehicleClassification.c diff --git a/j2735codec/core/202409/src/VehicleCurrentMaxTrainWeight.c b/j2735codec/core/j2735_202409/src/VehicleCurrentMaxTrainWeight.c similarity index 100% rename from j2735codec/core/202409/src/VehicleCurrentMaxTrainWeight.c rename to j2735codec/core/j2735_202409/src/VehicleCurrentMaxTrainWeight.c diff --git a/j2735codec/core/202409/src/VehicleData.c b/j2735codec/core/j2735_202409/src/VehicleData.c similarity index 100% rename from j2735codec/core/202409/src/VehicleData.c rename to j2735codec/core/j2735_202409/src/VehicleData.c diff --git a/j2735codec/core/202409/src/VehicleDescription.c b/j2735codec/core/j2735_202409/src/VehicleDescription.c similarity index 100% rename from j2735codec/core/202409/src/VehicleDescription.c rename to j2735codec/core/j2735_202409/src/VehicleDescription.c diff --git a/j2735codec/core/202409/src/VehicleDimensions.c b/j2735codec/core/j2735_202409/src/VehicleDimensions.c similarity index 100% rename from j2735codec/core/202409/src/VehicleDimensions.c rename to j2735codec/core/j2735_202409/src/VehicleDimensions.c diff --git a/j2735codec/core/202409/src/VehicleEventFlags.c b/j2735codec/core/j2735_202409/src/VehicleEventFlags.c similarity index 100% rename from j2735codec/core/202409/src/VehicleEventFlags.c rename to j2735codec/core/j2735_202409/src/VehicleEventFlags.c diff --git a/j2735codec/core/202409/src/VehicleHeight.c b/j2735codec/core/j2735_202409/src/VehicleHeight.c similarity index 100% rename from j2735codec/core/202409/src/VehicleHeight.c rename to j2735codec/core/j2735_202409/src/VehicleHeight.c diff --git a/j2735codec/core/202409/src/VehicleID.c b/j2735codec/core/j2735_202409/src/VehicleID.c similarity index 100% rename from j2735codec/core/202409/src/VehicleID.c rename to j2735codec/core/j2735_202409/src/VehicleID.c diff --git a/j2735codec/core/202409/src/VehicleIdent.c b/j2735codec/core/j2735_202409/src/VehicleIdent.c similarity index 100% rename from j2735codec/core/202409/src/VehicleIdent.c rename to j2735codec/core/j2735_202409/src/VehicleIdent.c diff --git a/j2735codec/core/202409/src/VehicleLength.c b/j2735codec/core/j2735_202409/src/VehicleLength.c similarity index 100% rename from j2735codec/core/202409/src/VehicleLength.c rename to j2735codec/core/j2735_202409/src/VehicleLength.c diff --git a/j2735codec/core/202409/src/VehicleMass.c b/j2735codec/core/j2735_202409/src/VehicleMass.c similarity index 100% rename from j2735codec/core/202409/src/VehicleMass.c rename to j2735codec/core/j2735_202409/src/VehicleMass.c diff --git a/j2735codec/core/202409/src/VehicleReport.c b/j2735codec/core/j2735_202409/src/VehicleReport.c similarity index 100% rename from j2735codec/core/202409/src/VehicleReport.c rename to j2735codec/core/j2735_202409/src/VehicleReport.c diff --git a/j2735codec/core/202409/src/VehicleSafetyExtensions.c b/j2735codec/core/j2735_202409/src/VehicleSafetyExtensions.c similarity index 100% rename from j2735codec/core/202409/src/VehicleSafetyExtensions.c rename to j2735codec/core/j2735_202409/src/VehicleSafetyExtensions.c diff --git a/j2735codec/core/202409/src/VehicleSize.c b/j2735codec/core/j2735_202409/src/VehicleSize.c similarity index 100% rename from j2735codec/core/202409/src/VehicleSize.c rename to j2735codec/core/j2735_202409/src/VehicleSize.c diff --git a/j2735codec/core/202409/src/VehicleSizeConfidence.c b/j2735codec/core/j2735_202409/src/VehicleSizeConfidence.c similarity index 100% rename from j2735codec/core/202409/src/VehicleSizeConfidence.c rename to j2735codec/core/j2735_202409/src/VehicleSizeConfidence.c diff --git a/j2735codec/core/202409/src/VehicleSpecificCharacteristics.c b/j2735codec/core/j2735_202409/src/VehicleSpecificCharacteristics.c similarity index 100% rename from j2735codec/core/202409/src/VehicleSpecificCharacteristics.c rename to j2735codec/core/j2735_202409/src/VehicleSpecificCharacteristics.c diff --git a/j2735codec/core/202409/src/VehicleStatus.c b/j2735codec/core/j2735_202409/src/VehicleStatus.c similarity index 100% rename from j2735codec/core/202409/src/VehicleStatus.c rename to j2735codec/core/j2735_202409/src/VehicleStatus.c diff --git a/j2735codec/core/202409/src/VehicleStatusDeviceTypeTag.c b/j2735codec/core/j2735_202409/src/VehicleStatusDeviceTypeTag.c similarity index 100% rename from j2735codec/core/202409/src/VehicleStatusDeviceTypeTag.c rename to j2735codec/core/j2735_202409/src/VehicleStatusDeviceTypeTag.c diff --git a/j2735codec/core/202409/src/VehicleStatusRequest.c b/j2735codec/core/j2735_202409/src/VehicleStatusRequest.c similarity index 100% rename from j2735codec/core/202409/src/VehicleStatusRequest.c rename to j2735codec/core/j2735_202409/src/VehicleStatusRequest.c diff --git a/j2735codec/core/202409/src/VehicleStatusRequestList.c b/j2735codec/core/j2735_202409/src/VehicleStatusRequestList.c similarity index 100% rename from j2735codec/core/202409/src/VehicleStatusRequestList.c rename to j2735codec/core/j2735_202409/src/VehicleStatusRequestList.c diff --git a/j2735codec/core/202409/src/VehicleToLanePosition.c b/j2735codec/core/j2735_202409/src/VehicleToLanePosition.c similarity index 100% rename from j2735codec/core/202409/src/VehicleToLanePosition.c rename to j2735codec/core/j2735_202409/src/VehicleToLanePosition.c diff --git a/j2735codec/core/202409/src/VehicleToLanePositionList.c b/j2735codec/core/j2735_202409/src/VehicleToLanePositionList.c similarity index 100% rename from j2735codec/core/202409/src/VehicleToLanePositionList.c rename to j2735codec/core/j2735_202409/src/VehicleToLanePositionList.c diff --git a/j2735codec/core/202409/src/VehicleTotalDistance.c b/j2735codec/core/j2735_202409/src/VehicleTotalDistance.c similarity index 100% rename from j2735codec/core/202409/src/VehicleTotalDistance.c rename to j2735codec/core/j2735_202409/src/VehicleTotalDistance.c diff --git a/j2735codec/core/202409/src/VehicleType.c b/j2735codec/core/j2735_202409/src/VehicleType.c similarity index 100% rename from j2735codec/core/202409/src/VehicleType.c rename to j2735codec/core/j2735_202409/src/VehicleType.c diff --git a/j2735codec/core/202409/src/VehicleTypes.c b/j2735codec/core/j2735_202409/src/VehicleTypes.c similarity index 100% rename from j2735codec/core/202409/src/VehicleTypes.c rename to j2735codec/core/j2735_202409/src/VehicleTypes.c diff --git a/j2735codec/core/202409/src/VehicleWeightLaden.c b/j2735codec/core/j2735_202409/src/VehicleWeightLaden.c similarity index 100% rename from j2735codec/core/202409/src/VehicleWeightLaden.c rename to j2735codec/core/j2735_202409/src/VehicleWeightLaden.c diff --git a/j2735codec/core/202409/src/VehicleWeightLimits.c b/j2735codec/core/j2735_202409/src/VehicleWeightLimits.c similarity index 100% rename from j2735codec/core/202409/src/VehicleWeightLimits.c rename to j2735codec/core/j2735_202409/src/VehicleWeightLimits.c diff --git a/j2735codec/core/202409/src/VehicleWidth.c b/j2735codec/core/j2735_202409/src/VehicleWidth.c similarity index 100% rename from j2735codec/core/202409/src/VehicleWidth.c rename to j2735codec/core/j2735_202409/src/VehicleWidth.c diff --git a/j2735codec/core/202409/src/Velocity.c b/j2735codec/core/j2735_202409/src/Velocity.c similarity index 100% rename from j2735codec/core/202409/src/Velocity.c rename to j2735codec/core/j2735_202409/src/Velocity.c diff --git a/j2735codec/core/202409/src/VertOffset-B07.c b/j2735codec/core/j2735_202409/src/VertOffset-B07.c similarity index 100% rename from j2735codec/core/202409/src/VertOffset-B07.c rename to j2735codec/core/j2735_202409/src/VertOffset-B07.c diff --git a/j2735codec/core/202409/src/VertOffset-B08.c b/j2735codec/core/j2735_202409/src/VertOffset-B08.c similarity index 100% rename from j2735codec/core/202409/src/VertOffset-B08.c rename to j2735codec/core/j2735_202409/src/VertOffset-B08.c diff --git a/j2735codec/core/202409/src/VertOffset-B09.c b/j2735codec/core/j2735_202409/src/VertOffset-B09.c similarity index 100% rename from j2735codec/core/202409/src/VertOffset-B09.c rename to j2735codec/core/j2735_202409/src/VertOffset-B09.c diff --git a/j2735codec/core/202409/src/VertOffset-B10.c b/j2735codec/core/j2735_202409/src/VertOffset-B10.c similarity index 100% rename from j2735codec/core/202409/src/VertOffset-B10.c rename to j2735codec/core/j2735_202409/src/VertOffset-B10.c diff --git a/j2735codec/core/202409/src/VertOffset-B11.c b/j2735codec/core/j2735_202409/src/VertOffset-B11.c similarity index 100% rename from j2735codec/core/202409/src/VertOffset-B11.c rename to j2735codec/core/j2735_202409/src/VertOffset-B11.c diff --git a/j2735codec/core/202409/src/VertOffset-B12.c b/j2735codec/core/j2735_202409/src/VertOffset-B12.c similarity index 100% rename from j2735codec/core/202409/src/VertOffset-B12.c rename to j2735codec/core/j2735_202409/src/VertOffset-B12.c diff --git a/j2735codec/core/202409/src/VerticalAcceleration.c b/j2735codec/core/j2735_202409/src/VerticalAcceleration.c similarity index 100% rename from j2735codec/core/202409/src/VerticalAcceleration.c rename to j2735codec/core/j2735_202409/src/VerticalAcceleration.c diff --git a/j2735codec/core/202409/src/VerticalAccelerationThreshold.c b/j2735codec/core/j2735_202409/src/VerticalAccelerationThreshold.c similarity index 100% rename from j2735codec/core/202409/src/VerticalAccelerationThreshold.c rename to j2735codec/core/j2735_202409/src/VerticalAccelerationThreshold.c diff --git a/j2735codec/core/202409/src/VerticalOffset.c b/j2735codec/core/j2735_202409/src/VerticalOffset.c similarity index 100% rename from j2735codec/core/202409/src/VerticalOffset.c rename to j2735codec/core/j2735_202409/src/VerticalOffset.c diff --git a/j2735codec/core/202409/src/VisibilityAndAirQuality.c b/j2735codec/core/j2735_202409/src/VisibilityAndAirQuality.c similarity index 100% rename from j2735codec/core/202409/src/VisibilityAndAirQuality.c rename to j2735codec/core/j2735_202409/src/VisibilityAndAirQuality.c diff --git a/j2735codec/core/202409/src/VisualLink.c b/j2735codec/core/j2735_202409/src/VisualLink.c similarity index 100% rename from j2735codec/core/202409/src/VisualLink.c rename to j2735codec/core/j2735_202409/src/VisualLink.c diff --git a/j2735codec/core/202409/src/WDMSFleetData.c b/j2735codec/core/j2735_202409/src/WDMSFleetData.c similarity index 100% rename from j2735codec/core/202409/src/WDMSFleetData.c rename to j2735codec/core/j2735_202409/src/WDMSFleetData.c diff --git a/j2735codec/core/202409/src/WaitOnStopline.c b/j2735codec/core/j2735_202409/src/WaitOnStopline.c similarity index 100% rename from j2735codec/core/202409/src/WaitOnStopline.c rename to j2735codec/core/j2735_202409/src/WaitOnStopline.c diff --git a/j2735codec/core/202409/src/WarningAdvice.c b/j2735codec/core/j2735_202409/src/WarningAdvice.c similarity index 100% rename from j2735codec/core/202409/src/WarningAdvice.c rename to j2735codec/core/j2735_202409/src/WarningAdvice.c diff --git a/j2735codec/core/202409/src/WeatherConditions.c b/j2735codec/core/j2735_202409/src/WeatherConditions.c similarity index 100% rename from j2735codec/core/202409/src/WeatherConditions.c rename to j2735codec/core/j2735_202409/src/WeatherConditions.c diff --git a/j2735codec/core/202409/src/WeatherProbe.c b/j2735codec/core/j2735_202409/src/WeatherProbe.c similarity index 100% rename from j2735codec/core/202409/src/WeatherProbe.c rename to j2735codec/core/j2735_202409/src/WeatherProbe.c diff --git a/j2735codec/core/202409/src/WeatherReport.c b/j2735codec/core/j2735_202409/src/WeatherReport.c similarity index 100% rename from j2735codec/core/202409/src/WeatherReport.c rename to j2735codec/core/j2735_202409/src/WeatherReport.c diff --git a/j2735codec/core/202409/src/Weekday.c b/j2735codec/core/j2735_202409/src/Weekday.c similarity index 100% rename from j2735codec/core/202409/src/Weekday.c rename to j2735codec/core/j2735_202409/src/Weekday.c diff --git a/j2735codec/core/202409/src/WeightCharges.c b/j2735codec/core/j2735_202409/src/WeightCharges.c similarity index 100% rename from j2735codec/core/202409/src/WeightCharges.c rename to j2735codec/core/j2735_202409/src/WeightCharges.c diff --git a/j2735codec/core/202409/src/WeightChargesTable.c b/j2735codec/core/j2735_202409/src/WeightChargesTable.c similarity index 100% rename from j2735codec/core/202409/src/WeightChargesTable.c rename to j2735codec/core/j2735_202409/src/WeightChargesTable.c diff --git a/j2735codec/core/202409/src/WheelEndElectFault.c b/j2735codec/core/j2735_202409/src/WheelEndElectFault.c similarity index 100% rename from j2735codec/core/202409/src/WheelEndElectFault.c rename to j2735codec/core/j2735_202409/src/WheelEndElectFault.c diff --git a/j2735codec/core/202409/src/WheelSensorStatus.c b/j2735codec/core/j2735_202409/src/WheelSensorStatus.c similarity index 100% rename from j2735codec/core/202409/src/WheelSensorStatus.c rename to j2735codec/core/j2735_202409/src/WheelSensorStatus.c diff --git a/j2735codec/core/202409/src/Winds.c b/j2735codec/core/j2735_202409/src/Winds.c similarity index 100% rename from j2735codec/core/202409/src/Winds.c rename to j2735codec/core/j2735_202409/src/Winds.c diff --git a/j2735codec/core/202409/src/WinterDrivingIndex.c b/j2735codec/core/j2735_202409/src/WinterDrivingIndex.c similarity index 100% rename from j2735codec/core/202409/src/WinterDrivingIndex.c rename to j2735codec/core/j2735_202409/src/WinterDrivingIndex.c diff --git a/j2735codec/core/202409/src/WinterDrivingRestrictions.c b/j2735codec/core/j2735_202409/src/WinterDrivingRestrictions.c similarity index 100% rename from j2735codec/core/202409/src/WinterDrivingRestrictions.c rename to j2735codec/core/j2735_202409/src/WinterDrivingRestrictions.c diff --git a/j2735codec/core/202409/src/WiperRate.c b/j2735codec/core/j2735_202409/src/WiperRate.c similarity index 100% rename from j2735codec/core/202409/src/WiperRate.c rename to j2735codec/core/j2735_202409/src/WiperRate.c diff --git a/j2735codec/core/202409/src/WiperSet.c b/j2735codec/core/j2735_202409/src/WiperSet.c similarity index 100% rename from j2735codec/core/202409/src/WiperSet.c rename to j2735codec/core/j2735_202409/src/WiperSet.c diff --git a/j2735codec/core/202409/src/WiperStatus.c b/j2735codec/core/j2735_202409/src/WiperStatus.c similarity index 100% rename from j2735codec/core/202409/src/WiperStatus.c rename to j2735codec/core/j2735_202409/src/WiperStatus.c diff --git a/j2735codec/core/202409/src/WorkZone.c b/j2735codec/core/j2735_202409/src/WorkZone.c similarity index 100% rename from j2735codec/core/202409/src/WorkZone.c rename to j2735codec/core/j2735_202409/src/WorkZone.c diff --git a/j2735codec/core/202409/src/Yaw.c b/j2735codec/core/j2735_202409/src/Yaw.c similarity index 100% rename from j2735codec/core/202409/src/Yaw.c rename to j2735codec/core/j2735_202409/src/Yaw.c diff --git a/j2735codec/core/202409/src/YawDetected.c b/j2735codec/core/j2735_202409/src/YawDetected.c similarity index 100% rename from j2735codec/core/202409/src/YawDetected.c rename to j2735codec/core/j2735_202409/src/YawDetected.c diff --git a/j2735codec/core/202409/src/YawRate.c b/j2735codec/core/j2735_202409/src/YawRate.c similarity index 100% rename from j2735codec/core/202409/src/YawRate.c rename to j2735codec/core/j2735_202409/src/YawRate.c diff --git a/j2735codec/core/202409/src/YawRateConfidence.c b/j2735codec/core/j2735_202409/src/YawRateConfidence.c similarity index 100% rename from j2735codec/core/202409/src/YawRateConfidence.c rename to j2735codec/core/j2735_202409/src/YawRateConfidence.c diff --git a/j2735codec/core/202409/src/Year.c b/j2735codec/core/j2735_202409/src/Year.c similarity index 100% rename from j2735codec/core/202409/src/Year.c rename to j2735codec/core/j2735_202409/src/Year.c diff --git a/j2735codec/core/202409/src/ZoneLength.c b/j2735codec/core/j2735_202409/src/ZoneLength.c similarity index 100% rename from j2735codec/core/202409/src/ZoneLength.c rename to j2735codec/core/j2735_202409/src/ZoneLength.c diff --git a/j2735codec/core/202409/src/Zoom.c b/j2735codec/core/j2735_202409/src/Zoom.c similarity index 100% rename from j2735codec/core/202409/src/Zoom.c rename to j2735codec/core/j2735_202409/src/Zoom.c diff --git a/j2735codec/core/202409/src/aper_decoder.c b/j2735codec/core/j2735_202409/src/aper_decoder.c similarity index 100% rename from j2735codec/core/202409/src/aper_decoder.c rename to j2735codec/core/j2735_202409/src/aper_decoder.c diff --git a/j2735codec/core/202409/src/aper_encoder.c b/j2735codec/core/j2735_202409/src/aper_encoder.c similarity index 100% rename from j2735codec/core/202409/src/aper_encoder.c rename to j2735codec/core/j2735_202409/src/aper_encoder.c diff --git a/j2735codec/core/202409/src/aper_opentype.c b/j2735codec/core/j2735_202409/src/aper_opentype.c similarity index 100% rename from j2735codec/core/202409/src/aper_opentype.c rename to j2735codec/core/j2735_202409/src/aper_opentype.c diff --git a/j2735codec/core/202409/src/aper_support.c b/j2735codec/core/j2735_202409/src/aper_support.c similarity index 100% rename from j2735codec/core/202409/src/aper_support.c rename to j2735codec/core/j2735_202409/src/aper_support.c diff --git a/j2735codec/core/202409/src/asn_SEQUENCE_OF.c b/j2735codec/core/j2735_202409/src/asn_SEQUENCE_OF.c similarity index 100% rename from j2735codec/core/202409/src/asn_SEQUENCE_OF.c rename to j2735codec/core/j2735_202409/src/asn_SEQUENCE_OF.c diff --git a/j2735codec/core/202409/src/asn_SET_OF.c b/j2735codec/core/j2735_202409/src/asn_SET_OF.c similarity index 100% rename from j2735codec/core/202409/src/asn_SET_OF.c rename to j2735codec/core/j2735_202409/src/asn_SET_OF.c diff --git a/j2735codec/core/202409/src/asn_application.c b/j2735codec/core/j2735_202409/src/asn_application.c similarity index 100% rename from j2735codec/core/202409/src/asn_application.c rename to j2735codec/core/j2735_202409/src/asn_application.c diff --git a/j2735codec/core/202409/src/asn_bit_data.c b/j2735codec/core/j2735_202409/src/asn_bit_data.c similarity index 100% rename from j2735codec/core/202409/src/asn_bit_data.c rename to j2735codec/core/j2735_202409/src/asn_bit_data.c diff --git a/j2735codec/core/202409/src/asn_codecs_prim.c b/j2735codec/core/j2735_202409/src/asn_codecs_prim.c similarity index 100% rename from j2735codec/core/202409/src/asn_codecs_prim.c rename to j2735codec/core/j2735_202409/src/asn_codecs_prim.c diff --git a/j2735codec/core/202409/src/asn_codecs_prim_ber.c b/j2735codec/core/j2735_202409/src/asn_codecs_prim_ber.c similarity index 100% rename from j2735codec/core/202409/src/asn_codecs_prim_ber.c rename to j2735codec/core/j2735_202409/src/asn_codecs_prim_ber.c diff --git a/j2735codec/core/202409/src/asn_codecs_prim_jer.c b/j2735codec/core/j2735_202409/src/asn_codecs_prim_jer.c similarity index 100% rename from j2735codec/core/202409/src/asn_codecs_prim_jer.c rename to j2735codec/core/j2735_202409/src/asn_codecs_prim_jer.c diff --git a/j2735codec/core/202409/src/asn_codecs_prim_xer.c b/j2735codec/core/j2735_202409/src/asn_codecs_prim_xer.c similarity index 100% rename from j2735codec/core/202409/src/asn_codecs_prim_xer.c rename to j2735codec/core/j2735_202409/src/asn_codecs_prim_xer.c diff --git a/j2735codec/core/202409/src/asn_internal.c b/j2735codec/core/j2735_202409/src/asn_internal.c similarity index 100% rename from j2735codec/core/202409/src/asn_internal.c rename to j2735codec/core/j2735_202409/src/asn_internal.c diff --git a/j2735codec/core/202409/src/asn_random_fill.c b/j2735codec/core/j2735_202409/src/asn_random_fill.c similarity index 100% rename from j2735codec/core/202409/src/asn_random_fill.c rename to j2735codec/core/j2735_202409/src/asn_random_fill.c diff --git a/j2735codec/core/202409/src/ber_decoder.c b/j2735codec/core/j2735_202409/src/ber_decoder.c similarity index 100% rename from j2735codec/core/202409/src/ber_decoder.c rename to j2735codec/core/j2735_202409/src/ber_decoder.c diff --git a/j2735codec/core/202409/src/ber_tlv_length.c b/j2735codec/core/j2735_202409/src/ber_tlv_length.c similarity index 100% rename from j2735codec/core/202409/src/ber_tlv_length.c rename to j2735codec/core/j2735_202409/src/ber_tlv_length.c diff --git a/j2735codec/core/202409/src/ber_tlv_tag.c b/j2735codec/core/j2735_202409/src/ber_tlv_tag.c similarity index 100% rename from j2735codec/core/202409/src/ber_tlv_tag.c rename to j2735codec/core/j2735_202409/src/ber_tlv_tag.c diff --git a/j2735codec/core/202409/src/constr_CHOICE.c b/j2735codec/core/j2735_202409/src/constr_CHOICE.c similarity index 100% rename from j2735codec/core/202409/src/constr_CHOICE.c rename to j2735codec/core/j2735_202409/src/constr_CHOICE.c diff --git a/j2735codec/core/202409/src/constr_CHOICE_aper.c b/j2735codec/core/j2735_202409/src/constr_CHOICE_aper.c similarity index 100% rename from j2735codec/core/202409/src/constr_CHOICE_aper.c rename to j2735codec/core/j2735_202409/src/constr_CHOICE_aper.c diff --git a/j2735codec/core/202409/src/constr_CHOICE_ber.c b/j2735codec/core/j2735_202409/src/constr_CHOICE_ber.c similarity index 100% rename from j2735codec/core/202409/src/constr_CHOICE_ber.c rename to j2735codec/core/j2735_202409/src/constr_CHOICE_ber.c diff --git a/j2735codec/core/202409/src/constr_CHOICE_jer.c b/j2735codec/core/j2735_202409/src/constr_CHOICE_jer.c similarity index 100% rename from j2735codec/core/202409/src/constr_CHOICE_jer.c rename to j2735codec/core/j2735_202409/src/constr_CHOICE_jer.c diff --git a/j2735codec/core/202409/src/constr_CHOICE_oer.c b/j2735codec/core/j2735_202409/src/constr_CHOICE_oer.c similarity index 100% rename from j2735codec/core/202409/src/constr_CHOICE_oer.c rename to j2735codec/core/j2735_202409/src/constr_CHOICE_oer.c diff --git a/j2735codec/core/202409/src/constr_CHOICE_print.c b/j2735codec/core/j2735_202409/src/constr_CHOICE_print.c similarity index 100% rename from j2735codec/core/202409/src/constr_CHOICE_print.c rename to j2735codec/core/j2735_202409/src/constr_CHOICE_print.c diff --git a/j2735codec/core/202409/src/constr_CHOICE_rfill.c b/j2735codec/core/j2735_202409/src/constr_CHOICE_rfill.c similarity index 100% rename from j2735codec/core/202409/src/constr_CHOICE_rfill.c rename to j2735codec/core/j2735_202409/src/constr_CHOICE_rfill.c diff --git a/j2735codec/core/202409/src/constr_CHOICE_uper.c b/j2735codec/core/j2735_202409/src/constr_CHOICE_uper.c similarity index 100% rename from j2735codec/core/202409/src/constr_CHOICE_uper.c rename to j2735codec/core/j2735_202409/src/constr_CHOICE_uper.c diff --git a/j2735codec/core/202409/src/constr_CHOICE_xer.c b/j2735codec/core/j2735_202409/src/constr_CHOICE_xer.c similarity index 100% rename from j2735codec/core/202409/src/constr_CHOICE_xer.c rename to j2735codec/core/j2735_202409/src/constr_CHOICE_xer.c diff --git a/j2735codec/core/202409/src/constr_SEQUENCE.c b/j2735codec/core/j2735_202409/src/constr_SEQUENCE.c similarity index 100% rename from j2735codec/core/202409/src/constr_SEQUENCE.c rename to j2735codec/core/j2735_202409/src/constr_SEQUENCE.c diff --git a/j2735codec/core/202409/src/constr_SEQUENCE_OF.c b/j2735codec/core/j2735_202409/src/constr_SEQUENCE_OF.c similarity index 100% rename from j2735codec/core/202409/src/constr_SEQUENCE_OF.c rename to j2735codec/core/j2735_202409/src/constr_SEQUENCE_OF.c diff --git a/j2735codec/core/202409/src/constr_SEQUENCE_OF_aper.c b/j2735codec/core/j2735_202409/src/constr_SEQUENCE_OF_aper.c similarity index 100% rename from j2735codec/core/202409/src/constr_SEQUENCE_OF_aper.c rename to j2735codec/core/j2735_202409/src/constr_SEQUENCE_OF_aper.c diff --git a/j2735codec/core/202409/src/constr_SEQUENCE_OF_ber.c b/j2735codec/core/j2735_202409/src/constr_SEQUENCE_OF_ber.c similarity index 100% rename from j2735codec/core/202409/src/constr_SEQUENCE_OF_ber.c rename to j2735codec/core/j2735_202409/src/constr_SEQUENCE_OF_ber.c diff --git a/j2735codec/core/202409/src/constr_SEQUENCE_OF_jer.c b/j2735codec/core/j2735_202409/src/constr_SEQUENCE_OF_jer.c similarity index 100% rename from j2735codec/core/202409/src/constr_SEQUENCE_OF_jer.c rename to j2735codec/core/j2735_202409/src/constr_SEQUENCE_OF_jer.c diff --git a/j2735codec/core/202409/src/constr_SEQUENCE_OF_uper.c b/j2735codec/core/j2735_202409/src/constr_SEQUENCE_OF_uper.c similarity index 100% rename from j2735codec/core/202409/src/constr_SEQUENCE_OF_uper.c rename to j2735codec/core/j2735_202409/src/constr_SEQUENCE_OF_uper.c diff --git a/j2735codec/core/202409/src/constr_SEQUENCE_OF_xer.c b/j2735codec/core/j2735_202409/src/constr_SEQUENCE_OF_xer.c similarity index 100% rename from j2735codec/core/202409/src/constr_SEQUENCE_OF_xer.c rename to j2735codec/core/j2735_202409/src/constr_SEQUENCE_OF_xer.c diff --git a/j2735codec/core/202409/src/constr_SEQUENCE_aper.c b/j2735codec/core/j2735_202409/src/constr_SEQUENCE_aper.c similarity index 100% rename from j2735codec/core/202409/src/constr_SEQUENCE_aper.c rename to j2735codec/core/j2735_202409/src/constr_SEQUENCE_aper.c diff --git a/j2735codec/core/202409/src/constr_SEQUENCE_ber.c b/j2735codec/core/j2735_202409/src/constr_SEQUENCE_ber.c similarity index 100% rename from j2735codec/core/202409/src/constr_SEQUENCE_ber.c rename to j2735codec/core/j2735_202409/src/constr_SEQUENCE_ber.c diff --git a/j2735codec/core/202409/src/constr_SEQUENCE_jer.c b/j2735codec/core/j2735_202409/src/constr_SEQUENCE_jer.c similarity index 100% rename from j2735codec/core/202409/src/constr_SEQUENCE_jer.c rename to j2735codec/core/j2735_202409/src/constr_SEQUENCE_jer.c diff --git a/j2735codec/core/202409/src/constr_SEQUENCE_oer.c b/j2735codec/core/j2735_202409/src/constr_SEQUENCE_oer.c similarity index 100% rename from j2735codec/core/202409/src/constr_SEQUENCE_oer.c rename to j2735codec/core/j2735_202409/src/constr_SEQUENCE_oer.c diff --git a/j2735codec/core/202409/src/constr_SEQUENCE_print.c b/j2735codec/core/j2735_202409/src/constr_SEQUENCE_print.c similarity index 100% rename from j2735codec/core/202409/src/constr_SEQUENCE_print.c rename to j2735codec/core/j2735_202409/src/constr_SEQUENCE_print.c diff --git a/j2735codec/core/202409/src/constr_SEQUENCE_rfill.c b/j2735codec/core/j2735_202409/src/constr_SEQUENCE_rfill.c similarity index 100% rename from j2735codec/core/202409/src/constr_SEQUENCE_rfill.c rename to j2735codec/core/j2735_202409/src/constr_SEQUENCE_rfill.c diff --git a/j2735codec/core/202409/src/constr_SEQUENCE_uper.c b/j2735codec/core/j2735_202409/src/constr_SEQUENCE_uper.c similarity index 100% rename from j2735codec/core/202409/src/constr_SEQUENCE_uper.c rename to j2735codec/core/j2735_202409/src/constr_SEQUENCE_uper.c diff --git a/j2735codec/core/202409/src/constr_SEQUENCE_xer.c b/j2735codec/core/j2735_202409/src/constr_SEQUENCE_xer.c similarity index 100% rename from j2735codec/core/202409/src/constr_SEQUENCE_xer.c rename to j2735codec/core/j2735_202409/src/constr_SEQUENCE_xer.c diff --git a/j2735codec/core/202409/src/constr_SET_OF.c b/j2735codec/core/j2735_202409/src/constr_SET_OF.c similarity index 100% rename from j2735codec/core/202409/src/constr_SET_OF.c rename to j2735codec/core/j2735_202409/src/constr_SET_OF.c diff --git a/j2735codec/core/202409/src/constr_SET_OF_aper.c b/j2735codec/core/j2735_202409/src/constr_SET_OF_aper.c similarity index 100% rename from j2735codec/core/202409/src/constr_SET_OF_aper.c rename to j2735codec/core/j2735_202409/src/constr_SET_OF_aper.c diff --git a/j2735codec/core/202409/src/constr_SET_OF_ber.c b/j2735codec/core/j2735_202409/src/constr_SET_OF_ber.c similarity index 100% rename from j2735codec/core/202409/src/constr_SET_OF_ber.c rename to j2735codec/core/j2735_202409/src/constr_SET_OF_ber.c diff --git a/j2735codec/core/202409/src/constr_SET_OF_jer.c b/j2735codec/core/j2735_202409/src/constr_SET_OF_jer.c similarity index 100% rename from j2735codec/core/202409/src/constr_SET_OF_jer.c rename to j2735codec/core/j2735_202409/src/constr_SET_OF_jer.c diff --git a/j2735codec/core/202409/src/constr_SET_OF_oer.c b/j2735codec/core/j2735_202409/src/constr_SET_OF_oer.c similarity index 100% rename from j2735codec/core/202409/src/constr_SET_OF_oer.c rename to j2735codec/core/j2735_202409/src/constr_SET_OF_oer.c diff --git a/j2735codec/core/202409/src/constr_SET_OF_print.c b/j2735codec/core/j2735_202409/src/constr_SET_OF_print.c similarity index 100% rename from j2735codec/core/202409/src/constr_SET_OF_print.c rename to j2735codec/core/j2735_202409/src/constr_SET_OF_print.c diff --git a/j2735codec/core/202409/src/constr_SET_OF_rfill.c b/j2735codec/core/j2735_202409/src/constr_SET_OF_rfill.c similarity index 100% rename from j2735codec/core/202409/src/constr_SET_OF_rfill.c rename to j2735codec/core/j2735_202409/src/constr_SET_OF_rfill.c diff --git a/j2735codec/core/202409/src/constr_SET_OF_uper.c b/j2735codec/core/j2735_202409/src/constr_SET_OF_uper.c similarity index 100% rename from j2735codec/core/202409/src/constr_SET_OF_uper.c rename to j2735codec/core/j2735_202409/src/constr_SET_OF_uper.c diff --git a/j2735codec/core/202409/src/constr_SET_OF_xer.c b/j2735codec/core/j2735_202409/src/constr_SET_OF_xer.c similarity index 100% rename from j2735codec/core/202409/src/constr_SET_OF_xer.c rename to j2735codec/core/j2735_202409/src/constr_SET_OF_xer.c diff --git a/j2735codec/core/202409/src/constr_TYPE.c b/j2735codec/core/j2735_202409/src/constr_TYPE.c similarity index 100% rename from j2735codec/core/202409/src/constr_TYPE.c rename to j2735codec/core/j2735_202409/src/constr_TYPE.c diff --git a/j2735codec/core/202409/src/constraints.c b/j2735codec/core/j2735_202409/src/constraints.c similarity index 100% rename from j2735codec/core/202409/src/constraints.c rename to j2735codec/core/j2735_202409/src/constraints.c diff --git a/j2735codec/core/202409/src/der_encoder.c b/j2735codec/core/j2735_202409/src/der_encoder.c similarity index 100% rename from j2735codec/core/202409/src/der_encoder.c rename to j2735codec/core/j2735_202409/src/der_encoder.c diff --git a/j2735codec/core/202409/src/jer_decoder.c b/j2735codec/core/j2735_202409/src/jer_decoder.c similarity index 100% rename from j2735codec/core/202409/src/jer_decoder.c rename to j2735codec/core/j2735_202409/src/jer_decoder.c diff --git a/j2735codec/core/202409/src/jer_encoder.c b/j2735codec/core/j2735_202409/src/jer_encoder.c similarity index 100% rename from j2735codec/core/202409/src/jer_encoder.c rename to j2735codec/core/j2735_202409/src/jer_encoder.c diff --git a/j2735codec/core/202409/src/jer_support.c b/j2735codec/core/j2735_202409/src/jer_support.c similarity index 100% rename from j2735codec/core/202409/src/jer_support.c rename to j2735codec/core/j2735_202409/src/jer_support.c diff --git a/j2735codec/core/202409/src/oer_decoder.c b/j2735codec/core/j2735_202409/src/oer_decoder.c similarity index 100% rename from j2735codec/core/202409/src/oer_decoder.c rename to j2735codec/core/j2735_202409/src/oer_decoder.c diff --git a/j2735codec/core/202409/src/oer_encoder.c b/j2735codec/core/j2735_202409/src/oer_encoder.c similarity index 100% rename from j2735codec/core/202409/src/oer_encoder.c rename to j2735codec/core/j2735_202409/src/oer_encoder.c diff --git a/j2735codec/core/202409/src/oer_support.c b/j2735codec/core/j2735_202409/src/oer_support.c similarity index 100% rename from j2735codec/core/202409/src/oer_support.c rename to j2735codec/core/j2735_202409/src/oer_support.c diff --git a/j2735codec/core/202409/src/pdu_collection.c b/j2735codec/core/j2735_202409/src/pdu_collection.c similarity index 100% rename from j2735codec/core/202409/src/pdu_collection.c rename to j2735codec/core/j2735_202409/src/pdu_collection.c diff --git a/j2735codec/core/202409/src/per_decoder.c b/j2735codec/core/j2735_202409/src/per_decoder.c similarity index 100% rename from j2735codec/core/202409/src/per_decoder.c rename to j2735codec/core/j2735_202409/src/per_decoder.c diff --git a/j2735codec/core/202409/src/per_encoder.c b/j2735codec/core/j2735_202409/src/per_encoder.c similarity index 100% rename from j2735codec/core/202409/src/per_encoder.c rename to j2735codec/core/j2735_202409/src/per_encoder.c diff --git a/j2735codec/core/202409/src/per_opentype.c b/j2735codec/core/j2735_202409/src/per_opentype.c similarity index 100% rename from j2735codec/core/202409/src/per_opentype.c rename to j2735codec/core/j2735_202409/src/per_opentype.c diff --git a/j2735codec/core/202409/src/per_support.c b/j2735codec/core/j2735_202409/src/per_support.c similarity index 100% rename from j2735codec/core/202409/src/per_support.c rename to j2735codec/core/j2735_202409/src/per_support.c diff --git a/j2735codec/core/202409/src/uper_decoder.c b/j2735codec/core/j2735_202409/src/uper_decoder.c similarity index 100% rename from j2735codec/core/202409/src/uper_decoder.c rename to j2735codec/core/j2735_202409/src/uper_decoder.c diff --git a/j2735codec/core/202409/src/uper_encoder.c b/j2735codec/core/j2735_202409/src/uper_encoder.c similarity index 100% rename from j2735codec/core/202409/src/uper_encoder.c rename to j2735codec/core/j2735_202409/src/uper_encoder.c diff --git a/j2735codec/core/202409/src/uper_opentype.c b/j2735codec/core/j2735_202409/src/uper_opentype.c similarity index 100% rename from j2735codec/core/202409/src/uper_opentype.c rename to j2735codec/core/j2735_202409/src/uper_opentype.c diff --git a/j2735codec/core/202409/src/uper_support.c b/j2735codec/core/j2735_202409/src/uper_support.c similarity index 100% rename from j2735codec/core/202409/src/uper_support.c rename to j2735codec/core/j2735_202409/src/uper_support.c diff --git a/j2735codec/core/202409/src/xer_decoder.c b/j2735codec/core/j2735_202409/src/xer_decoder.c similarity index 100% rename from j2735codec/core/202409/src/xer_decoder.c rename to j2735codec/core/j2735_202409/src/xer_decoder.c diff --git a/j2735codec/core/202409/src/xer_encoder.c b/j2735codec/core/j2735_202409/src/xer_encoder.c similarity index 100% rename from j2735codec/core/202409/src/xer_encoder.c rename to j2735codec/core/j2735_202409/src/xer_encoder.c diff --git a/j2735codec/core/202409/src/xer_support.c b/j2735codec/core/j2735_202409/src/xer_support.c similarity index 100% rename from j2735codec/core/202409/src/xer_support.c rename to j2735codec/core/j2735_202409/src/xer_support.c From 1650dbb134b0b70df46d6c604cf7440df53fa791 Mon Sep 17 00:00:00 2001 From: Sean Hsu Date: Thu, 15 Jan 2026 14:35:40 -0500 Subject: [PATCH 04/21] build: implement multi-target CMake and Makefile build system - Add root Makefile to orchestrate Native C and WASM builds. - Implement modular CMake configuration for j2735codec and core library. - Add PlatformDetection.cmake for cross-platform OS/Arch identification. - Implement PostBuild.cmake logic for automated binding generation and WASM asset syncing. - Add path validation for SAE J2735 standard revisions. - Update .gitignore to exclude build artifacts and generated assets. --- .gitignore | 5 +- Makefile | 52 ++++++++++++ j2735codec/CMakeLists.txt | 39 +++++++++ j2735codec/cmake/PlatformDetection.cmake | 31 +++++++ j2735codec/core/CMakeLists.txt | 102 +++++++++++++++++++++++ j2735codec/core/cmake/PostBuild.cmake | 91 ++++++++++++++++++++ 6 files changed, 316 insertions(+), 4 deletions(-) create mode 100644 Makefile create mode 100644 j2735codec/CMakeLists.txt create mode 100644 j2735codec/cmake/PlatformDetection.cmake create mode 100644 j2735codec/core/CMakeLists.txt create mode 100644 j2735codec/core/cmake/PostBuild.cmake diff --git a/.gitignore b/.gitignore index 304d427..9b6df8d 100644 --- a/.gitignore +++ b/.gitignore @@ -71,10 +71,7 @@ yarn-error.log* # --- Project Specific Patterns --- # Explicitly ignoring generated WASM and metadata in specific subfolders -**/wasm/j2735.wasm -**/wasm/j2735.js -**/metadata/pdu.py -**/metadata/encoding.py +**/generated/* # --- Environment & Secrets --- # Never commit ETX credentials or local environment configs diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..8695254 --- /dev/null +++ b/Makefile @@ -0,0 +1,52 @@ +# SPDX-FileCopyrightText: 2025 Verizon +# SPDX-License-Identifier: Apache-2.0 + +# --- Variables --- +BUILD_DIR_NATIVE = j2735codec/build_native +BUILD_DIR_WASM = j2735codec/build_wasm +DIST_DIR = j2735codec/dist +BINDING_PY = j2735codec/bindings/python +BINDING_JS = j2735codec/bindings/node +CMAKE := $(shell which cmake) +J2735_REV ?= j2735_202409 +THREADS ?= 4 + +# --- Targets --- + +.PHONY: all native wasm clean purge help sync-version + +help: + @echo "Usage:" + @echo " make sync-version - Sync VERSION file to all binding configs" + @echo " make native - Build the native C static library" + @echo " make wasm - Build the WebAssembly library (Emscripten)" + @echo " make all - Build both targets" + @echo " make purge - Hard reset (removes all build and dist folders)" + +all: sync-version native wasm + +# Native Build Logic +native: + @echo "πŸ—οΈ Building Native C Library..." + $(CMAKE) -B $(BUILD_DIR_NATIVE) -S j2735codec -DBUILD_NATIVE_LIB=ON + $(CMAKE) --build $(BUILD_DIR_NATIVE) -j $(THREADS) + +# WASM Build Logic +wasm: + @echo "πŸ•ΈοΈ Building WebAssembly..." + emcmake $(CMAKE) -B $(BUILD_DIR_WASM) -S j2735codec -DJ2735_REV=$(J2735_REV) + $(CMAKE) --build $(BUILD_DIR_WASM) -j $(THREADS) + +# Purge (The "Everything" Clean) +purge: + @echo "πŸ”₯ Starting the purge..." + rm -rf $(BUILD_DIR_NATIVE) $(BUILD_DIR_WASM) $(DIST_DIR) + + @echo "πŸ” Hunting for nested build folders..." + # Skips emsdk to avoid deleting your compiler toolchain + find . -type d -name "build" -not -path "*/emsdk/*" -exec rm -rf {} + + + rm -rf $(BINDING_PY)/src/j2735codec/generated + rm -rf $(BINDING_JS)/src/generated + + @echo "Project is purged ✨." diff --git a/j2735codec/CMakeLists.txt b/j2735codec/CMakeLists.txt new file mode 100644 index 0000000..281de05 --- /dev/null +++ b/j2735codec/CMakeLists.txt @@ -0,0 +1,39 @@ +# SPDX-FileCopyrightText: 2025 Verizon +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20) + +# Make sure the version string is always quoted as below. +project(j2735codec VERSION "0.1.0" LANGUAGES C) + +# Check if we are in a "Dead End" build (No WASM and No Static Lib) +if(NOT EMSCRIPTEN AND NOT BUILD_NATIVE_LIB) + message(FATAL_ERROR + "\n !!! WARNING: IDLE BUILD CONFIGURATION !!!\n\n" + " 1. Emscripten toolchain is NOT active (No WASM).\n" + " 2. BUILD_NATIVE_LIB is set to OFF.\n" + " Result: No binaries will be produced. \n" + " To fix: Use 'emcmake cmake ..' OR set -DBUILD_STATIC_LIB=ON\n" + ) +endif() + +# Detect which platform is being used +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") +include(PlatformDetection) +detect_platform() + +# Define folder path +set(DIST_WASM_DIR "${CMAKE_SOURCE_DIR}/dist/wasm") +set(DIST_STATIC_DIR "${CMAKE_SOURCE_DIR}/dist/lib/${BUILD_HOST_OS}/${BUILD_HOST_ARCH}") +set(PY_DIR "${CMAKE_SOURCE_DIR}/bindings/python/src/j2735codec") +set(NODE_DIR "${CMAKE_SOURCE_DIR}/bindings/node/src") + +# Standards version to build +set(J2735_REV "j2735_202409" CACHE STRING "The SAE J2735 standard version to build") +message(STATUS "Building for version: ${J2735_REV}") + +# By default the static c library build process is turned off +option(BUILD_NATIVE_LIB "Build the native static library" OFF) + +# Add the core library components +add_subdirectory(core) diff --git a/j2735codec/cmake/PlatformDetection.cmake b/j2735codec/cmake/PlatformDetection.cmake new file mode 100644 index 0000000..e69d5c5 --- /dev/null +++ b/j2735codec/cmake/PlatformDetection.cmake @@ -0,0 +1,31 @@ +# SPDX-FileCopyrightText: 2025 Verizon +# SPDX-License-Identifier: Apache-2.0 + +function(detect_platform) + # 1. Detect the PHYSICAL machine (The Host) + string(TOLOWER "${CMAKE_HOST_SYSTEM_NAME}" HOST_OS) + string(TOLOWER "${CMAKE_HOST_SYSTEM_PROCESSOR}" HOST_ARCH) + + # Standardize Host Arch (Mac Silicon is arm64) + if(HOST_ARCH MATCHES "arm64|aarch64") + set(HOST_ARCH "arm64") + elseif(HOST_ARCH MATCHES "amd64|x86_64") + set(HOST_ARCH "x86_64") + endif() + + # 2. Detect the TARGET (What we are building) + if(EMSCRIPTEN) + set(TARGET_OS "wasm") + set(TARGET_ARCH "wasm32") + else() + # If not WASM, Target is usually the same as Host + set(TARGET_OS "${HOST_OS}") + set(TARGET_ARCH "${HOST_ARCH}") + endif() + + # Export everything to the main script + set(BUILD_HOST_OS "${HOST_OS}" PARENT_SCOPE) + set(BUILD_HOST_ARCH "${HOST_ARCH}" PARENT_SCOPE) + set(BUILD_TARGET_OS "${TARGET_OS}" PARENT_SCOPE) + set(BUILD_TARGET_ARCH "${TARGET_ARCH}" PARENT_SCOPE) +endfunction() \ No newline at end of file diff --git a/j2735codec/core/CMakeLists.txt b/j2735codec/core/CMakeLists.txt new file mode 100644 index 0000000..4dba78d --- /dev/null +++ b/j2735codec/core/CMakeLists.txt @@ -0,0 +1,102 @@ +# SPDX-FileCopyrightText: 2025 Verizon +# SPDX-License-Identifier: Apache-2.0 + +# Set flags for compiling the binary +set(ASN1_DEFINITIONS + ASN_DISABLE_PRINT_SUPPORT + ASN_PDU_COLLECTION +) + +# Reference cmake files for custom functions +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") +include(PostBuild) + +# Grab all of the sources +set(VERSION_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${J2735_REV}") +# Check if the standard version directory exists +if(NOT EXISTS "${VERSION_DIR}") + message(FATAL_ERROR + "Missing standard directory: ${VERSION_DIR}\n" + "Please ensure the SAE J2735 ${J2735_REV} files are present." + ) +endif() +file(GLOB ASN1_SOURCES "${VERSION_DIR}/src/*.c") +# Final check: Did we actually find any code? +if(NOT ASN1_SOURCES) + message(FATAL_ERROR "Directory found, but no .c files found in: ${VERSION_DIR}/src") +endif() + +# Build out the native library if specified +if(BUILD_NATIVE_LIB) + file(MAKE_DIRECTORY "${DIST_STATIC_DIR}") + add_library(j2735_native_lib STATIC) + target_sources(j2735_native_lib PRIVATE ${ASN1_SOURCES}) + target_include_directories(j2735_native_lib + PUBLIC "${VERSION_DIR}/include" + ) + target_compile_definitions(j2735_native_lib PRIVATE ${ASN1_DEFINITIONS}) + set_target_properties(j2735_native_lib PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY "${DIST_STATIC_DIR}" + OUTPUT_NAME "j2735codec" + ) +endif() + +# Build out WASM if activated by emscripten +if(EMSCRIPTEN) + # Setup for compilation + add_executable(j2735_wasm_lib) + target_sources(j2735_wasm_lib PRIVATE ${ASN1_SOURCES}) + target_include_directories(j2735_wasm_lib + PUBLIC "${VERSION_DIR}/include" + ) + target_compile_definitions(j2735_wasm_lib PRIVATE ${ASN1_DEFINITIONS}) + + # Need link options for WASM build + target_link_options(j2735_wasm_lib PRIVATE + "-sSTANDALONE_WASM" + "-sEXPORTED_FUNCTIONS=['_transcode','_malloc','_free']" + "-Wl,--no-entry" + ) + + # Setup output properties + set_target_properties(j2735_wasm_lib PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${DIST_WASM_DIR}" + OUTPUT_NAME "j2735codec" + SUFFIX ".wasm" + ) + + # Perform post build actions, build dist directory + add_custom_command(TARGET j2735_wasm_lib POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory "${DIST_WASM_DIR}" + COMMENT "Constructing WASM asset directory ${DIST_WASM_DIR}..." + VERBATIM + ) + + # Build binding outputs + foreach(DIR ${PY_DIR} ${NODE_DIR}) + # Create directories for each binding + set(GEN_DIR "${DIR}/generated") + create_binding_directories(j2735_wasm_lib ${GEN_DIR}) + + set(EXT ".py") + if(${DIR} STREQUAL ${NODE_DIR}) + set(EXT ".ts") + endif() + + # Generate enums for python binding + generate_enums( + j2735_wasm_lib + "${VERSION_DIR}/src/pdu_collection.c" + "${GEN_DIR}/pdu${EXT}" + "&asn_DEF_" + "PDUTypes" + ) + generate_enums( + j2735_wasm_lib + "${VERSION_DIR}/include/asn_application.h" + "${GEN_DIR}/encodings${EXT}" + "ATS_" + "EncodingRules" + ) + endforeach() +endif() diff --git a/j2735codec/core/cmake/PostBuild.cmake b/j2735codec/core/cmake/PostBuild.cmake new file mode 100644 index 0000000..4725995 --- /dev/null +++ b/j2735codec/core/cmake/PostBuild.cmake @@ -0,0 +1,91 @@ +# SPDX-FileCopyrightText: 2025 Verizon +# SPDX-License-Identifier: Apache-2.0 + +function(create_binding_directories target_name out_dir) + # 1. Define the base commands that everyone gets + set(BINDING_COMMANDS + COMMAND ${CMAKE_COMMAND} -E make_directory + "${out_dir}" + COMMAND ${CMAKE_COMMAND} -E copy + "${DIST_WASM_DIR}/j2735codec.wasm" + "${out_dir}/j2735codec.wasm" + ) + + # 2. Substring match: If "python" is anywhere in the path, add the markers + if("${out_dir}" MATCHES "python") + list(APPEND BINDING_COMMANDS + COMMAND ${CMAKE_COMMAND} -E touch "${out_dir}/__init__.py" + ) + endif() + + # 3. Apply the full list of commands to the target + add_custom_command(TARGET ${target_name} POST_BUILD + ${BINDING_COMMANDS} + COMMENT "Constructing WASM asset directories for ${out_dir}..." + VERBATIM + ) +endfunction() + +function(generate_enums target_name input_file output_file prefix class_name) + if(output_file MATCHES ".*\\.py$") + set(target_lang "PYTHON") + elseif(output_file MATCHES ".*\\.ts$" OR output_file MATCHES ".*\\.js$") + set(target_lang "NODE") + else() + message(FATAL_ERROR "Could not determine language for ${output_file}.") + endif() + + set(helper_script "${CMAKE_BINARY_DIR}/scripts/gen_enum_${class_name}_${target_lang}.cmake") + + file(WRITE "${helper_script}" " + file(READ [[${input_file}]] content) + + # Remove C-style comments /* ... */ safely for CMake + string(REGEX REPLACE \"/\\\\*([^\\\\*]|\\\\*+[^/\\\\*])*\\\\*+/\" \"\" clean_content \"\${content}\") + + string(REPLACE \"\\n\" \";\" lines \"\${clean_content}\") + + set(enum_entries \"\") + set(index 0) + + foreach(line \${lines}) + string(STRIP \"\${line}\" clean_line) + + # Match the prefix and capture the raw name + if(clean_line MATCHES \"${prefix}([a-zA-Z0-9_]+)\") + set(raw_word \"\${CMAKE_MATCH_1}\") + + if(\"${target_lang}\" STREQUAL \"PYTHON\") + # PYTHON: Still use SCREAMING_SNAKE_CASE (Standard PEP8) + string(REGEX REPLACE \"([a-z0-9])([A-Z])\" \"\\\\1_\\\\2\" snake_word \"\${raw_word}\") + string(TOUPPER \"\${snake_word}\" formatted_word) + string(REPLACE \"__\" \"_\" formatted_word \"\${formatted_word}\") + string(APPEND enum_entries \" \${formatted_word} = \${index}\\n\") + else() + # NODE/TS: PASSTHROUGH (Keep C++ casing exactly) + string(APPEND enum_entries \" \${raw_word} = \${index},\\n\") + endif() + + math(EXPR index \"\${index} + 1\") + endif() + endforeach() + + # Final file assembly + if(\"${target_lang}\" STREQUAL \"PYTHON\") + set(full_file \"# THIS FILE IS AUTO-GENERATED. DO NOT EDIT DIRECTLY.\\n\") + string(APPEND full_file \"from enum import Enum\\n\\n\") + string(APPEND full_file \"class ${class_name}(Enum):\\n\${enum_entries}\") + else() + set(full_file \"/**\\n * THIS FILE IS AUTO-GENERATED. DO NOT EDIT DIRECTLY.\\n */\\n\\n\") + string(APPEND full_file \"export enum ${class_name} {\\n\${enum_entries}}\") + endif() + + file(WRITE [[${output_file}]] \"\${full_file}\") + ") + + add_custom_command(TARGET ${target_name} POST_BUILD + COMMAND ${CMAKE_COMMAND} -P "${helper_script}" + COMMENT "Generating ${target_lang} Enum ${class_name} (Passthrough: ${target_lang})" + VERBATIM + ) +endfunction() \ No newline at end of file From 4c67913fd8d6e7ffe5e0fefae24c13899ef4ce82 Mon Sep 17 00:00:00 2001 From: Sean Hsu Date: Thu, 15 Jan 2026 18:41:26 -0500 Subject: [PATCH 05/21] build: implement python distribution pipeline and workspace - Add root pyproject.toml for UV workspace management. - Rewrite Makefile with colorized environment guards and uv detection. - Implement multi-phase install-py target (build, test, package, and verify). --- .python-version | 1 + Makefile | 161 ++++++++++++++---- j2735codec/bindings/python/README.md | 0 j2735codec/bindings/python/pyproject.toml | 36 ++++ .../python/src/j2735codec/__init__.py | 5 + .../bindings/python/src/j2735codec/codec.py | 149 ++++++++++++++++ .../bindings/python/src/j2735codec/py.typed | 0 .../bindings/python/tests/test_codec.py | 73 ++++++++ pyproject.toml | 15 ++ 9 files changed, 409 insertions(+), 31 deletions(-) create mode 100644 .python-version create mode 100644 j2735codec/bindings/python/README.md create mode 100644 j2735codec/bindings/python/pyproject.toml create mode 100644 j2735codec/bindings/python/src/j2735codec/__init__.py create mode 100644 j2735codec/bindings/python/src/j2735codec/codec.py create mode 100644 j2735codec/bindings/python/src/j2735codec/py.typed create mode 100644 j2735codec/bindings/python/tests/test_codec.py create mode 100644 pyproject.toml diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..9ad6380 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.8.18 diff --git a/Makefile b/Makefile index 8695254..54a95d2 100644 --- a/Makefile +++ b/Makefile @@ -1,52 +1,151 @@ # SPDX-FileCopyrightText: 2025 Verizon # SPDX-License-Identifier: Apache-2.0 +# --- Colors and Styles --- +ifeq ($(shell tput colors 2>/dev/null), 256) + RED := $(shell tput setaf 1) + YELLOW := $(shell tput setaf 3) + GREEN := $(shell tput setaf 2) + BOLD := $(shell tput bold) + RESET := $(shell tput sgr0) +else + RED := "" + YELLOW := "" + GREEN := "" + BOLD := "" + RESET := "" +endif + +# --- Python & Env Detection --- +PYTHON_CMD := $(shell which python3 || which python) +ifeq ($(PYTHON_CMD),) + PYTHON_INSTALLED := false +else + PYTHON_INSTALLED := true + PYTHON := $(PYTHON_CMD) + # Check if we are already in a venv + IS_VENV := $(shell $(PYTHON) -c 'import sys; print("true" if sys.prefix != sys.base_prefix else "false")') +endif + # --- Variables --- -BUILD_DIR_NATIVE = j2735codec/build_native -BUILD_DIR_WASM = j2735codec/build_wasm -DIST_DIR = j2735codec/dist -BINDING_PY = j2735codec/bindings/python -BINDING_JS = j2735codec/bindings/node -CMAKE := $(shell which cmake) -J2735_REV ?= j2735_202409 -THREADS ?= 4 +PROJECT_ROOT := $(shell pwd) +BUILD_DIR_NATIVE = j2735codec/build_native +BUILD_DIR_WASM = j2735codec/build_wasm +BINDING_PY = j2735codec/bindings/python +PY_DIST_DIR = $(BINDING_PY)/dist +BINDING_JS = j2735codec/bindings/node +CMAKE := $(shell which cmake) +UV := $(shell which uv) +J2735_REV ?= j2735_202409 +THREADS ?= $(shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4) # --- Targets --- -.PHONY: all native wasm clean purge help sync-version +.PHONY: all native wasm clean-py uninstall-py build-py install-py test-py purge help sync-version setup-py check-env help: - @echo "Usage:" - @echo " make sync-version - Sync VERSION file to all binding configs" - @echo " make native - Build the native C static library" - @echo " make wasm - Build the WebAssembly library (Emscripten)" - @echo " make all - Build both targets" - @echo " make purge - Hard reset (removes all build and dist folders)" + @echo "$(BOLD)ETX Starter Kit Management:$(RESET)" + @echo " make install-py - Full distribution lifecycle (Clean -> Build -> Test Wheel)" + @echo " make setup-py - Sync workspace dependencies" + @echo " make native - Build native C library" + @echo " make wasm - Build WASM & Generate Enums" + @echo " make purge - Hard reset of all build artifacts" + +all: sync-version setup-py native wasm build-py + +# --- Environment Guard --- + +check-env: +ifeq ($(PYTHON_INSTALLED), false) + @echo "$(RED)$(BOLD)❌ ERROR: Python not found!$(RESET)"; exit 1 +endif +ifdef UV + @echo "$(GREEN)βœ… 'uv' workspace detected.$(RESET)" +else ifeq ($(IS_VENV), true) + @echo "$(GREEN)βœ… Active Virtualenv detected: $(PYTHON)$(RESET)" +else + @echo "$(RED)$(BOLD)⚠️ WARNING: NO VIRTUAL ENVIRONMENT DETECTED$(RESET)" + @echo "$(YELLOW)Installing to native Python: $(PYTHON)$(RESET)" + @printf "$(BOLD)Proceed? [y/N]: $(RESET)" && read ans < /dev/tty && [ $${ans:-N} = y ] +endif + +# --- Python Workflow --- + +setup-py: check-env + @echo "πŸ› οΈ Syncing dependencies..." +ifdef UV + $(UV) sync --all-packages --quiet +else + $(PYTHON) -m pip install --upgrade pip build pytest + $(PYTHON) -m pip install -e $(BINDING_PY) +endif + +uninstall-py: + @echo "πŸ—‘οΈ Uninstalling j2735codec package..." +ifdef UV + @# Only attempt uninstall if a virtualenv actually exists to avoid UV errors + @if [ -d ".venv" ]; then \ + $(UV) pip uninstall j2735codec 2>/dev/null || true; \ + fi +else + @$(PYTHON) -m pip uninstall -y j2735codec 2>/dev/null || true +endif + +# --- Master Pipeline --- +install-py: uninstall-py clean-py wasm + @echo "$(BOLD)πŸ§ͺ Phase 1: Testing Local Source...$(RESET)" + @$(MAKE) test-py + + @echo "$(BOLD)πŸ”¨ Phase 2: Building Wheel...$(RESET)" + @$(MAKE) build-py + + @WHEEL_PATH=$$(ls $(PY_DIST_DIR)/*.whl | head -n 1); \ + echo "$(BOLD)πŸ“¦ Phase 3: Installing $$WHEEL_PATH...$(RESET)"; \ + if [ -n "$(UV)" ]; then $(UV) pip install $$WHEEL_PATH; \ + else $(PYTHON) -m pip install $$WHEEL_PATH; fi + + @echo "$(BOLD)πŸ§ͺ Phase 4: Integration Test (Isolated from Source)...$(RESET)" + @# Move to tests dir so Python cannot see the local 'j2735codec' folder + @# This forces the import to come from the installed site-packages +ifdef UV + cd $(BINDING_PY)/tests && $(UV) run python -m pytest . -s +else + cd $(BINDING_PY)/tests && $(PYTHON) -m pytest . -s +endif + @echo "$(GREEN)$(BOLD)βœ… Success: Wheel is fully functional and artifacts are bundled.$(RESET)" + +build-py: wasm setup-py + @echo "πŸ“¦ Packaging Wheel..." +ifdef UV + $(UV) build --package j2735codec --wheel --out-dir $(PY_DIST_DIR) +else + $(PYTHON) -m build $(BINDING_PY) --outdir $(PY_DIST_DIR) +endif + +test-py: setup-py + @echo "πŸ§ͺ Running pytest..." +ifdef UV + $(UV) run python -m pytest $(BINDING_PY)/tests -s +else + $(PYTHON) -m pytest $(BINDING_PY)/tests -s +endif -all: sync-version native wasm +# --- Clean & Build Logic --- + +clean-py: + rm -rf $(PY_DIST_DIR) $(BINDING_PY)/*.egg-info + find $(BINDING_PY) -type d -name "__pycache__" -exec rm -rf {} + -# Native Build Logic native: - @echo "πŸ—οΈ Building Native C Library..." $(CMAKE) -B $(BUILD_DIR_NATIVE) -S j2735codec -DBUILD_NATIVE_LIB=ON $(CMAKE) --build $(BUILD_DIR_NATIVE) -j $(THREADS) -# WASM Build Logic wasm: - @echo "πŸ•ΈοΈ Building WebAssembly..." emcmake $(CMAKE) -B $(BUILD_DIR_WASM) -S j2735codec -DJ2735_REV=$(J2735_REV) $(CMAKE) --build $(BUILD_DIR_WASM) -j $(THREADS) -# Purge (The "Everything" Clean) -purge: - @echo "πŸ”₯ Starting the purge..." - rm -rf $(BUILD_DIR_NATIVE) $(BUILD_DIR_WASM) $(DIST_DIR) - - @echo "πŸ” Hunting for nested build folders..." - # Skips emsdk to avoid deleting your compiler toolchain +purge: uninstall-py clean-py + rm -rf $(BUILD_DIR_NATIVE) $(BUILD_DIR_WASM) .venv uv.lock find . -type d -name "build" -not -path "*/emsdk/*" -exec rm -rf {} + - rm -rf $(BINDING_PY)/src/j2735codec/generated - rm -rf $(BINDING_JS)/src/generated - - @echo "Project is purged ✨." + @echo "✨ Purged." \ No newline at end of file diff --git a/j2735codec/bindings/python/README.md b/j2735codec/bindings/python/README.md new file mode 100644 index 0000000..e69de29 diff --git a/j2735codec/bindings/python/pyproject.toml b/j2735codec/bindings/python/pyproject.toml new file mode 100644 index 0000000..101cee7 --- /dev/null +++ b/j2735codec/bindings/python/pyproject.toml @@ -0,0 +1,36 @@ +[project] +name = "j2735codec" +version = "0.1.0" +description = "Add your description here" +license = "Apache-2.0" +readme = "README.md" +authors = [ + { name = "Sean Hsu", email = "yu.hsiang.sean.hsu@verizon.com" } +] +requires-python = ">=3.8.18" +dependencies = [ + "importlib-resources>=6.4.5 ; python_full_version < '3.9'", + "wasmtime>=25.0.0", +] + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[dependency-groups] +dev = [ + "pytest>=8.3.5", + "ruff>=0.14.11", +] + +[tool.hatch.build.targets.wheel] +packages = ["src/j2735codec"] +artifacts = [ + "src/j2735codec/py.typed", + "src/j2735codec/generated/*.wasm", + "src/j2735codec/generated/*.py", +] + +[tool.pytest.ini_options] +pythonpath = "src" +testpaths = ["tests"] \ No newline at end of file diff --git a/j2735codec/bindings/python/src/j2735codec/__init__.py b/j2735codec/bindings/python/src/j2735codec/__init__.py new file mode 100644 index 0000000..c9eacea --- /dev/null +++ b/j2735codec/bindings/python/src/j2735codec/__init__.py @@ -0,0 +1,5 @@ +from j2735codec.codec import J2735Codec +from j2735codec.generated.encodings import EncodingRules +from j2735codec.generated.pdu import PDUTypes + +__all__ = ["EncodingRules", "PDUTypes", "J2735Codec"] \ No newline at end of file diff --git a/j2735codec/bindings/python/src/j2735codec/codec.py b/j2735codec/bindings/python/src/j2735codec/codec.py new file mode 100644 index 0000000..45c37d1 --- /dev/null +++ b/j2735codec/bindings/python/src/j2735codec/codec.py @@ -0,0 +1,149 @@ +# SPDX-FileCopyrightText: 2025 Verizon +# SPDX-License-Identifier: Apache-2.0 +""" +A Python module for V2X data transcoding using WebAssembly. + +This provides a V2XCodec class that allows for transcoding +Vehicle-to-Everything (V2X) data between different encoding rules and PDU types. +It uses the wasmtime library to load and execute a WebAssembly module +that performs the transcoding. +""" +import os +import struct +import logging +from typing import Union +from wasmtime import Func, Module, Store, Instance + +# Handle Python 3.8 vs 3.9+ compatibility for resource loading +try: + from importlib import resources + if not hasattr(resources, "files"): + raise ImportError +except ImportError: + import importlib_resources as resources + +from j2735codec import generated +from j2735codec.generated.encodings import EncodingRules +from j2735codec.generated.pdu import PDUTypes + +class J2735Codec: + """ + Represents a V2X codec for transcoding data between encodings. + + V2XCodec is a class that provides methods to transcode V2X data + between different encoding rules and PDU types using WebAssembly. + It uses the wasmtime library to load and execute a WebAssembly module + that performs the transcoding. + + Note: This class is not thread-safe. If you need to use it in a + multi-threaded environment, you should ensure that access to its methods is + synchronized across threads. + """ + + WASM_POINTER_SIZE = 4 + + def __init__(self, wasm_path: Union[str, None] = None): + if wasm_path is None: + # Modern Python 3.9+ way to get resource paths replacing pkg_resources + wasm_path = resources.files(generated).joinpath("j2735codec.wasm") + + if not os.path.exists(wasm_path): + raise FileNotFoundError(f"WASM not found: {wasm_path}") + + # prepare store and load web assembly module from path + self._store = Store() + module = Module.from_file(self._store.engine, wasm_path) + + # stub out all of the import functions that the module expects + import_list = [] + for imp in module.imports: + import_list.append(Func(self._store, imp.type, lambda *args: None)) + instance = Instance(self._store, module, import_list) + + # export all the necessary functions + for x in instance.exports(self._store).items(): + logging.debug("Exported function: %s", x) + + self._transcode = instance.exports(self._store)["transcode"] + self._malloc = instance.exports(self._store)["malloc"] + self._free = instance.exports(self._store)["free"] + self._memory = instance.exports(self._store)["memory"] + + def transcode( + self, + input_encoding: EncodingRules, + output_encoding: EncodingRules, + pdu: PDUTypes, + buffer: Union[bytes, str] + ) -> bytes: + """ + Transcode V2X data from one encoding to another. + + This method takes an input encoding, output encoding, PDU type, + and a buffer containing the data to be transcoded. It uses the + WebAssembly module to perform the transcoding and returns the + transcoded data as a bytes object. + """ + # Format the input buffer in to bytes + in_buffer = buffer + if isinstance(buffer, str): + in_buffer = buffer.encode('utf-8') + in_buffer_len = len(in_buffer) + + # Allocate memory for input buffer + in_buffer_wasm = self._malloc(self._store, in_buffer_len) + if not in_buffer_wasm: + raise RuntimeError("Failed to allocate input WASM memory.") + + # Allocate memory for the output pointer (void**) + out_buffer_ptr = self._malloc( + self._store, + J2735Codec.WASM_POINTER_SIZE) + if not out_buffer_ptr: + self._free(self._store, in_buffer_wasm) # Cleanup + raise RuntimeError("Failed to allocate output pointer WASM memory.") + + try: + # Write Python data into input buffer + # Slicing is more efficient than a loop for large buffers + memory_view = self._memory.data_ptr(self._store) + for i, byte in enumerate(in_buffer): + memory_view[in_buffer_wasm + i] = byte + + # Call the transcode function + output_data_len = self._transcode( + self._store, + input_encoding.value, + output_encoding.value, + pdu.value, + in_buffer_wasm, + in_buffer_len, + out_buffer_ptr) + + if output_data_len <= 0: + raise RuntimeError(f"Transcoding failed with error code: {output_data_len}") + + # Read the output pointer from WASM memory + # Refetch view in case memory growth occurred during transcode + view_after = self._memory.data_ptr(self._store) + + # Read the bytes representing the address + ptr_bytes = bytes(view_after[out_buffer_ptr : out_buffer_ptr + J2735Codec.WASM_POINTER_SIZE]) + + # Unpack those bytes to get the integer address of the actual output buffer + pointer_format = " UPER (Binary) + encoded_bin = codec.transcode( + EncodingRules.JER, + EncodingRules.UNALIGNED_BASIC_PER, + PDUTypes.MESSAGE_FRAME, + json_content, + ) + + assert isinstance(encoded_bin, (bytes, bytearray)) + assert len(encoded_bin) > 0 + + # Decode: UPER (Binary) -> JER (JSON) + decoded_jer = codec.transcode( + EncodingRules.UNALIGNED_BASIC_PER, + EncodingRules.JER, + PDUTypes.MESSAGE_FRAME, + encoded_bin, + ) + + # Convert output to string for validation + decoded_str = decoded_jer.decode("utf-8") if hasattr(decoded_jer, "decode") else str(decoded_jer) + + assert len(decoded_str) > 0 + # Validate it's still valid JSON + assert isinstance(json.loads(decoded_str), dict) \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..2aca449 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,15 @@ +[project] +name = "etx-starter-kit" +version = "0.1.0" +requires-python = ">=3.8.18" +dependencies = [ + "j2735codec", +] + +[tool.uv] +# Add any additional workspaces here in the future. +workspace = { members = ["j2735codec/bindings/python"] } + +[tool.uv.sources] +# This explicitly tells UV where to find the 'j2735codec' package +j2735codec = { workspace = true } \ No newline at end of file From 5f3683fcccaf1379424e9660e1a4b11e9ae3934e Mon Sep 17 00:00:00 2001 From: Sean Hsu Date: Thu, 15 Jan 2026 19:27:11 -0500 Subject: [PATCH 06/21] feat: add node.js bindings and workspace orchestration --- .nvmrc | 1 + j2735codec/bindings/node/.gitignore | 36 + j2735codec/bindings/node/.npmignore | 5 + j2735codec/bindings/node/README.md | 103 + j2735codec/bindings/node/package.json | 31 + j2735codec/bindings/node/src/codec.ts | 171 ++ j2735codec/bindings/node/src/index.ts | 3 + j2735codec/bindings/node/tests/codec.test.ts | 62 + j2735codec/bindings/node/tsconfig.build.json | 18 + j2735codec/bindings/node/tsconfig.json | 10 + j2735codec/bindings/node/tsconfig.test.json | 10 + j2735codec/bindings/node/vitest.config.ts | 15 + package-lock.json | 2100 ++++++++++++++++++ package.json | 15 + 14 files changed, 2580 insertions(+) create mode 100644 .nvmrc create mode 100644 j2735codec/bindings/node/.gitignore create mode 100644 j2735codec/bindings/node/.npmignore create mode 100644 j2735codec/bindings/node/README.md create mode 100644 j2735codec/bindings/node/package.json create mode 100644 j2735codec/bindings/node/src/codec.ts create mode 100644 j2735codec/bindings/node/src/index.ts create mode 100644 j2735codec/bindings/node/tests/codec.test.ts create mode 100644 j2735codec/bindings/node/tsconfig.build.json create mode 100644 j2735codec/bindings/node/tsconfig.json create mode 100644 j2735codec/bindings/node/tsconfig.test.json create mode 100644 j2735codec/bindings/node/vitest.config.ts create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..aebd91c --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v22.16.0 diff --git a/j2735codec/bindings/node/.gitignore b/j2735codec/bindings/node/.gitignore new file mode 100644 index 0000000..64f7717 --- /dev/null +++ b/j2735codec/bindings/node/.gitignore @@ -0,0 +1,36 @@ +# --- Dependencies --- +node_modules/ +.npm/ + +# --- TypeScript / Build Outputs --- +# We ignore the dist folder because it is generated by 'npm run build' +dist/ +*.tsbuildinfo + +# --- WASM Binaries --- +# If your CI downloads WASM files into a specific folder, ignore it +# so you don't accidentally commit large binary files +wasm/j2735.wasm +wasm/j2735.js + +# --- Logs & Debugging --- +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.eslintcache + +# --- OS & IDE Specific --- +.DS_Store +.vscode/ +.idea/ +*.swp +*.swo + +# --- Environment & Secrets --- +.env +.env.local +.env.*.local + +wasm/ \ No newline at end of file diff --git a/j2735codec/bindings/node/.npmignore b/j2735codec/bindings/node/.npmignore new file mode 100644 index 0000000..9298ea4 --- /dev/null +++ b/j2735codec/bindings/node/.npmignore @@ -0,0 +1,5 @@ +tests/ +vitest.config.ts +tsconfig.json +.github/ +*.log \ No newline at end of file diff --git a/j2735codec/bindings/node/README.md b/j2735codec/bindings/node/README.md new file mode 100644 index 0000000..6b7c5a7 --- /dev/null +++ b/j2735codec/bindings/node/README.md @@ -0,0 +1,103 @@ +# J2735 Codec - Node.js Bindings + +This package provides Node.js bindings for the **SAE J2735 (202409)** V2X codec, powered by WebAssembly. It enables seamless conversion between JSON (JER) and Packed Encoding Rules (UPER) in JavaScript and TypeScript environments. + +## πŸ“₯ End User Installation + +### Runtime Requirements + +- **Node.js**: v22.16.0 or higher (Current LTS recommended). +- **Native Support**: No C++ toolchains (node-gyp), Python, or external libraries are required. The WebAssembly engine runs natively on the V8 runtime. + +### From GitHub Releases + +Install the package directly using the tarball link from the project release page: + +```bash +npm install https://github.com/verizon/j2735codec/releases/download/v1.0.0/j2735codec-1.0.0.tgz +``` + +**Note**: The link above is not valid, just an example. Please see release page in this repo for proper links to to use. + +## πŸ›  Local Build & Installation + +### 1. Build the WASM Engine + +The Node.js bindings require the compiled WebAssembly binary. Build the artifacts from the project root: + +```Bash +# From the project root +make wasm +``` + +This places the j2735.wasm and associated metadata into src/wasm/. + +### 2. Build the Package + +We use TypeScript to generate a flat distribution for high-performance path resolution. + +```bash +# From bindings/node +npm install +npm run build +``` + +This generates a dist/ folder containing the compiled JavaScript, type definitions (.d.ts), and the bundled WASM assets. + +## πŸš€ Usage + +The Node.js interface is asynchronous during initialization to allow for non-blocking WASM compilation. + +```Typescript +import { createV2XCodec, EncodingRules, PDUTypes } from 'j2735codec'; + +async function run() { + // Initialize the codec (loads and compiles WASM binary) + const codec = await createV2XCodec(); + + const jsonContent = '{ "messageFrame": { ... } }'; + + // 1. Transcode: JSON (JER) -> Packed (UPER) + const uperBytes = codec.transcode( + EncodingRules.JER, + EncodingRules.UNALIGNED_BASIC_PER, + PDUTypes.MessageFrame, + jsonContent + ); + + console.log('Encoded UPER (Hex):', Buffer.from(uperBytes).toString('hex').toUpperCase()); + + // 2. Transcode: Packed (UPER) -> JSON (JER) + const decodedJson = codec.transcode( + EncodingRules.UNALIGNED_BASIC_PER, + EncodingRules.JER, + PDUTypes.MessageFrame, + uperBytes + ); + + // Convert Uint8Array result to string + console.log('Decoded JSON:', new TextDecoder().decode(decodedJson)); +} + +run().catch(console.error); +``` + +## πŸ›  Development Notes + +### Distribution + +This package uses a flattened dist/ structure. The TypeScript source in src/ is compiled directly into the root of dist/ (e.g., src/codec.ts becomes dist/codec.js). This ensures that the internal path resolution to the wasm/ directory remains identical in both development and production. + +### Testing + +We use Vitest for unit and integration testing. + +```bash +npm test +``` + +## πŸ”’ Unified Versioning +The version in package.json must match the root CMakeLists.txt version. Please refer to the root CONTRIBUTING.md before bumping versions. + +## βš–οΈ License +Licensed under the Apache License 2.0. \ No newline at end of file diff --git a/j2735codec/bindings/node/package.json b/j2735codec/bindings/node/package.json new file mode 100644 index 0000000..249bbd7 --- /dev/null +++ b/j2735codec/bindings/node/package.json @@ -0,0 +1,31 @@ +{ + "name": "j2735codec", + "version": "0.1.0", + "description": "Node.js bindings for the J2735 WASM codec", + "main": "./dist/index.js", + "scripts": { + "clean": "rimraf dist", + "build": "npm run clean && tsc -b tsconfig.build.json && npm run copy-wasm", + "copy-wasm": "copyfiles -u 1 \"src/generated/**/*\" dist/", + "test": "vitest run" + }, + "keywords": [], + "author": "Sean Hsu", + "license": "Apache-2.0", + "type": "module", + "engines": { + "node": ">=22.0.0" + }, + "devDependencies": { + "@types/node": "^25.0.8", + "copyfiles": "^2.4.1", + "rimraf": "^6.1.2", + "typescript": "^5.9.3", + "vitest": "^4.0.17" + }, + "types": "./dist/index.d.ts", + "files": [ + "dist/src", + "src/wasm" + ] +} diff --git a/j2735codec/bindings/node/src/codec.ts b/j2735codec/bindings/node/src/codec.ts new file mode 100644 index 0000000..2d15bbc --- /dev/null +++ b/j2735codec/bindings/node/src/codec.ts @@ -0,0 +1,171 @@ +/** + * SPDX-FileCopyrightText: 2026 Verizon + * SPDX-License-Identifier: Apache-2.0 + * * @fileoverview Node.js wrapper for the V2X ASN.1 Codec WebAssembly module. + * Provides high-level methods for transcoding J2735 messages. + */ +import { readFile } from 'node:fs/promises'; +import { fileURLToPath } from 'node:url'; +import { dirname, join } from 'node:path'; + +import { PDUTypes } from './generated/pdu.js'; +import { EncodingRules } from './generated/encodings.js'; + +/** ESM-safe directory resolution */ +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +/** + * Factory function to initialize the V2X Codec WebAssembly module. + * * @returns A promise resolving to an initialized V2XCodec instance. + * @throws {Error} If the WASM file cannot be read or instantiation fails. + */ +export async function createV2XCodec(): Promise { + const wasmPath = join(__dirname, "generated", "j2735codec.wasm"); + + let wasmBuffer: Uint8Array; + try { + wasmBuffer = await readFile(wasmPath); + } catch (err) { + const errorMessage = err instanceof Error ? err.message : String(err); + throw new Error(`Failed to load WASM at ${wasmPath}: ${errorMessage}`); + } + + /** * WASI Snapshot 1 and Environment imports. + * These stubs satisfy the requirements of the C-compiled WASM binary. + */ + const imports = { + wasi_snapshot_preview1: { + fd_write: () => 0, + fd_close: () => 0, + environ_sizes_get: () => 0, + environ_get: () => 0, + fd_seek: () => 0, + /** @param code - Exit code from WASM */ + proc_exit: (code: number) => { + throw new Error(`WASM exited with code ${code}`); + }, + }, + env: { + timegm: () => 0, + } + }; + + const result = await WebAssembly.instantiate(wasmBuffer, imports); + + // Cast to unknown first to avoid strict WebAssemblyInstantiatedSource overlap issues + const { instance } = (result as unknown) as WebAssembly.WebAssemblyInstantiatedSource; + + return new V2XCodec(instance); +} + +/** + * High-level interface for the V2X ASN.1 Codec. + * Handles memory management and pointer orchestration between JS and C. + */ +export class V2XCodec { + /** The raw exports from the WebAssembly instance. */ + private exports: WebAssembly.Exports; + + /** + * @param wasmInstance - An instantiated WebAssembly module. + */ + constructor(wasmInstance: WebAssembly.Instance) { + this.exports = wasmInstance.exports; + } + + /** + * Transcodes a buffer between different ASN.1 encoding rules (e.g., UPER to JER). + * * @param inEncodingRule - The encoding rule of the input buffer. + * @param outEncodingRule - The desired encoding rule for the output. + * @param pduType - The type of Protocol Data Unit (e.g., BSM, SPAT). + * @param buffer - The raw input data (Uint8Array) or JSON string (if JER). + * @returns A copy of the transcoded data as a Uint8Array. + * @throws {Error} If transcoding fails in the underlying C logic. + */ + public transcode( + inEncodingRule: EncodingRules, + outEncodingRule: EncodingRules, + pduType: PDUTypes, + buffer: Uint8Array | string + ): Uint8Array { + // Convert string to buffer if input is JER/JSON + const inBuffer = typeof buffer === 'string' ? new TextEncoder().encode(buffer) : buffer; + + // Allocate and write input data to WASM memory + const inPtr = this.malloc(inBuffer.length); + new Uint8Array(this.memory.buffer).set(inBuffer, inPtr); + + // Prepare an output pointer-to-pointer (int**) to receive the result address from C + const ptrSize = 4; + const ptrToPtr = this.malloc(ptrSize); + + const view = new DataView(this.memory.buffer); + view.setUint32(ptrToPtr, 0, true); + + // Execute the cross-compiled C transcoding function + const outBytes = this.transcodeLL( + inEncodingRule, + outEncodingRule, + pduType, + inPtr, + inBuffer.length, + ptrToPtr + ); + + // Cleanup input buffer immediately + this.free(inPtr); + + // Extract the result address from the pointer-to-pointer + const viewAfter = new DataView(this.memory.buffer); + const dataPtr = viewAfter.getUint32(ptrToPtr, true); + + if (dataPtr === 0 || outBytes <= 0) { + this.free(ptrToPtr); + throw new Error(`Transcode failed for PDU ${PDUTypes[pduType]}. Error in C logic.`); + } + + // Create a safe copy of the memory before freeing the WASM-allocated buffer + const result = new Uint8Array(this.memory.buffer, dataPtr, outBytes).slice(); + + // Final cleanup of output allocations + this.free(dataPtr); + this.free(ptrToPtr); + + return result; + } + + // --- Low Level WASM Wrappers --- + + /** + * Low-level call to the C transcode implementation. + * @private + */ + private transcodeLL(in_s: number, out_s: number, type: number, in_b: number, in_sz: number, out_b: number): number { + return (this.exports.transcode as Function)(in_s, out_s, type, in_b, in_sz, out_b); + } + + /** + * Allocates memory in the WebAssembly heap. + * @param size - Number of bytes to allocate. + * @returns The offset (pointer) to the allocated memory. + */ + public malloc(size: number): number { + return (this.exports.malloc as Function)(size); + } + + /** + * Frees memory previously allocated in the WebAssembly heap. + * @param ptr - The offset (pointer) to the memory to free. + */ + public free(ptr: number): void { + (this.exports.free as Function)(ptr); + } + + /** + * Accessor for the shared WebAssembly Memory buffer. + */ + public get memory(): WebAssembly.Memory { + return this.exports.memory as WebAssembly.Memory; + } +} \ No newline at end of file diff --git a/j2735codec/bindings/node/src/index.ts b/j2735codec/bindings/node/src/index.ts new file mode 100644 index 0000000..0f1637e --- /dev/null +++ b/j2735codec/bindings/node/src/index.ts @@ -0,0 +1,3 @@ +export * from "./generated/encodings.js"; +export * from "./generated/pdu.js"; +export * from "./codec.js"; \ No newline at end of file diff --git a/j2735codec/bindings/node/tests/codec.test.ts b/j2735codec/bindings/node/tests/codec.test.ts new file mode 100644 index 0000000..2afd900 --- /dev/null +++ b/j2735codec/bindings/node/tests/codec.test.ts @@ -0,0 +1,62 @@ +import { describe, it, expect, beforeAll } from 'vitest'; +import { existsSync, readdirSync, readFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { dirname, join } from 'node:path'; +import { createV2XCodec, V2XCodec, EncodingRules, PDUTypes } from '../src/index.js'; + +describe('V2X Codec 202409 Integration Tests', () => { + let codec: V2XCodec; + + // Define sample paths relative to this test file + const __filename = fileURLToPath(import.meta.url); + const __dirname = dirname(__filename); + + const sampleDir = join(__dirname, '../../../core/j2735_202409/samples/jer'); + + beforeAll(async () => { + // Ensure samples exist before starting + if (!existsSync(sampleDir)) { + console.error(`❌ Sample directory missing: ${sampleDir}`); + throw new Error(`ENOENT: Check j2735codec/bindings/node/samples/j2735_202409/json`); + } + + // Initialize the WASM codec once + codec = await createV2XCodec(); + }); + + // Get all JSON samples from the 202409 revision + const messageFiles = readdirSync(sampleDir).filter(f => f.endsWith('.json')); + + it.each(messageFiles)('should round-trip transcode 202409 sample: %s', (fileName) => { + const filePath = join(sampleDir, fileName); + const originalContent = readFileSync(filePath, "utf8"); + + // 1. JER (JSON) -> UPER (Binary) + const encoded = codec.transcode( + EncodingRules.JER, + EncodingRules.UNALIGNED_BASIC_PER, + PDUTypes.MessageFrame, + originalContent + ); + + expect(encoded).toBeInstanceOf(Uint8Array); + expect(encoded.length).toBeGreaterThan(0); + + // 2. UPER (Binary) -> JER (JSON) + const decoded = codec.transcode( + EncodingRules.UNALIGNED_BASIC_PER, + EncodingRules.JER, + PDUTypes.MessageFrame, + encoded + ); + + const decodedStr = new TextDecoder().decode(decoded); + expect(decodedStr.length).toBeGreaterThan(0); + + // Final Verification + const json = JSON.parse(decodedStr); + expect(json).toBeDefined(); + // 202409 specific check: Ensure MessageFrame wrapper exists + expect(json).toHaveProperty('messageId'); + }); +}); \ No newline at end of file diff --git a/j2735codec/bindings/node/tsconfig.build.json b/j2735codec/bindings/node/tsconfig.build.json new file mode 100644 index 0000000..f8cbbaf --- /dev/null +++ b/j2735codec/bindings/node/tsconfig.build.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "composite": false, + "incremental": false, + "outDir": "./dist", + "rootDir": "src", + "target": "ESNext", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "declaration": true, + "skipLibCheck": true + }, + "include": [ + "src/**/*.ts", + "src/wasm/metadata/**/*.ts" + ], + "exclude": ["src/wasm/samples/json"] +} \ No newline at end of file diff --git a/j2735codec/bindings/node/tsconfig.json b/j2735codec/bindings/node/tsconfig.json new file mode 100644 index 0000000..c74308b --- /dev/null +++ b/j2735codec/bindings/node/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "module": "NodeNext", + }, + "files": [], + "references": [ + { "path": "./tsconfig.build.json" }, + { "path": "./tsconfig.test.json" } + ] +} \ No newline at end of file diff --git a/j2735codec/bindings/node/tsconfig.test.json b/j2735codec/bindings/node/tsconfig.test.json new file mode 100644 index 0000000..3070f57 --- /dev/null +++ b/j2735codec/bindings/node/tsconfig.test.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "include": ["src/**/*", "tests/**/*"], + "exclude": [], + "compilerOptions": { + "composite": true, + "noEmit": true, + "rootDir": "./", + }, +} \ No newline at end of file diff --git a/j2735codec/bindings/node/vitest.config.ts b/j2735codec/bindings/node/vitest.config.ts new file mode 100644 index 0000000..7714f0f --- /dev/null +++ b/j2735codec/bindings/node/vitest.config.ts @@ -0,0 +1,15 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + // This tells Vitest to ignore the compiled dist folder + exclude: ['**/node_modules/**', '**/dist/**'], + // Ensure it picks up your source tests + include: ['tests/**/*.test.ts'], + }, + resolve: { + alias: { + tsconfig: './tsconfig.test.json' + } + } +}); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2051b9d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2100 @@ +{ + "name": "etx-starter-kit", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "etx-starter-kit", + "workspaces": [ + "j2735codec/bindings/node" + ] + }, + "j2735codec/bindings/node": { + "name": "j2735codec", + "version": "0.1.0", + "license": "Apache-2.0", + "devDependencies": { + "@types/node": "^25.0.8", + "copyfiles": "^2.4.1", + "rimraf": "^6.1.2", + "typescript": "^5.9.3", + "vitest": "^4.0.17" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", + "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", + "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", + "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", + "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", + "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", + "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", + "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", + "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", + "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", + "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", + "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", + "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", + "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", + "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", + "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", + "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", + "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", + "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", + "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", + "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", + "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", + "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", + "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", + "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", + "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.0.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.9.tgz", + "integrity": "sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/copyfiles": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", + "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "untildify": "^4.0.0", + "yargs": "^16.1.0" + }, + "bin": { + "copyfiles": "copyfiles", + "copyup": "copyfiles" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/j2735codec": { + "resolved": "j2735codec/bindings/node", + "link": true + }, + "node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/noms": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", + "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==", + "dev": true, + "license": "ISC", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", + "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^13.0.0", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", + "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.55.1", + "@rollup/rollup-android-arm64": "4.55.1", + "@rollup/rollup-darwin-arm64": "4.55.1", + "@rollup/rollup-darwin-x64": "4.55.1", + "@rollup/rollup-freebsd-arm64": "4.55.1", + "@rollup/rollup-freebsd-x64": "4.55.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", + "@rollup/rollup-linux-arm-musleabihf": "4.55.1", + "@rollup/rollup-linux-arm64-gnu": "4.55.1", + "@rollup/rollup-linux-arm64-musl": "4.55.1", + "@rollup/rollup-linux-loong64-gnu": "4.55.1", + "@rollup/rollup-linux-loong64-musl": "4.55.1", + "@rollup/rollup-linux-ppc64-gnu": "4.55.1", + "@rollup/rollup-linux-ppc64-musl": "4.55.1", + "@rollup/rollup-linux-riscv64-gnu": "4.55.1", + "@rollup/rollup-linux-riscv64-musl": "4.55.1", + "@rollup/rollup-linux-s390x-gnu": "4.55.1", + "@rollup/rollup-linux-x64-gnu": "4.55.1", + "@rollup/rollup-linux-x64-musl": "4.55.1", + "@rollup/rollup-openbsd-x64": "4.55.1", + "@rollup/rollup-openharmony-arm64": "4.55.1", + "@rollup/rollup-win32-arm64-msvc": "4.55.1", + "@rollup/rollup-win32-ia32-msvc": "4.55.1", + "@rollup/rollup-win32-x64-gnu": "4.55.1", + "@rollup/rollup-win32-x64-msvc": "4.55.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..23d7de5 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "etx-starter-kit", + "private": true, + "description": "The official onboarding resource for Verizon ETX, providing starter samples and J2735 codec bindings", + "workspaces": [ + "j2735codec/bindings/node" + ], + "scripts": { + "test": "npm run test --workspaces", + "build": "npm run build --workspaces", + "build:all": "make wasm && npm run build --workspaces", + "test:all": "npm test --workspaces", + "clean": "make purge" + } +} From 76a7fae2e8c669194f061ef097fd89a9417b42a6 Mon Sep 17 00:00:00 2001 From: Sean Hsu Date: Thu, 15 Jan 2026 20:01:38 -0500 Subject: [PATCH 07/21] build: add Makefile support for node bindings - Add setup-js, build-js, and install-js targets to Makefile. - Update codec.test.ts to import from package name. --- .gitignore | 1 + Makefile | 146 ++++++++++++------- j2735codec/bindings/node/tests/codec.test.ts | 2 +- 3 files changed, 95 insertions(+), 54 deletions(-) diff --git a/.gitignore b/.gitignore index 9b6df8d..2ae2811 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ _build/ out/ dist/ bin/ +*.tgz *.tsbuildinfo # --- C++ / CMake / WASM Tooling --- diff --git a/Makefile b/Makefile index 54a95d2..db702b9 100644 --- a/Makefile +++ b/Makefile @@ -16,42 +16,54 @@ else RESET := "" endif -# --- Python & Env Detection --- +# --- Detection --- PYTHON_CMD := $(shell which python3 || which python) ifeq ($(PYTHON_CMD),) PYTHON_INSTALLED := false else PYTHON_INSTALLED := true PYTHON := $(PYTHON_CMD) - # Check if we are already in a venv IS_VENV := $(shell $(PYTHON) -c 'import sys; print("true" if sys.prefix != sys.base_prefix else "false")') endif +NPM := $(shell which npm) +CMAKE := $(shell which cmake) +UV := $(shell which uv) + # --- Variables --- PROJECT_ROOT := $(shell pwd) BUILD_DIR_NATIVE = j2735codec/build_native BUILD_DIR_WASM = j2735codec/build_wasm + +DIST_DIR = j2735codec/dist + BINDING_PY = j2735codec/bindings/python PY_DIST_DIR = $(BINDING_PY)/dist + BINDING_JS = j2735codec/bindings/node -CMAKE := $(shell which cmake) -UV := $(shell which uv) +JS_DIST_DIR = $(BINDING_JS)/dist + J2735_REV ?= j2735_202409 THREADS ?= $(shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4) # --- Targets --- -.PHONY: all native wasm clean-py uninstall-py build-py install-py test-py purge help sync-version setup-py check-env +.PHONY: all setup native wasm purge help \ + setup-py build-py install-py test-py clean-py uninstall-py \ + setup-js build-js install-js test-js clean-js help: @echo "$(BOLD)ETX Starter Kit Management:$(RESET)" - @echo " make install-py - Full distribution lifecycle (Clean -> Build -> Test Wheel)" - @echo " make setup-py - Sync workspace dependencies" - @echo " make native - Build native C library" - @echo " make wasm - Build WASM & Generate Enums" - @echo " make purge - Hard reset of all build artifacts" + @echo " $(BOLD)make setup$(RESET) - Sync all dependencies (Python & Node)" + @echo " $(BOLD)make install-py$(RESET) - Full Python lifecycle (Build -> Test Wheel)" + @echo " $(BOLD)make install-js$(RESET) - Full Node.js lifecycle (Build -> Test Tarball)" + @echo " $(BOLD)make native$(RESET) - Build native C library" + @echo " $(BOLD)make wasm$(RESET) - Build WASM & Generate Enums" + @echo " $(BOLD)make purge$(RESET) - Hard reset of all build artifacts" -all: sync-version setup-py native wasm build-py +all: sync-version setup native wasm build-py build-js + +setup: setup-py setup-js # --- Environment Guard --- @@ -59,20 +71,14 @@ check-env: ifeq ($(PYTHON_INSTALLED), false) @echo "$(RED)$(BOLD)❌ ERROR: Python not found!$(RESET)"; exit 1 endif -ifdef UV - @echo "$(GREEN)βœ… 'uv' workspace detected.$(RESET)" -else ifeq ($(IS_VENV), true) - @echo "$(GREEN)βœ… Active Virtualenv detected: $(PYTHON)$(RESET)" -else - @echo "$(RED)$(BOLD)⚠️ WARNING: NO VIRTUAL ENVIRONMENT DETECTED$(RESET)" - @echo "$(YELLOW)Installing to native Python: $(PYTHON)$(RESET)" - @printf "$(BOLD)Proceed? [y/N]: $(RESET)" && read ans < /dev/tty && [ $${ans:-N} = y ] +ifeq ($(NPM),) + @echo "$(RED)$(BOLD)❌ ERROR: npm not found!$(RESET)"; exit 1 endif # --- Python Workflow --- setup-py: check-env - @echo "πŸ› οΈ Syncing dependencies..." + @echo "πŸ› οΈ Syncing Python dependencies..." ifdef UV $(UV) sync --all-packages --quiet else @@ -82,40 +88,13 @@ endif uninstall-py: @echo "πŸ—‘οΈ Uninstalling j2735codec package..." -ifdef UV - @# Only attempt uninstall if a virtualenv actually exists to avoid UV errors @if [ -d ".venv" ]; then \ - $(UV) pip uninstall j2735codec 2>/dev/null || true; \ + if [ -n "$(UV)" ]; then $(UV) pip uninstall j2735codec 2>/dev/null || true; \ + else $(PYTHON) -m pip uninstall -y j2735codec 2>/dev/null || true; fi \ fi -else - @$(PYTHON) -m pip uninstall -y j2735codec 2>/dev/null || true -endif - -# --- Master Pipeline --- -install-py: uninstall-py clean-py wasm - @echo "$(BOLD)πŸ§ͺ Phase 1: Testing Local Source...$(RESET)" - @$(MAKE) test-py - - @echo "$(BOLD)πŸ”¨ Phase 2: Building Wheel...$(RESET)" - @$(MAKE) build-py - - @WHEEL_PATH=$$(ls $(PY_DIST_DIR)/*.whl | head -n 1); \ - echo "$(BOLD)πŸ“¦ Phase 3: Installing $$WHEEL_PATH...$(RESET)"; \ - if [ -n "$(UV)" ]; then $(UV) pip install $$WHEEL_PATH; \ - else $(PYTHON) -m pip install $$WHEEL_PATH; fi - - @echo "$(BOLD)πŸ§ͺ Phase 4: Integration Test (Isolated from Source)...$(RESET)" - @# Move to tests dir so Python cannot see the local 'j2735codec' folder - @# This forces the import to come from the installed site-packages -ifdef UV - cd $(BINDING_PY)/tests && $(UV) run python -m pytest . -s -else - cd $(BINDING_PY)/tests && $(PYTHON) -m pytest . -s -endif - @echo "$(GREEN)$(BOLD)βœ… Success: Wheel is fully functional and artifacts are bundled.$(RESET)" build-py: wasm setup-py - @echo "πŸ“¦ Packaging Wheel..." + @echo "πŸ“¦ Packaging Python Wheel..." ifdef UV $(UV) build --package j2735codec --wheel --out-dir $(PY_DIST_DIR) else @@ -130,12 +109,64 @@ else $(PYTHON) -m pytest $(BINDING_PY)/tests -s endif -# --- Clean & Build Logic --- +install-py: uninstall-py clean-py wasm + @echo "$(BOLD)πŸ§ͺ Phase 1: Testing Local Source...$(RESET)" + @$(MAKE) test-py + @echo "$(BOLD)πŸ”¨ Phase 2: Building Wheel...$(RESET)" + @$(MAKE) build-py + @WHEEL_PATH=$$(ls $(PY_DIST_DIR)/*.whl | head -n 1); \ + echo "$(BOLD)πŸ“¦ Phase 3: Installing $$WHEEL_PATH...$(RESET)"; \ + if [ -n "$(UV)" ]; then $(UV) pip install $$WHEEL_PATH; \ + else $(PYTHON) -m pip install $$WHEEL_PATH; fi + @echo "$(BOLD)πŸ§ͺ Phase 4: Integration Test (Isolated from Source)...$(RESET)" + @cd $(BINDING_PY)/tests && (if [ -n "$(UV)" ]; then $(UV) run python -m pytest . -s; \ + else $(PYTHON) -m pytest . -s; fi) + @echo "$(GREEN)$(BOLD)βœ… Success: Python Wheel verified.$(RESET)" clean-py: rm -rf $(PY_DIST_DIR) $(BINDING_PY)/*.egg-info find $(BINDING_PY) -type d -name "__pycache__" -exec rm -rf {} + +# --- Node Workflow --- + +setup-js: check-env + @echo "πŸ“¦ Syncing Node.js workspaces..." + @$(NPM) install + +build-js: wasm setup-js + @echo "πŸ”¨ Building Node Bindings..." + @$(NPM) run build -w j2735codec + +test-js: setup-js + @echo "πŸ§ͺ Running Vitest..." + @$(NPM) test -w j2735codec + +clean-js: + @echo "🧹 Cleaning Node artifacts..." + @rm -rf $(JS_DIST_DIR) + @find $(BINDING_JS) -name "*.tgz" -delete + +install-js: clean-js build-js + @echo "$(BOLD)πŸ§ͺ Phase 1: Local Source Test...$(RESET)" + @$(MAKE) test-js + @echo "$(BOLD)πŸ”¨ Phase 2: Packaging Tarball...$(RESET)" + @cd $(BINDING_JS) && $(NPM) pack > /dev/null + @echo "$(BOLD)πŸ“¦ Phase 3: Isolated Integration Test...$(RESET)" + @TARBALL_PATH=$$(ls $(BINDING_JS)/*.tgz | head -n 1); \ + FULL_TARBALL_PATH=$$(pwd)/$$TARBALL_PATH; \ + TEMP_DIR=$$(mktemp -d); \ + trap 'rm -rf $$TEMP_DIR' EXIT; \ + cd $$TEMP_DIR && $(NPM) init -y > /dev/null; \ + $(NPM) install $$FULL_TARBALL_PATH > /dev/null; \ + cp -r $(PROJECT_ROOT)/$(BINDING_JS)/tests ./tests; \ + # Check if samples exist before copying to avoid the 'cp' error you saw + if [ -d "$(PROJECT_ROOT)/$(BINDING_JS)/samples" ]; then cp -r $(PROJECT_ROOT)/$(BINDING_JS)/samples ./samples; fi; \ + echo "$(BOLD)πŸš€ Verifying tarball in isolation...$(RESET)"; \ + $(NPM) exec vitest run || exit 1; \ + echo "$(GREEN)$(BOLD)βœ… Success: Node Tarball verified.$(RESET)" + +# --- C++ / WASM Logic --- + native: $(CMAKE) -B $(BUILD_DIR_NATIVE) -S j2735codec -DBUILD_NATIVE_LIB=ON $(CMAKE) --build $(BUILD_DIR_NATIVE) -j $(THREADS) @@ -144,8 +175,17 @@ wasm: emcmake $(CMAKE) -B $(BUILD_DIR_WASM) -S j2735codec -DJ2735_REV=$(J2735_REV) $(CMAKE) --build $(BUILD_DIR_WASM) -j $(THREADS) -purge: uninstall-py clean-py - rm -rf $(BUILD_DIR_NATIVE) $(BUILD_DIR_WASM) .venv uv.lock +sync-version: + @echo "πŸ”„ Syncing version from VERSION file..." + @# Script logic here if needed + +purge: uninstall-py clean-py clean-js + @echo "πŸ”₯ Hard purging all artifacts..." + rm -rf $(BUILD_DIR_NATIVE) $(BUILD_DIR_WASM) .venv uv.lock node_modules package-lock.json find . -type d -name "build" -not -path "*/emsdk/*" -exec rm -rf {} + rm -rf $(BINDING_PY)/src/j2735codec/generated + rm -rf $(BINDING_JS)/src/generated + rm -rf $(BINDING_JS)/node_modules + rm -rf $(DIST_DIR) + rm -rf @echo "✨ Purged." \ No newline at end of file diff --git a/j2735codec/bindings/node/tests/codec.test.ts b/j2735codec/bindings/node/tests/codec.test.ts index 2afd900..961b15c 100644 --- a/j2735codec/bindings/node/tests/codec.test.ts +++ b/j2735codec/bindings/node/tests/codec.test.ts @@ -2,7 +2,7 @@ import { describe, it, expect, beforeAll } from 'vitest'; import { existsSync, readdirSync, readFileSync } from 'node:fs'; import { fileURLToPath } from 'node:url'; import { dirname, join } from 'node:path'; -import { createV2XCodec, V2XCodec, EncodingRules, PDUTypes } from '../src/index.js'; +import { createV2XCodec, V2XCodec, EncodingRules, PDUTypes } from 'j2735codec'; describe('V2X Codec 202409 Integration Tests', () => { let codec: V2XCodec; From 0d60ce021ed8384200b35975d75663cfb49e7c12 Mon Sep 17 00:00:00 2001 From: Sean Hsu Date: Thu, 15 Jan 2026 20:11:46 -0500 Subject: [PATCH 08/21] docs: bump project version to 0.2.0 --- Makefile | 29 +++++++++++++++++++---- VERSION | 2 +- j2735codec/CMakeLists.txt | 2 +- j2735codec/bindings/node/package.json | 2 +- j2735codec/bindings/python/pyproject.toml | 2 +- package-lock.json | 4 +++- package.json | 1 + pyproject.toml | 2 +- 8 files changed, 33 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index db702b9..886b411 100644 --- a/Makefile +++ b/Makefile @@ -175,10 +175,6 @@ wasm: emcmake $(CMAKE) -B $(BUILD_DIR_WASM) -S j2735codec -DJ2735_REV=$(J2735_REV) $(CMAKE) --build $(BUILD_DIR_WASM) -j $(THREADS) -sync-version: - @echo "πŸ”„ Syncing version from VERSION file..." - @# Script logic here if needed - purge: uninstall-py clean-py clean-js @echo "πŸ”₯ Hard purging all artifacts..." rm -rf $(BUILD_DIR_NATIVE) $(BUILD_DIR_WASM) .venv uv.lock node_modules package-lock.json @@ -188,4 +184,27 @@ purge: uninstall-py clean-py clean-js rm -rf $(BINDING_JS)/node_modules rm -rf $(DIST_DIR) rm -rf - @echo "✨ Purged." \ No newline at end of file + @echo "✨ Purged." + +# --- Versioning Logic --- + +VERSION ?= $(shell cat VERSION 2>/dev/null || echo "0.1.0") + +sync-version: + @echo "πŸ”„ Syncing version $(VERSION) to all configuration files..." + + @# 1. Update Root CMakeLists.txt + @perl -i -pe 's/VERSION\s+"[0-9.]+"/VERSION "$(VERSION)"/gi' j2735codec/CMakeLists.txt + + @# 2. Update Node.js Root and Binding (Handles root package.json & bindings/node/package.json) + @# Using workspaces ensures both the root and the sub-package are updated + @npm version $(VERSION) --no-git-tag-version --allow-same-version + @cd $(BINDING_JS) && npm version $(VERSION) --no-git-tag-version --allow-same-version + + @# 3. Update Root Python (pyproject.toml) + @perl -i -pe 's/^version\s*=\s*"[0-9.]*"/version = "$(VERSION)"/m' pyproject.toml + + @# 4. Update Binding Python (bindings/python/pyproject.toml) + @perl -i -pe 's/^version\s*=\s*"[0-9.]*"/version = "$(VERSION)"/m' $(BINDING_PY)/pyproject.toml + + @echo "βœ… Version $(VERSION) synced across 4 manifests and CMake." \ No newline at end of file diff --git a/VERSION b/VERSION index 6c6aa7c..341cf11 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.0 \ No newline at end of file +0.2.0 \ No newline at end of file diff --git a/j2735codec/CMakeLists.txt b/j2735codec/CMakeLists.txt index 281de05..f024e0f 100644 --- a/j2735codec/CMakeLists.txt +++ b/j2735codec/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.20) # Make sure the version string is always quoted as below. -project(j2735codec VERSION "0.1.0" LANGUAGES C) +project(j2735codec VERSION "0.2.0" LANGUAGES C) # Check if we are in a "Dead End" build (No WASM and No Static Lib) if(NOT EMSCRIPTEN AND NOT BUILD_NATIVE_LIB) diff --git a/j2735codec/bindings/node/package.json b/j2735codec/bindings/node/package.json index 249bbd7..a88110b 100644 --- a/j2735codec/bindings/node/package.json +++ b/j2735codec/bindings/node/package.json @@ -1,6 +1,6 @@ { "name": "j2735codec", - "version": "0.1.0", + "version": "0.2.0", "description": "Node.js bindings for the J2735 WASM codec", "main": "./dist/index.js", "scripts": { diff --git a/j2735codec/bindings/python/pyproject.toml b/j2735codec/bindings/python/pyproject.toml index 101cee7..678b965 100644 --- a/j2735codec/bindings/python/pyproject.toml +++ b/j2735codec/bindings/python/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "j2735codec" -version = "0.1.0" +version = "0.2.0" description = "Add your description here" license = "Apache-2.0" readme = "README.md" diff --git a/package-lock.json b/package-lock.json index 2051b9d..25dfd99 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,19 @@ { "name": "etx-starter-kit", + "version": "0.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "etx-starter-kit", + "version": "0.2.0", "workspaces": [ "j2735codec/bindings/node" ] }, "j2735codec/bindings/node": { "name": "j2735codec", - "version": "0.1.0", + "version": "0.2.0", "license": "Apache-2.0", "devDependencies": { "@types/node": "^25.0.8", diff --git a/package.json b/package.json index 23d7de5..93d2f79 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "name": "etx-starter-kit", + "version": "0.2.0", "private": true, "description": "The official onboarding resource for Verizon ETX, providing starter samples and J2735 codec bindings", "workspaces": [ diff --git a/pyproject.toml b/pyproject.toml index 2aca449..2bb0348 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "etx-starter-kit" -version = "0.1.0" +version = "0.2.0" requires-python = ">=3.8.18" dependencies = [ "j2735codec", From 117ab7755156120b7d48de0c862f351325e158a7 Mon Sep 17 00:00:00 2001 From: Sean Hsu Date: Thu, 15 Jan 2026 20:19:34 -0500 Subject: [PATCH 09/21] ci: initial draft of github action for project --- .github/workflows/ci-release.yml | 179 +++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 .github/workflows/ci-release.yml diff --git a/.github/workflows/ci-release.yml b/.github/workflows/ci-release.yml new file mode 100644 index 0000000..bddc323 --- /dev/null +++ b/.github/workflows/ci-release.yml @@ -0,0 +1,179 @@ +name: Core CI & Release + +on: + push: + branches: + - main + tags: + - 'v*' + pull_request: + branches: + - main + +jobs: + # --- STAGE 0: Version Verification (Tags Only) --- + verify-version: + name: Verify Version Match + if: startsWith(github.ref, 'refs/tags/v') + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Compare Tag to VERSION file + run: | + TAG_VERSION=${GITHUB_REF_NAME#v} + FILE_VERSION=$(cat VERSION) + if [[ "$TAG_VERSION" != "$FILE_VERSION"* ]]; then + echo "::error::Version Mismatch! Tag '$TAG_VERSION' must start with '$FILE_VERSION'" + exit 1 + fi + + # --- STAGE 1: Build WASM Core --- + build-core: + name: Build WASM Core + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Cache Emscripten SDK + id: cache-emsdk + uses: actions/cache@v4 + with: + path: emsdk + key: ${{ runner.os }}-emsdk-4.0.10 + + - name: Install Emscripten (if not cached) + if: steps.cache-emsdk.outputs.cache-hit != 'true' + run: | + git clone https://github.com/emscripten-core/emsdk.git + cd emsdk && ./emsdk install 4.0.10 && ./emsdk activate 4.0.10 + + - name: Compile WASM + run: | + source emsdk/emsdk_env.sh + make wasm + + - name: Upload Python WASM Artifacts + uses: actions/upload-artifact@v4 + with: + name: python-wasm-binaries + path: j2735codec/bindings/python/src/j2735codec/generated/ + retention-days: 1 + + - name: Upload Node WASM Artifacts + uses: actions/upload-artifact@v4 + with: + name: node-wasm-binaries + path: j2735codec/bindings/node/src/generated/ + retention-days: 1 + + # --- STAGE 2: Test Bindings --- + test-bindings: + name: Test ${{ matrix.binding }} + needs: build-core + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + binding: [python, node] + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Download Artifacts + uses: actions/download-artifact@v4 + with: + name: ${{ matrix.binding }}-wasm-binaries + path: j2735codec/bindings/${{ matrix.binding }}/${{ matrix.binding == 'python' && 'src/j2735codec/generated/' || 'src/generated/' }} + + # Python Tests + - name: Setup uv + if: matrix.binding == 'python' + uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + + - name: Python Test Suite + if: matrix.binding == 'python' + run: | + cd j2735codec/bindings/python + uv sync + uv run pytest tests/ -s + env: + PYTHONPATH: src + + # Node.js Tests + - name: Setup Node.js + if: matrix.binding == 'node' + uses: actions/setup-node@v4 + with: + node-version-file: 'j2735codec/bindings/node/.nvmrc' + cache: 'npm' + cache-dependency-path: 'package-lock.json' + + - name: Node Test Suite + if: matrix.binding == 'node' + run: | + npm install + npm run build -w j2735codec + npm test -w j2735codec + + # --- STAGE 3: Unified Release (Tags Only) --- + publish-release: + name: Publish Release + needs: [verify-version, test-bindings] + if: startsWith(github.ref, 'refs/tags/v') + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Download Artifacts + uses: actions/download-artifact@v4 + with: + path: artifacts + + - name: Build Python Release + run: | + mkdir -p j2735codec/bindings/python/src/j2735codec/generated/ + cp -R artifacts/python-wasm-binaries/* j2735codec/bindings/python/src/j2735codec/generated/ + cp LICENSE NOTICE j2735codec/bindings/python/ + pip install uv + cd j2735codec/bindings/python && uv build + + - name: Build Node Release + run: | + mkdir -p j2735codec/bindings/node/src/generated/ + cp -R artifacts/node-wasm-binaries/* j2735codec/bindings/node/src/generated/ + cp LICENSE NOTICE j2735codec/bindings/node/ + # Build and Pack + npm install + npm run build -w j2735codec + cd j2735codec/bindings/node && npm pack + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + name: "Release ${{ github.ref_name }}" + body: | + ## J2735 Codec Release ${{ github.ref_name }} + + ### Included Artifacts + - Python Wheel and Source Dist + - Node.js Tarball + + --- + *Licensed under Apache-2.0. See LICENSE and NOTICE files in packages.* + prerelease: ${{ contains(github.ref_name, 'test') || contains(github.ref_name, 'alpha') || contains(github.ref_name, 'beta') }} + files: | + j2735codec/bindings/python/dist/*.whl + j2735codec/bindings/python/dist/*.tar.gz + j2735codec/bindings/node/*.tgz + LICENSE + NOTICE + generate_release_notes: true \ No newline at end of file From 6a628ef1f74e0e44eb368ae0880bb94ea6694141 Mon Sep 17 00:00:00 2001 From: Sean Hsu Date: Thu, 15 Jan 2026 21:46:30 -0500 Subject: [PATCH 10/21] ci: fix minor workflow bugs --- .github/workflows/ci-release.yml | 158 ++++++++++++------------------- j2735codec/bindings/node/.nvmrc | 1 + 2 files changed, 63 insertions(+), 96 deletions(-) create mode 100644 j2735codec/bindings/node/.nvmrc diff --git a/.github/workflows/ci-release.yml b/.github/workflows/ci-release.yml index bddc323..2ac1bb1 100644 --- a/.github/workflows/ci-release.yml +++ b/.github/workflows/ci-release.yml @@ -2,74 +2,57 @@ name: Core CI & Release on: push: - branches: - - main - tags: - - 'v*' + branches: [main] + tags: ['v*'] pull_request: - branches: - - main + branches: [main] jobs: - # --- STAGE 0: Version Verification (Tags Only) --- verify-version: name: Verify Version Match if: startsWith(github.ref, 'refs/tags/v') runs-on: ubuntu-latest steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Compare Tag to VERSION file - run: | + - uses: actions/checkout@v4 + - run: | TAG_VERSION=${GITHUB_REF_NAME#v} FILE_VERSION=$(cat VERSION) if [[ "$TAG_VERSION" != "$FILE_VERSION"* ]]; then - echo "::error::Version Mismatch! Tag '$TAG_VERSION' must start with '$FILE_VERSION'" + echo "::error::Version Mismatch! Tag '$TAG_VERSION' vs VERSION '$FILE_VERSION'" exit 1 fi - # --- STAGE 1: Build WASM Core --- build-core: name: Build WASM Core runs-on: ubuntu-latest steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Cache Emscripten SDK + - uses: actions/checkout@v4 + - name: Cache Emscripten id: cache-emsdk uses: actions/cache@v4 with: path: emsdk key: ${{ runner.os }}-emsdk-4.0.10 - - - name: Install Emscripten (if not cached) + - name: Install Emscripten if: steps.cache-emsdk.outputs.cache-hit != 'true' run: | git clone https://github.com/emscripten-core/emsdk.git cd emsdk && ./emsdk install 4.0.10 && ./emsdk activate 4.0.10 - - - name: Compile WASM + - name: Compile run: | source emsdk/emsdk_env.sh make wasm - - - name: Upload Python WASM Artifacts + - name: Upload Python Artifacts uses: actions/upload-artifact@v4 with: name: python-wasm-binaries path: j2735codec/bindings/python/src/j2735codec/generated/ - retention-days: 1 - - - name: Upload Node WASM Artifacts + - name: Upload Node Artifacts uses: actions/upload-artifact@v4 with: name: node-wasm-binaries path: j2735codec/bindings/node/src/generated/ - retention-days: 1 - # --- STAGE 2: Test Bindings --- test-bindings: name: Test ${{ matrix.binding }} needs: build-core @@ -78,50 +61,20 @@ jobs: fail-fast: false matrix: binding: [python, node] - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Download Artifacts - uses: actions/download-artifact@v4 + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 with: name: ${{ matrix.binding }}-wasm-binaries path: j2735codec/bindings/${{ matrix.binding }}/${{ matrix.binding == 'python' && 'src/j2735codec/generated/' || 'src/generated/' }} - - # Python Tests - - name: Setup uv - if: matrix.binding == 'python' - uses: astral-sh/setup-uv@v5 - with: - enable-cache: true - - - name: Python Test Suite - if: matrix.binding == 'python' + - name: Setup & Test run: | - cd j2735codec/bindings/python - uv sync - uv run pytest tests/ -s - env: - PYTHONPATH: src - - # Node.js Tests - - name: Setup Node.js - if: matrix.binding == 'node' - uses: actions/setup-node@v4 - with: - node-version-file: 'j2735codec/bindings/node/.nvmrc' - cache: 'npm' - cache-dependency-path: 'package-lock.json' - - - name: Node Test Suite - if: matrix.binding == 'node' - run: | - npm install - npm run build -w j2735codec - npm test -w j2735codec + if [ "${{ matrix.binding }}" == "python" ]; then + pip install uv && cd j2735codec/bindings/python && uv sync && uv run pytest + else + npm install && npm run build -w j2735codec && npm test -w j2735codec + fi - # --- STAGE 3: Unified Release (Tags Only) --- publish-release: name: Publish Release needs: [verify-version, test-bindings] @@ -130,31 +83,53 @@ jobs: permissions: contents: write steps: - - name: Checkout Code - uses: actions/checkout@v4 - + - uses: actions/checkout@v4 + - name: Download Artifacts uses: actions/download-artifact@v4 with: path: artifacts - - name: Build Python Release + - name: Build & Stage Assets run: | - mkdir -p j2735codec/bindings/python/src/j2735codec/generated/ - cp -R artifacts/python-wasm-binaries/* j2735codec/bindings/python/src/j2735codec/generated/ - cp LICENSE NOTICE j2735codec/bindings/python/ + # 1. Create a clean staging area at the ROOT + STAGING="$GITHUB_WORKSPACE/dist_release" + mkdir -p $STAGING + + # 2. Build Python + PY_DIR="$GITHUB_WORKSPACE/j2735codec/bindings/python" + mkdir -p $PY_DIR/src/j2735codec/generated/ + cp -R artifacts/python-wasm-binaries/* $PY_DIR/src/j2735codec/generated/ pip install uv - cd j2735codec/bindings/python && uv build - - - name: Build Node Release - run: | - mkdir -p j2735codec/bindings/node/src/generated/ - cp -R artifacts/node-wasm-binaries/* j2735codec/bindings/node/src/generated/ - cp LICENSE NOTICE j2735codec/bindings/node/ - # Build and Pack + cd $PY_DIR && uv build --out-dir ./dist_local + + # Use find to move and prefix files safely + find ./dist_local -type f -exec bash -c 'cp "$1" "'$STAGING'/python-$(basename "$1")"' _ {} \; + + # 3. Build Node + cd $GITHUB_WORKSPACE + JS_DIR="$GITHUB_WORKSPACE/j2735codec/bindings/node" + mkdir -p $JS_DIR/src/generated/ + cp -R artifacts/node-wasm-binaries/* $JS_DIR/src/generated/ npm install npm run build -w j2735codec - cd j2735codec/bindings/node && npm pack + cd $JS_DIR && npm pack + + # Move and prefix node tarball + find . -maxdepth 1 -name "*.tgz" -exec bash -c 'cp "$1" "'$STAGING'/node-$(basename "$1")"' _ {} \; + + # 4. Grab Raw WASM Binary + cp $GITHUB_WORKSPACE/artifacts/python-wasm-binaries/j2735codec.wasm $STAGING/j2735codec.wasm + + # 5. Legal + cp $GITHUB_WORKSPACE/LICENSE $STAGING/ + cp $GITHUB_WORKSPACE/NOTICE $STAGING/ + + - name: Verify Staging Contents + run: | + echo "Listing files to be uploaded:" + ls -lh dist_release/ + if [ $(ls dist_release/ | wc -l) -eq 0 ]; then echo "EMPTY STAGING FOLDER" && exit 1; fi - name: Create GitHub Release uses: softprops/action-gh-release@v2 @@ -162,18 +137,9 @@ jobs: name: "Release ${{ github.ref_name }}" body: | ## J2735 Codec Release ${{ github.ref_name }} - - ### Included Artifacts - - Python Wheel and Source Dist - - Node.js Tarball - - --- - *Licensed under Apache-2.0. See LICENSE and NOTICE files in packages.* + - **python-***: Python Wheel & Source Dist + - **node-***: Node.js Tarball + - **j2735codec.wasm**: Standalone WASM engine prerelease: ${{ contains(github.ref_name, 'test') || contains(github.ref_name, 'alpha') || contains(github.ref_name, 'beta') }} - files: | - j2735codec/bindings/python/dist/*.whl - j2735codec/bindings/python/dist/*.tar.gz - j2735codec/bindings/node/*.tgz - LICENSE - NOTICE + files: dist_release/* generate_release_notes: true \ No newline at end of file diff --git a/j2735codec/bindings/node/.nvmrc b/j2735codec/bindings/node/.nvmrc new file mode 100644 index 0000000..aebd91c --- /dev/null +++ b/j2735codec/bindings/node/.nvmrc @@ -0,0 +1 @@ +v22.16.0 From 06167e9956a149c21e4c2b414727a29c33cdc404 Mon Sep 17 00:00:00 2001 From: Sean Hsu Date: Thu, 15 Jan 2026 23:35:52 -0500 Subject: [PATCH 11/21] docs: add README to lanaugage bindings and root --- README.md | 191 +++++++++++++++++++++++++++ j2735codec/bindings/node/README.md | 129 ++++++++++-------- j2735codec/bindings/python/README.md | 108 +++++++++++++++ 3 files changed, 374 insertions(+), 54 deletions(-) diff --git a/README.md b/README.md index 4c922ee..23ea683 100644 --- a/README.md +++ b/README.md @@ -1 +1,192 @@ # ETX Starter Kit + +[![License](https://img.shields.io/badge/License-Apache_2.0-green.svg)](https://opensource.org/licenses/Apache-2.0) + +The official onboarding resource for Verizon ETX. This kit is designed to accelerate development by providing reference implementations and a high-performance V2X codec. + +## πŸš€ Key Features +* **Get Started Quicker:** Sample code and onboarding guides to help you build on ETX immediately. +* **Latest J2735 Standard:** Built from the [SAE J2735_202409 ASN.1 definitions](https://www.sae.org/standards/j2735asn_202409-v2x-communications-message-set-dictionary-asn-file). +* **Dual Encoding:** Full support for **UPER** (Unaligned Packed Encoding Rules) and **JER** (JSON Encoding Rules). +* **WASM Core:** The C++ codec source is compiled into a `.wasm` binary for universal compatibility across Python and Node.js. + +The project is composed of two components: + +- ETX sample code to help developers get started. +- WASM binary bindings for the J2735 codec to help accelerate your development on Python and Node. + +## πŸ“‚ Project Structure + +```text +. +β”œβ”€β”€ j2735codec/ +β”‚ β”œβ”€β”€ core/ # Generated C++ source files from ASN.1 +β”‚ β”œβ”€β”€ bindings/ +β”‚ β”‚ β”œβ”€β”€ python/ # Python package (uv managed) +β”‚ β”‚ └── node/ # Node.js package (npm workspace) +β”‚ └── dist/ # Build artifacts (native & wasm) +β”œβ”€β”€ samples/ # ETX code samples +β”œβ”€β”€ VERSION # Single source of truth for project versioning +β”œβ”€β”€ Makefile # The central command hub +└── LICENSE # Apache-2.0 +``` + +--- + +## ETX Sample Code + +(Content for ETX samples goes here.) + +--- + +## J2735 Codec + +A cross-platform implementation of the **SAE J2735 (202409)** V2X standard. This project compiles a C++ code generated from [ASN.1 compiler](https://github.com/vlm/asn1c) into WebAssembly (WASM) to provide a safe, fast, and portable codec for Python, Node, and other modern runtimes. + +### πŸ”Œ Supported Bindings + +Currently, the following language bindings are officially supported and maintained: + +| Language | Status | Runtime Dependency | Documentation | +| :--- | :--- | :--- | :--- | +| **Python** | βœ… Active | `wasmtime` | [View Python README](./j2735codec/bindings/python/README.md) | +| **Node.js** | βœ… Active | None (Native Support) | [View Node README](./j2735codec/bindings/node/README.md) | + +For specific installation steps and examples for Python or Node, please view the language's README. + +--- + +### Installation From GitHub Releases (Recommended) + +Install the Python or Node bindings using the link directly from the project release page: + +#### Python + +**Via UV**: +```bash +uv add "https://github.com/verizon/j2735codec/releases/download/v1.0.0/j2735_codec-1.0.0-py3-none-any.whl" +``` + +**Via Pip**: +```bash +pip install "https://github.com/verizon/j2735codec/releases/download/v1.0.0/j2735_codec-1.0.0-py3-none-any.whl" +``` + +#### Node + +**Via NPM** + +```bash +npm install "https://github.com/verizon/j2735codec/releases/download/v1.0.0/j2735codec-1.0.0.tgz" +``` + +**Note**: The links above are not valid, just an example. Please see release page in this repo for proper links to to use. + +--- + +### πŸ—οΈ Installation From Source + +#### πŸ›  Prerequisites + +##### Runtime & Package Managers + +**Node.js**: `v22.16.0` (LTS) or higher. + +- NPM is needed for the builds to work. + +**Python**: `v3.8.18` or higher. + +- [UV](https://docs.astral.sh/uv/) or Pip should be installed for builds to work. + +**Note**: Python or Node.js should be installed on your host as well. + +##### Emscripten SDK (emsdk) +Required to compile the C++ source into WebAssembly. + +* **Tested Version:** 4.0.10 +* **Note:** It is recommended to use the version listed above to ensure consistent WASM memory exports. + +```bash +# Clone and install the Emscripten toolchain +git clone [https://github.com/emscripten-core/emsdk.git](https://github.com/emscripten-core/emsdk.git) +cd emsdk +./emsdk install 4.0.10 +./emsdk activate 4.0.10 + +# Activate environment variables (must be run in every new terminal session) +source ./emsdk_env.sh +``` + +##### CMake (3.23+) +Used to manage the C++ build process. +- macOS: `brew install cmake` +- Linux: `sudo apt install cmake` +- Windows: Download from [cmake.org](https://cmake.org) + +#### Installation + +Clone this repository. Issue the following commands to perform a full installation: + +***Setup β†’ Build β†’ Test Code β†’ Pack Artifacts β†’ Verify Package Installation*** + +**Python** +```bash +make install-py +``` + +**Node.js** +```bash +make install-js +``` + +--- + +### πŸ›  Advanced Building & Management + +The central `Makefile` orchestrates the multi-stage build process. + +#### Environment Setup +Sync all dependencies (Python packages and Node modules): +```bash +make setup +``` + +#### WebAssembly Compilation +Compile codec C/C++ source into WebAssembly binary: +```bash +make wasm +``` +**Note:** Ensure you have sourced your `emsdk_env.sh` before running this command. + +#### Build Native C Library +Compile codec C/C++ source into a static C library (**sample code is not provided for native C libraries**): +```bash +make native +``` + +--- + +### Version Management +To propagate a version change from the root `VERSION` file to all sub-manifests: +```bash +# 1. Update the VERSION file at the project root. +# 2. Sync all workspaces: +make sync-version +``` + +--- + +### 🧹 Cleaning Up + +**Standard Clean:** Removes language-specific build artifacts (`dist` folders). +```bash +make clean-py # or clean-js +``` + +**Hard Reset (Purge):** Deletes all build directories, virtual environments, modules, packages, and generated binary files. Use this for a completely fresh start. +```bash +make purge +``` + +## βš–οΈ License +Licensed under the Apache License 2.0. See [LICENSE](LICENSE) and [NOTICE](NOTICE) for details. \ No newline at end of file diff --git a/j2735codec/bindings/node/README.md b/j2735codec/bindings/node/README.md index 6b7c5a7..bd66e78 100644 --- a/j2735codec/bindings/node/README.md +++ b/j2735codec/bindings/node/README.md @@ -1,63 +1,42 @@ # J2735 Codec - Node.js Bindings -This package provides Node.js bindings for the **SAE J2735 (202409)** V2X codec, powered by WebAssembly. It enables seamless conversion between JSON (JER) and Packed Encoding Rules (UPER) in JavaScript and TypeScript environments. +This package provides high-performance Node.js bindings for the **SAE J2735 (202409)** V2X codec. By leveraging WebAssembly (WASM), it enables seamless, type-safe conversion between **JSON (JER)** and **Packed Encoding Rules (UPER)** directly in JavaScript and TypeScript environments. -## πŸ“₯ End User Installation +## πŸ“₯ Installation ### Runtime Requirements +* **Node.js**: `v22.16.0` (LTS) or higher. +* **Environment**: Supports both CommonJS and ES Modules. -- **Node.js**: v22.16.0 or higher (Current LTS recommended). -- **Native Support**: No C++ toolchains (node-gyp), Python, or external libraries are required. The WebAssembly engine runs natively on the V8 runtime. - -### From GitHub Releases - -Install the package directly using the tarball link from the project release page: +### Installation via GitHub Release +The fastest way to install the bindings is to use the pre-built packages from the [Releases](https://github.com/verizon/j2735codec/releases) page. ```bash +# Example: Replace v1.0.0 with the latest version tag npm install https://github.com/verizon/j2735codec/releases/download/v1.0.0/j2735codec-1.0.0.tgz ``` -**Note**: The link above is not valid, just an example. Please see release page in this repo for proper links to to use. - -## πŸ›  Local Build & Installation - -### 1. Build the WASM Engine - -The Node.js bindings require the compiled WebAssembly binary. Build the artifacts from the project root: - -```Bash -# From the project root -make wasm -``` - -This places the j2735.wasm and associated metadata into src/wasm/. - -### 2. Build the Package - -We use TypeScript to generate a flat distribution for high-performance path resolution. - -```bash -# From bindings/node -npm install -npm run build -``` - -This generates a dist/ folder containing the compiled JavaScript, type definitions (.d.ts), and the bundled WASM assets. +--- -## πŸš€ Usage +## πŸš€ Quick Start -The Node.js interface is asynchronous during initialization to allow for non-blocking WASM compilation. +The codec initialization is asynchronous to allow for non-blocking WebAssembly compilation. -```Typescript +```typescript import { createV2XCodec, EncodingRules, PDUTypes } from 'j2735codec'; -async function run() { - // Initialize the codec (loads and compiles WASM binary) +async function main() { + // 1. Initialize the codec (loads and compiles WASM) const codec = await createV2XCodec(); - const jsonContent = '{ "messageFrame": { ... } }'; + const jsonContent = JSON.stringify({ + messageFrame: { + messageId: 20, + value: { /* ... J2735 payload ... */ } + } + }); - // 1. Transcode: JSON (JER) -> Packed (UPER) + // 2. Transcode: JSON (JER) -> Packed (UPER) const uperBytes = codec.transcode( EncodingRules.JER, EncodingRules.UNALIGNED_BASIC_PER, @@ -67,37 +46,79 @@ async function run() { console.log('Encoded UPER (Hex):', Buffer.from(uperBytes).toString('hex').toUpperCase()); - // 2. Transcode: Packed (UPER) -> JSON (JER) - const decodedJson = codec.transcode( + // 3. Transcode: Packed (UPER) -> JSON (JER) + const decodedJsonRaw = codec.transcode( EncodingRules.UNALIGNED_BASIC_PER, EncodingRules.JER, PDUTypes.MessageFrame, uperBytes ); - // Convert Uint8Array result to string - console.log('Decoded JSON:', new TextDecoder().decode(decodedJson)); + const decodedJson = new TextDecoder().decode(decodedJsonRaw); + console.log('Decoded JSON:', JSON.parse(decodedJson)); } -run().catch(console.error); +main().catch(console.error); ``` -## πŸ›  Development Notes +--- -### Distribution +## πŸ›  Local Development & Build Artifacts -This package uses a flattened dist/ structure. The TypeScript source in src/ is compiled directly into the root of dist/ (e.g., src/codec.ts becomes dist/codec.js). This ensures that the internal path resolution to the wasm/ directory remains identical in both development and production. +The recommended way of installing and building is through the root [Makefile](/Makefile). If you wish to work on the bindings directly though, here are some tips to help. -### Testing +### 1. Build the WASM Core +Ensure you have the [Prerequisites](/README.md) installed: -We use Vitest for unit and integration testing. +- Emscripten +- CMake +- UV or Pip +```bash +# From the project root +make wasm +``` +This command compiles the C++ core and populates `src/generated/` with the required `.wasm` binary and metadata. + +### 2. Build the Package and Tarball +The build process generates a flattened distribution and packages it into a compressed tarball. + +```bash +cd bindings/node +npm install +npm run build +``` + +### 3. The Output Tarball (.tgz) +When you run `make build-js` (or `npm pack` within the node binding folder), the build system generates a distribution tarball at the **project root**: + +* **File:** `node-j2735codec-.tgz` +* **Purpose:** This file contains the compiled JavaScript, type definitions, and the bundled WASM assets. +* **Local Testing:** You can test the package locally in another project by running: + ```bash + npm install /path/to/node-j2735codec-1.0.0.tgz + ``` + +### 4. Running Tests +We use **Vitest** for low-latency testing of the bindings. ```bash npm test ``` -## πŸ”’ Unified Versioning -The version in package.json must match the root CMakeLists.txt version. Please refer to the root CONTRIBUTING.md before bumping versions. +--- + +## πŸ“‚ Internal Structure + +This package uses a flattened `dist/` structure to simplify asset resolution: +* **`dist/`**: Contains compiled JS, `.d.ts` files, and the bundled `wasm/` assets. +* **Asset Resolution**: Internal path resolution is identical in development and production, ensuring the WASM binary is always locatable by the runtime. + +--- + +## πŸ”’ Versioning Policy +This package follows **Unified Versioning**. The `package.json` version must stay in sync with the root `VERSION` file and `CMakeLists.txt`. + +> **Warning**: Do not bump versions manually in `package.json`. Use `make sync-version` from the root. ## βš–οΈ License -Licensed under the Apache License 2.0. \ No newline at end of file +Licensed under the Apache License 2.0. See the [LICENSE](/LICENSE) file for details. \ No newline at end of file diff --git a/j2735codec/bindings/python/README.md b/j2735codec/bindings/python/README.md index e69de29..4ddd68e 100644 --- a/j2735codec/bindings/python/README.md +++ b/j2735codec/bindings/python/README.md @@ -0,0 +1,108 @@ +# J2735 Codec - Python Bindings + +This package provides high-performance Python bindings for the **SAE J2735 (202409)** V2X codec. Powered by WebAssembly (WASM), it allows for seamless, safe, and portable conversion between **JSON (JER)** and **Packed Encoding Rules (UPER)** within Python applications. + +## πŸ“₯ Installation + +### Runtime Requirements +- **Python**: `v3.8.18` or higher. +- **WASM Runtime**: [wasmtime](https://github.com/bytecodealliance/wasmtime) (installed automatically as a dependency). + +### Installation via GitHub Release +The fastest way to install the bindings is to use the pre-built Wheel (`.whl`) from the [Releases](https://github.com/verizon/j2735codec/releases) page. + +**Using [uv](https://docs.astral.sh/uv/) (Recommended):** +```bash +uv pip install "https://github.com/verizon/j2735codec/releases/download/v1.0.0/python-j2735codec-1.0.0-py3-none-any.whl +``` + +**Using pip:** +```bash +pip install "https://github.com/verizon/j2735codec/releases/download/v1.0.0/python-j2735codec-1.0.0-py3-none-any.whl" +``` + +--- + +## πŸš€ Quick Start + +The Python interface is designed to be simple and idiomatic. + +```python +from j2735codec import J2735Codec, EncodingRules, PDUTypes + +# Initialize the codec +codec = J2735Codec() + +# Example JSON Message Frame +json_content = '{"messageFrame": {"messageId": 20, "value": { ... }}}' + +# 1. Transcode: JSON (JER) -> Packed (UPER) +uper_bytes = codec.transcode( + input_encoding=EncodingRules.JER, + output_encoding=EncodingRules.UNALIGNED_BASIC_PER, + pdu=PDUTypes.MESSAGE_FRAME, + buffer=json_content +) +print(f"Encoded UPER (Hex): {uper_bytes.hex().upper()}") + +# 2. Transcode: Packed (UPER) -> JSON (JER) +decoded_json_raw = codec.transcode( + input_encoding=EncodingRules.UNALIGNED_BASIC_PER, + output_encoding=EncodingRules.JER, + pdu=PDUTypes.MESSAGE_FRAME, + buffer=uper_bytes +) +print(f"Decoded JSON: {decoded_json_raw.decode('utf-8')}") +``` + +--- + +## πŸ›  Local Development & Build Artifacts + +The recommended way of installing and building is through the root [Makefile](/Makefile). If you wish to work on the bindings directly though, here are some tips to help. + +### 1. Build the WASM Engine +The Python bindings require a compiled WebAssembly binary. If you modify the C++ core, refresh the artifacts from the project root: + +```bash +# From the project root +make wasm +``` +This places `j2735.wasm` and metadata into `src/j2735codec/generated/`. + +### 2. Install for Local Development +We use `uv` for fast, reproducible environment management. + +```bash +cd j2735codec/bindings/python +uv sync +``` + +### 3. Build the Python Wheel +To package the bindings for distribution, use the `uv build` command: + +* **File:** `python-j2735codec--py3-none-any.whl` +* **Purpose:** This "Universal Wheel" contains the Python source and the bundled WASM binary. + +### 4. Local Installation + +```bash +pip install ./python-j2735codec-1.0.0-py3-none-any.whl +``` + +--- + +## πŸ§ͺ Testing +Run the test suite using `pytest`: + +```bash +uv run pytest +``` + +## πŸ”’ Versioning Policy +This package follows **Unified Versioning**. The version in `pyproject.toml` must match the root `VERSION` file and `CMakeLists.txt`. + +> **Warning**: Do not bump versions manually. Use `make sync-version` from the root directory. + +## βš–οΈ License +Licensed under the Apache License 2.0. See [LICENSE](/LICENSE) for details. \ No newline at end of file From d07450a1a6afe23424054c53a4461da19ed8e012 Mon Sep 17 00:00:00 2001 From: Sean Hsu Date: Fri, 16 Jan 2026 18:09:22 -0500 Subject: [PATCH 12/21] feat: add protobuf encoding and decoding support for py bindings - Bump the require python version to 3.9 to make protobuf version play nice. - Added additional pytest for python bindings including memory checks. --- .github/workflows/ci-release.yml | 4 +- .python-version | 2 +- Makefile | 56 ++- README.md | 2 +- .../node/src/protobuf/georoutedmsg.ts | 264 +++++++++++++++ .../src/protobuf/google/protobuf/timestamp.ts | 230 +++++++++++++ j2735codec/bindings/python/README.md | 2 +- j2735codec/bindings/python/pyproject.toml | 7 +- .../python/src/j2735codec/__init__.py | 4 +- .../bindings/python/src/j2735codec/codec.py | 110 +++++- .../src/j2735codec/protobuf/__init__.py | 0 .../j2735codec/protobuf/georoutedmsg_pb2.py | 39 +++ .../j2735codec/protobuf/georoutedmsg_pb2.pyi | 27 ++ .../bindings/python/tests/test_codec.py | 99 ++++-- pyproject.toml | 11 +- uv.lock | 318 ++++++++++++++++++ 16 files changed, 1093 insertions(+), 82 deletions(-) create mode 100644 j2735codec/bindings/node/src/protobuf/georoutedmsg.ts create mode 100644 j2735codec/bindings/node/src/protobuf/google/protobuf/timestamp.ts create mode 100644 j2735codec/bindings/python/src/j2735codec/protobuf/__init__.py create mode 100644 j2735codec/bindings/python/src/j2735codec/protobuf/georoutedmsg_pb2.py create mode 100644 j2735codec/bindings/python/src/j2735codec/protobuf/georoutedmsg_pb2.pyi create mode 100644 uv.lock diff --git a/.github/workflows/ci-release.yml b/.github/workflows/ci-release.yml index 2ac1bb1..ad763dd 100644 --- a/.github/workflows/ci-release.yml +++ b/.github/workflows/ci-release.yml @@ -46,7 +46,9 @@ jobs: uses: actions/upload-artifact@v4 with: name: python-wasm-binaries - path: j2735codec/bindings/python/src/j2735codec/generated/ + path: | + j2735codec/bindings/python/src/j2735codec/generated/ + j2735codec/bindings/python/src/j2735codec/protobuf/ - name: Upload Node Artifacts uses: actions/upload-artifact@v4 with: diff --git a/.python-version b/.python-version index 9ad6380..bd28b9c 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.8.18 +3.9 diff --git a/Makefile b/Makefile index 886b411..5a390db 100644 --- a/Makefile +++ b/Makefile @@ -26,16 +26,16 @@ else IS_VENV := $(shell $(PYTHON) -c 'import sys; print("true" if sys.prefix != sys.base_prefix else "false")') endif -NPM := $(shell which npm) +NPM := $(shell which npm) CMAKE := $(shell which cmake) -UV := $(shell which uv) +UV := $(shell which uv) # --- Variables --- PROJECT_ROOT := $(shell pwd) BUILD_DIR_NATIVE = j2735codec/build_native BUILD_DIR_WASM = j2735codec/build_wasm -DIST_DIR = j2735codec/dist +DIST_DIR = j2735codec/dist BINDING_PY = j2735codec/bindings/python PY_DIST_DIR = $(BINDING_PY)/dist @@ -45,21 +45,22 @@ JS_DIST_DIR = $(BINDING_JS)/dist J2735_REV ?= j2735_202409 THREADS ?= $(shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4) +VERSION ?= $(shell cat VERSION 2>/dev/null || echo "0.1.0") # --- Targets --- .PHONY: all setup native wasm purge help \ setup-py build-py install-py test-py clean-py uninstall-py \ - setup-js build-js install-js test-js clean-js + setup-js build-js install-js test-js clean-js sync-version help: @echo "$(BOLD)ETX Starter Kit Management:$(RESET)" - @echo " $(BOLD)make setup$(RESET) - Sync all dependencies (Python & Node)" + @echo " $(BOLD)make setup$(RESET) - Sync all dependencies (Frozen/Locked)" @echo " $(BOLD)make install-py$(RESET) - Full Python lifecycle (Build -> Test Wheel)" @echo " $(BOLD)make install-js$(RESET) - Full Node.js lifecycle (Build -> Test Tarball)" @echo " $(BOLD)make native$(RESET) - Build native C library" @echo " $(BOLD)make wasm$(RESET) - Build WASM & Generate Enums" - @echo " $(BOLD)make purge$(RESET) - Hard reset of all build artifacts" + @echo " $(BOLD)make purge$(RESET) - Hard reset of all artifacts and lockfiles" all: sync-version setup native wasm build-py build-js @@ -78,11 +79,11 @@ endif # --- Python Workflow --- setup-py: check-env - @echo "πŸ› οΈ Syncing Python dependencies..." + @echo "πŸ› οΈ Syncing Python dependencies (Frozen)..." ifdef UV - $(UV) sync --all-packages --quiet + $(UV) sync --all-packages --frozen --quiet else - $(PYTHON) -m pip install --upgrade pip build pytest + $(PYTHON) -m pip install --upgrade pip build pytest psutil $(PYTHON) -m pip install -e $(BINDING_PY) endif @@ -130,8 +131,8 @@ clean-py: # --- Node Workflow --- setup-js: check-env - @echo "πŸ“¦ Syncing Node.js workspaces..." - @$(NPM) install + @echo "πŸ“¦ Syncing Node.js workspaces (Frozen/ci)..." + @$(NPM) ci build-js: wasm setup-js @echo "πŸ”¨ Building Node Bindings..." @@ -159,7 +160,6 @@ install-js: clean-js build-js cd $$TEMP_DIR && $(NPM) init -y > /dev/null; \ $(NPM) install $$FULL_TARBALL_PATH > /dev/null; \ cp -r $(PROJECT_ROOT)/$(BINDING_JS)/tests ./tests; \ - # Check if samples exist before copying to avoid the 'cp' error you saw if [ -d "$(PROJECT_ROOT)/$(BINDING_JS)/samples" ]; then cp -r $(PROJECT_ROOT)/$(BINDING_JS)/samples ./samples; fi; \ echo "$(BOLD)πŸš€ Verifying tarball in isolation...$(RESET)"; \ $(NPM) exec vitest run || exit 1; \ @@ -176,35 +176,25 @@ wasm: $(CMAKE) --build $(BUILD_DIR_WASM) -j $(THREADS) purge: uninstall-py clean-py clean-js - @echo "πŸ”₯ Hard purging all artifacts..." - rm -rf $(BUILD_DIR_NATIVE) $(BUILD_DIR_WASM) .venv uv.lock node_modules package-lock.json + @echo "πŸ”₯ Hard purging all artifacts and lockfiles..." + rm -rf $(BUILD_DIR_NATIVE) $(BUILD_DIR_WASM) .venv node_modules + rm -f uv.lock package-lock.json find . -type d -name "build" -not -path "*/emsdk/*" -exec rm -rf {} + rm -rf $(BINDING_PY)/src/j2735codec/generated rm -rf $(BINDING_JS)/src/generated - rm -rf $(BINDING_JS)/node_modules rm -rf $(DIST_DIR) - rm -rf - @echo "✨ Purged." + @echo "✨ Purged. Use 'make setup' to recreate environment." # --- Versioning Logic --- -VERSION ?= $(shell cat VERSION 2>/dev/null || echo "0.1.0") - sync-version: - @echo "πŸ”„ Syncing version $(VERSION) to all configuration files..." - - @# 1. Update Root CMakeLists.txt + @echo "πŸ”„ Syncing version $(VERSION) to manifests..." + @# Update Root CMake @perl -i -pe 's/VERSION\s+"[0-9.]+"/VERSION "$(VERSION)"/gi' j2735codec/CMakeLists.txt - - @# 2. Update Node.js Root and Binding (Handles root package.json & bindings/node/package.json) - @# Using workspaces ensures both the root and the sub-package are updated - @npm version $(VERSION) --no-git-tag-version --allow-same-version - @cd $(BINDING_JS) && npm version $(VERSION) --no-git-tag-version --allow-same-version - - @# 3. Update Root Python (pyproject.toml) + @# Update Node manifests + @npm version $(VERSION) --no-git-tag-version --allow-same-version || true + @cd $(BINDING_JS) && npm version $(VERSION) --no-git-tag-version --allow-same-version || true + @# Update Python manifests @perl -i -pe 's/^version\s*=\s*"[0-9.]*"/version = "$(VERSION)"/m' pyproject.toml - - @# 4. Update Binding Python (bindings/python/pyproject.toml) @perl -i -pe 's/^version\s*=\s*"[0-9.]*"/version = "$(VERSION)"/m' $(BINDING_PY)/pyproject.toml - - @echo "βœ… Version $(VERSION) synced across 4 manifests and CMake." \ No newline at end of file + @echo "βœ… Version $(VERSION) synced." \ No newline at end of file diff --git a/README.md b/README.md index 23ea683..c05dcc7 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,7 @@ npm install "https://github.com/verizon/j2735codec/releases/download/v1.0.0/j273 - NPM is needed for the builds to work. -**Python**: `v3.8.18` or higher. +**Python**: `v3.9` or higher. - [UV](https://docs.astral.sh/uv/) or Pip should be installed for builds to work. diff --git a/j2735codec/bindings/node/src/protobuf/georoutedmsg.ts b/j2735codec/bindings/node/src/protobuf/georoutedmsg.ts new file mode 100644 index 0000000..46fa5dc --- /dev/null +++ b/j2735codec/bindings/node/src/protobuf/georoutedmsg.ts @@ -0,0 +1,264 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.11.0 +// protoc v6.33.4 +// source: georoutedmsg.proto + +/* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; +import { Timestamp } from "./google/protobuf/timestamp"; + +export const protobufPackage = "georoutedmsg"; + +export interface Position { + latitude: number; + longitude: number; +} + +export interface GeoRoutedMsg { + msgBytes: Uint8Array; + time: Date | undefined; + position?: Position | undefined; +} + +function createBasePosition(): Position { + return { latitude: 0, longitude: 0 }; +} + +export const Position: MessageFns = { + encode(message: Position, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.latitude !== 0) { + writer.uint32(9).double(message.latitude); + } + if (message.longitude !== 0) { + writer.uint32(17).double(message.longitude); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): Position { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePosition(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 9) { + break; + } + + message.latitude = reader.double(); + continue; + } + case 2: { + if (tag !== 17) { + break; + } + + message.longitude = reader.double(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): Position { + return { + latitude: isSet(object.latitude) ? globalThis.Number(object.latitude) : 0, + longitude: isSet(object.longitude) ? globalThis.Number(object.longitude) : 0, + }; + }, + + toJSON(message: Position): unknown { + const obj: any = {}; + if (message.latitude !== 0) { + obj.latitude = message.latitude; + } + if (message.longitude !== 0) { + obj.longitude = message.longitude; + } + return obj; + }, + + create, I>>(base?: I): Position { + return Position.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Position { + const message = createBasePosition(); + message.latitude = object.latitude ?? 0; + message.longitude = object.longitude ?? 0; + return message; + }, +}; + +function createBaseGeoRoutedMsg(): GeoRoutedMsg { + return { msgBytes: new Uint8Array(0), time: undefined, position: undefined }; +} + +export const GeoRoutedMsg: MessageFns = { + encode(message: GeoRoutedMsg, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.msgBytes.length !== 0) { + writer.uint32(10).bytes(message.msgBytes); + } + if (message.time !== undefined) { + Timestamp.encode(toTimestamp(message.time), writer.uint32(18).fork()).join(); + } + if (message.position !== undefined) { + Position.encode(message.position, writer.uint32(26).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): GeoRoutedMsg { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGeoRoutedMsg(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.msgBytes = reader.bytes(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.time = fromTimestamp(Timestamp.decode(reader, reader.uint32())); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.position = Position.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): GeoRoutedMsg { + return { + msgBytes: isSet(object.msgBytes) ? bytesFromBase64(object.msgBytes) : new Uint8Array(0), + time: isSet(object.time) ? fromJsonTimestamp(object.time) : undefined, + position: isSet(object.position) ? Position.fromJSON(object.position) : undefined, + }; + }, + + toJSON(message: GeoRoutedMsg): unknown { + const obj: any = {}; + if (message.msgBytes.length !== 0) { + obj.msgBytes = base64FromBytes(message.msgBytes); + } + if (message.time !== undefined) { + obj.time = message.time.toISOString(); + } + if (message.position !== undefined) { + obj.position = Position.toJSON(message.position); + } + return obj; + }, + + create, I>>(base?: I): GeoRoutedMsg { + return GeoRoutedMsg.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): GeoRoutedMsg { + const message = createBaseGeoRoutedMsg(); + message.msgBytes = object.msgBytes ?? new Uint8Array(0); + message.time = object.time ?? undefined; + message.position = (object.position !== undefined && object.position !== null) + ? Position.fromPartial(object.position) + : undefined; + return message; + }, +}; + +function bytesFromBase64(b64: string): Uint8Array { + if ((globalThis as any).Buffer) { + return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); + } else { + const bin = globalThis.atob(b64); + const arr = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; ++i) { + arr[i] = bin.charCodeAt(i); + } + return arr; + } +} + +function base64FromBytes(arr: Uint8Array): string { + if ((globalThis as any).Buffer) { + return globalThis.Buffer.from(arr).toString("base64"); + } else { + const bin: string[] = []; + arr.forEach((byte) => { + bin.push(globalThis.String.fromCharCode(byte)); + }); + return globalThis.btoa(bin.join("")); + } +} + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function toTimestamp(date: Date): Timestamp { + const seconds = Math.trunc(date.getTime() / 1_000); + const nanos = (date.getTime() % 1_000) * 1_000_000; + return { seconds, nanos }; +} + +function fromTimestamp(t: Timestamp): Date { + let millis = (t.seconds || 0) * 1_000; + millis += (t.nanos || 0) / 1_000_000; + return new globalThis.Date(millis); +} + +function fromJsonTimestamp(o: any): Date { + if (o instanceof globalThis.Date) { + return o; + } else if (typeof o === "string") { + return new globalThis.Date(o); + } else { + return fromTimestamp(Timestamp.fromJSON(o)); + } +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create, I>>(base?: I): T; + fromPartial, I>>(object: I): T; +} diff --git a/j2735codec/bindings/node/src/protobuf/google/protobuf/timestamp.ts b/j2735codec/bindings/node/src/protobuf/google/protobuf/timestamp.ts new file mode 100644 index 0000000..1d12bf2 --- /dev/null +++ b/j2735codec/bindings/node/src/protobuf/google/protobuf/timestamp.ts @@ -0,0 +1,230 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.11.0 +// protoc v6.33.4 +// source: google/protobuf/timestamp.proto + +/* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; + +export const protobufPackage = "google.protobuf"; + +/** + * A Timestamp represents a point in time independent of any time zone or local + * calendar, encoded as a count of seconds and fractions of seconds at + * nanosecond resolution. The count is relative to an epoch at UTC midnight on + * January 1, 1970, in the proleptic Gregorian calendar which extends the + * Gregorian calendar backwards to year one. + * + * All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap + * second table is needed for interpretation, using a [24-hour linear + * smear](https://developers.google.com/time/smear). + * + * The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By + * restricting to that range, we ensure that we can convert to and from [RFC + * 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings. + * + * # Examples + * + * Example 1: Compute Timestamp from POSIX `time()`. + * + * Timestamp timestamp; + * timestamp.set_seconds(time(NULL)); + * timestamp.set_nanos(0); + * + * Example 2: Compute Timestamp from POSIX `gettimeofday()`. + * + * struct timeval tv; + * gettimeofday(&tv, NULL); + * + * Timestamp timestamp; + * timestamp.set_seconds(tv.tv_sec); + * timestamp.set_nanos(tv.tv_usec * 1000); + * + * Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. + * + * FILETIME ft; + * GetSystemTimeAsFileTime(&ft); + * UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; + * + * // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z + * // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. + * Timestamp timestamp; + * timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); + * timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); + * + * Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. + * + * long millis = System.currentTimeMillis(); + * + * Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) + * .setNanos((int) ((millis % 1000) * 1000000)).build(); + * + * Example 5: Compute Timestamp from Java `Instant.now()`. + * + * Instant now = Instant.now(); + * + * Timestamp timestamp = + * Timestamp.newBuilder().setSeconds(now.getEpochSecond()) + * .setNanos(now.getNano()).build(); + * + * Example 6: Compute Timestamp from current time in Python. + * + * timestamp = Timestamp() + * timestamp.GetCurrentTime() + * + * # JSON Mapping + * + * In JSON format, the Timestamp type is encoded as a string in the + * [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the + * format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" + * where {year} is always expressed using four digits while {month}, {day}, + * {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional + * seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), + * are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone + * is required. A proto3 JSON serializer should always use UTC (as indicated by + * "Z") when printing the Timestamp type and a proto3 JSON parser should be + * able to accept both UTC and other timezones (as indicated by an offset). + * + * For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past + * 01:30 UTC on January 15, 2017. + * + * In JavaScript, one can convert a Date object to this format using the + * standard + * [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) + * method. In Python, a standard `datetime.datetime` object can be converted + * to this format using + * [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with + * the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use + * the Joda Time's [`ISODateTimeFormat.dateTime()`]( + * http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime() + * ) to obtain a formatter capable of generating timestamps in this format. + */ +export interface Timestamp { + /** + * Represents seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z. Must + * be between -315576000000 and 315576000000 inclusive (which corresponds to + * 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z). + */ + seconds: number; + /** + * Non-negative fractions of a second at nanosecond resolution. This field is + * the nanosecond portion of the duration, not an alternative to seconds. + * Negative second values with fractions must still have non-negative nanos + * values that count forward in time. Must be between 0 and 999,999,999 + * inclusive. + */ + nanos: number; +} + +function createBaseTimestamp(): Timestamp { + return { seconds: 0, nanos: 0 }; +} + +export const Timestamp: MessageFns = { + encode(message: Timestamp, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.seconds !== 0) { + writer.uint32(8).int64(message.seconds); + } + if (message.nanos !== 0) { + writer.uint32(16).int32(message.nanos); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): Timestamp { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseTimestamp(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.seconds = longToNumber(reader.int64()); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.nanos = reader.int32(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): Timestamp { + return { + seconds: isSet(object.seconds) ? globalThis.Number(object.seconds) : 0, + nanos: isSet(object.nanos) ? globalThis.Number(object.nanos) : 0, + }; + }, + + toJSON(message: Timestamp): unknown { + const obj: any = {}; + if (message.seconds !== 0) { + obj.seconds = Math.round(message.seconds); + } + if (message.nanos !== 0) { + obj.nanos = Math.round(message.nanos); + } + return obj; + }, + + create, I>>(base?: I): Timestamp { + return Timestamp.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Timestamp { + const message = createBaseTimestamp(); + message.seconds = object.seconds ?? 0; + message.nanos = object.nanos ?? 0; + return message; + }, +}; + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function longToNumber(int64: { toString(): string }): number { + const num = globalThis.Number(int64.toString()); + if (num > globalThis.Number.MAX_SAFE_INTEGER) { + throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); + } + if (num < globalThis.Number.MIN_SAFE_INTEGER) { + throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER"); + } + return num; +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create, I>>(base?: I): T; + fromPartial, I>>(object: I): T; +} diff --git a/j2735codec/bindings/python/README.md b/j2735codec/bindings/python/README.md index 4ddd68e..bf2e7a7 100644 --- a/j2735codec/bindings/python/README.md +++ b/j2735codec/bindings/python/README.md @@ -5,7 +5,7 @@ This package provides high-performance Python bindings for the **SAE J2735 (2024 ## πŸ“₯ Installation ### Runtime Requirements -- **Python**: `v3.8.18` or higher. +- **Python**: `v3.9` or higher. - **WASM Runtime**: [wasmtime](https://github.com/bytecodealliance/wasmtime) (installed automatically as a dependency). ### Installation via GitHub Release diff --git a/j2735codec/bindings/python/pyproject.toml b/j2735codec/bindings/python/pyproject.toml index 678b965..0ffb15e 100644 --- a/j2735codec/bindings/python/pyproject.toml +++ b/j2735codec/bindings/python/pyproject.toml @@ -7,9 +7,8 @@ readme = "README.md" authors = [ { name = "Sean Hsu", email = "yu.hsiang.sean.hsu@verizon.com" } ] -requires-python = ">=3.8.18" +requires-python = ">=3.9" dependencies = [ - "importlib-resources>=6.4.5 ; python_full_version < '3.9'", "wasmtime>=25.0.0", ] @@ -19,6 +18,8 @@ build-backend = "hatchling.build" [dependency-groups] dev = [ + "protobuf>=6.33.4", + "psutil>=7.2.1", "pytest>=8.3.5", "ruff>=0.14.11", ] @@ -33,4 +34,4 @@ artifacts = [ [tool.pytest.ini_options] pythonpath = "src" -testpaths = ["tests"] \ No newline at end of file +testpaths = ["tests"] diff --git a/j2735codec/bindings/python/src/j2735codec/__init__.py b/j2735codec/bindings/python/src/j2735codec/__init__.py index c9eacea..0729e01 100644 --- a/j2735codec/bindings/python/src/j2735codec/__init__.py +++ b/j2735codec/bindings/python/src/j2735codec/__init__.py @@ -1,5 +1,5 @@ -from j2735codec.codec import J2735Codec +from j2735codec.codec import J2735Codec, GeoRoutedHeader from j2735codec.generated.encodings import EncodingRules from j2735codec.generated.pdu import PDUTypes -__all__ = ["EncodingRules", "PDUTypes", "J2735Codec"] \ No newline at end of file +__all__ = ["EncodingRules", "PDUTypes", "J2735Codec", "GeoRoutedHeader"] \ No newline at end of file diff --git a/j2735codec/bindings/python/src/j2735codec/codec.py b/j2735codec/bindings/python/src/j2735codec/codec.py index 45c37d1..cb033e7 100644 --- a/j2735codec/bindings/python/src/j2735codec/codec.py +++ b/j2735codec/bindings/python/src/j2735codec/codec.py @@ -11,21 +11,32 @@ import os import struct import logging -from typing import Union +from datetime import datetime, timezone +from typing import Union, Optional +from importlib import resources +from dataclasses import dataclass from wasmtime import Func, Module, Store, Instance -# Handle Python 3.8 vs 3.9+ compatibility for resource loading -try: - from importlib import resources - if not hasattr(resources, "files"): - raise ImportError -except ImportError: - import importlib_resources as resources - +from j2735codec.protobuf import georoutedmsg_pb2 from j2735codec import generated from j2735codec.generated.encodings import EncodingRules from j2735codec.generated.pdu import PDUTypes +@dataclass +class GeoRoutedHeader: + """ + Metadata arguments for the Verizon ETX Protobuf envelope. + + Attributes: + lat (float): Latitude in decimal degrees (WGS84). + lon (float): Longitude in decimal degrees (WGS84). + timestamp (Optional[datetime]): UTC time the message was generated. + Defaults to current system UTC time if None. + """ + lat: float + lon: float + timestamp: Optional[datetime] = None + class J2735Codec: """ Represents a V2X codec for transcoding data between encodings. @@ -69,7 +80,86 @@ def __init__(self, wasm_path: Union[str, None] = None): self._free = instance.exports(self._store)["free"] self._memory = instance.exports(self._store)["memory"] - def transcode( + def encode_etx( + self, + buffer: Union[str, bytes], + args: GeoRoutedHeader, + pdu: PDUTypes = PDUTypes.MESSAGE_FRAME, + input_encoding: EncodingRules = EncodingRules.JER, + output_encoding: EncodingRules = EncodingRules.UNALIGNED_BASIC_PER + ) -> bytes: + """ + Transcodes a J2735 message and wraps it in a Verizon ETX Protobuf envelope. + + Args: + buffer: The input data (JSON string or bytes). + args: Metadata including lat, lon, and optional timestamp. + pdu: The ASN.1 PDU type (default: MessageFrame). + input_encoding: The encoding of the input buffer (default: JSON). + output_encoding: The desired inner encoding for ETX (default: UPER). + + Returns: + bytes: The serialized GeoRoutedMsg Protobuf binary. + """ + # Step 1: Transcode via WASM if format conversion is required + if input_encoding == output_encoding: + payload_bytes = buffer.encode('utf-8') if isinstance(buffer, str) else buffer + else: + payload_bytes = self.transcode_j2735( + input_encoding=input_encoding, + output_encoding=output_encoding, + pdu=pdu, + buffer=buffer + ) + + # Step 2: Create the Protobuf message + msg = georoutedmsg_pb2.GeoRoutedMsg() + msg.msgBytes = payload_bytes + msg.position.latitude = args.lat + msg.position.longitude = args.lon + + # Convert Python datetime to Google Well-Known Type (Timestamp) + ts = args.timestamp or datetime.now(timezone.utc) + msg.time.FromDatetime(ts) + + return msg.SerializeToString() + + def decode_etx( + self, + payload: bytes, + input_encoding: EncodingRules = EncodingRules.UNALIGNED_BASIC_PER, + output_encoding: EncodingRules = EncodingRules.JER, + pdu: PDUTypes = PDUTypes.MESSAGE_FRAME + ) -> Union[str, bytes]: + """ + Unpacks an ETX Protobuf envelope and decodes the inner J2735 payload. + + Args: + payload: Raw binary GeoRoutedMsg bytes from the broker. + input_encoding: Encoding used inside the Protobuf (default: UPER). + output_encoding: Desired output format for the user (default: JSON). + pdu: The ASN.1 PDU type (default: MessageFrame). + + Returns: + Union[str, bytes]: The transcoded J2735 message (JSON string or bytes). + """ + # Step 1: Deserialize the envelope + envelope = georoutedmsg_pb2.GeoRoutedMsg() + envelope.ParseFromString(payload) + + # Step 2: Skip transcoding if wire-format is already the desired output format + if input_encoding == output_encoding: + return envelope.msgBytes + + # Step 3: Transcode inner bytes back to requested user format + return self.transcode_j2735( + input_encoding=input_encoding, + output_encoding=output_encoding, + pdu=pdu, + buffer=envelope.msgBytes + ) + + def transcode_j2735( self, input_encoding: EncodingRules, output_encoding: EncodingRules, diff --git a/j2735codec/bindings/python/src/j2735codec/protobuf/__init__.py b/j2735codec/bindings/python/src/j2735codec/protobuf/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/j2735codec/bindings/python/src/j2735codec/protobuf/georoutedmsg_pb2.py b/j2735codec/bindings/python/src/j2735codec/protobuf/georoutedmsg_pb2.py new file mode 100644 index 0000000..def94c2 --- /dev/null +++ b/j2735codec/bindings/python/src/j2735codec/protobuf/georoutedmsg_pb2.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: georoutedmsg.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'georoutedmsg.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12georoutedmsg.proto\x12\x0cgeoroutedmsg\x1a\x1fgoogle/protobuf/timestamp.proto\"/\n\x08Position\x12\x10\n\x08latitude\x18\x01 \x01(\x01\x12\x11\n\tlongitude\x18\x02 \x01(\x01\"\x86\x01\n\x0cGeoRoutedMsg\x12\x10\n\x08msgBytes\x18\x01 \x01(\x0c\x12(\n\x04time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12-\n\x08position\x18\x03 \x01(\x0b\x32\x16.georoutedmsg.PositionH\x00\x88\x01\x01\x42\x0b\n\t_positionb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'georoutedmsg_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + DESCRIPTOR._loaded_options = None + _globals['_POSITION']._serialized_start=69 + _globals['_POSITION']._serialized_end=116 + _globals['_GEOROUTEDMSG']._serialized_start=119 + _globals['_GEOROUTEDMSG']._serialized_end=253 +# @@protoc_insertion_point(module_scope) diff --git a/j2735codec/bindings/python/src/j2735codec/protobuf/georoutedmsg_pb2.pyi b/j2735codec/bindings/python/src/j2735codec/protobuf/georoutedmsg_pb2.pyi new file mode 100644 index 0000000..8cea64c --- /dev/null +++ b/j2735codec/bindings/python/src/j2735codec/protobuf/georoutedmsg_pb2.pyi @@ -0,0 +1,27 @@ +import datetime + +from google.protobuf import timestamp_pb2 as _timestamp_pb2 +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from collections.abc import Mapping as _Mapping +from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union + +DESCRIPTOR: _descriptor.FileDescriptor + +class Position(_message.Message): + __slots__ = ("latitude", "longitude") + LATITUDE_FIELD_NUMBER: _ClassVar[int] + LONGITUDE_FIELD_NUMBER: _ClassVar[int] + latitude: float + longitude: float + def __init__(self, latitude: _Optional[float] = ..., longitude: _Optional[float] = ...) -> None: ... + +class GeoRoutedMsg(_message.Message): + __slots__ = ("msgBytes", "time", "position") + MSGBYTES_FIELD_NUMBER: _ClassVar[int] + TIME_FIELD_NUMBER: _ClassVar[int] + POSITION_FIELD_NUMBER: _ClassVar[int] + msgBytes: bytes + time: _timestamp_pb2.Timestamp + position: Position + def __init__(self, msgBytes: _Optional[bytes] = ..., time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., position: _Optional[_Union[Position, _Mapping]] = ...) -> None: ... diff --git a/j2735codec/bindings/python/tests/test_codec.py b/j2735codec/bindings/python/tests/test_codec.py index 750c94a..d72e99c 100644 --- a/j2735codec/bindings/python/tests/test_codec.py +++ b/j2735codec/bindings/python/tests/test_codec.py @@ -2,52 +2,43 @@ # SPDX-License-Identifier: Apache-2.0 import pytest import json +import os +import psutil from pathlib import Path +from datetime import datetime, timezone -from j2735codec import EncodingRules, PDUTypes, J2735Codec +from j2735codec import EncodingRules, PDUTypes, J2735Codec, GeoRoutedHeader def get_sample_dir(): - """ - Finds the core samples directory relative to this test file. - Structure: j2735codec/bindings/python/tests/test_file.py - Path to core: ../../core/j2735_202409/samples/jer - """ - # __file__ is: .../j2735codec/bindings/python/tests/test_codec.py + """Finds the core samples directory relative to this test file.""" current_file = Path(__file__).resolve() - - # Go up 3 levels to get to j2735codec/ + # Path navigation based on your monorepo structure project_root = current_file.parents[3] - - # Navigate to the core samples - # Note: We use the specific version folder we discussed sample_path = project_root / "core" / "j2735_202409" / "samples" / "jer" - print(sample_path) return sample_path def get_sample_files(): sample_dir = get_sample_dir() if not sample_dir.exists(): return [] - # Recursively find all .json files in the core samples folder return list(sample_dir.rglob("*.json")) @pytest.fixture(scope="module") def codec(): return J2735Codec() -# Collect file paths SAMPLE_PATHS = get_sample_files() @pytest.mark.parametrize("sample_path", SAMPLE_PATHS, ids=lambda p: p.name) def test_transcode_roundtrip(codec, sample_path): + """Tests basic J2735 transcoding (JER <-> UPER).""" if not SAMPLE_PATHS: - pytest.fail(f"No JSON samples found in {get_sample_dir()}. Check pathing.") + pytest.fail(f"No JSON samples found. Check pathing.") - # Read the file directly from the filesystem json_content = sample_path.read_text(encoding="utf-8") - # Encode: JER (JSON) -> UPER (Binary) - encoded_bin = codec.transcode( + # Encode: JER -> UPER + encoded_bin = codec.transcode_j2735( EncodingRules.JER, EncodingRules.UNALIGNED_BASIC_PER, PDUTypes.MESSAGE_FRAME, @@ -57,17 +48,75 @@ def test_transcode_roundtrip(codec, sample_path): assert isinstance(encoded_bin, (bytes, bytearray)) assert len(encoded_bin) > 0 - # Decode: UPER (Binary) -> JER (JSON) - decoded_jer = codec.transcode( + # Decode: UPER -> JER + decoded_jer = codec.transcode_j2735( EncodingRules.UNALIGNED_BASIC_PER, EncodingRules.JER, PDUTypes.MESSAGE_FRAME, encoded_bin, ) - # Convert output to string for validation decoded_str = decoded_jer.decode("utf-8") if hasattr(decoded_jer, "decode") else str(decoded_jer) + assert isinstance(json.loads(decoded_str), dict) + +@pytest.mark.parametrize("sample_path", SAMPLE_PATHS[:3], ids=lambda p: f"etx_{p.name}") +def test_etx_pack_unpack_roundtrip(codec, sample_path): + """Tests the full ETX Protobuf envelope packing and unpacking.""" + json_content = sample_path.read_text(encoding="utf-8") + + test_args = GeoRoutedHeader( + lat=40.7128, + lon=-74.0060, + timestamp=datetime.now(timezone.utc) + ) + + # 1. Pack + etx_binary = codec.encode_etx( + buffer=json_content, + args=test_args, + pdu=PDUTypes.MESSAGE_FRAME + ) - assert len(decoded_str) > 0 - # Validate it's still valid JSON - assert isinstance(json.loads(decoded_str), dict) \ No newline at end of file + assert isinstance(etx_binary, bytes) + assert len(etx_binary) > 0 # UPER is highly compressed, so just check it exists + + # 2. Unpack + unpacked_json_str = codec.decode_etx( + payload=etx_binary, + pdu=PDUTypes.MESSAGE_FRAME + ) + + # Validate output + original_dict = json.loads(json_content) + unpacked_dict = json.loads(unpacked_json_str) + + # Check that the message IDs match + assert unpacked_dict["messageId"] == original_dict["messageId"] + +def test_memory_stability(codec): + """Stress test to check for memory leaks in the WASM malloc/free cycle.""" + process = psutil.Process(os.getpid()) + + sample_json = '{"messageId": 20, "value": {}}' + if SAMPLE_PATHS: + sample_json = SAMPLE_PATHS[0].read_text(encoding="utf-8") + + args = GeoRoutedHeader(lat=1.0, lon=1.0) + + # Baseline after warmup + for _ in range(20): + codec.encode_etx(sample_json, args) + + initial_mem = process.memory_info().rss + + # Run 500 iterations + for _ in range(500): + # We test encode_etx because it allocates memory for + # input (JSON) and output (UPER) pointers in WASM. + codec.encode_etx(sample_json, args) + + final_mem = process.memory_info().rss + + # Memory growth should be negligible (less than 2MB) + mem_diff_mb = (final_mem - initial_mem) / (1024 * 1024) + assert mem_diff_mb < 2.0, f"Memory leak: {mem_diff_mb:.2f} MB growth" \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 2bb0348..00e4b81 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,10 +1,8 @@ [project] name = "etx-starter-kit" version = "0.2.0" -requires-python = ">=3.8.18" -dependencies = [ - "j2735codec", -] +requires-python = ">=3.9" +dependencies = [] [tool.uv] # Add any additional workspaces here in the future. @@ -12,4 +10,7 @@ workspace = { members = ["j2735codec/bindings/python"] } [tool.uv.sources] # This explicitly tells UV where to find the 'j2735codec' package -j2735codec = { workspace = true } \ No newline at end of file +j2735codec = { workspace = true } + +[dependency-groups] +dev = [] diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..899c642 --- /dev/null +++ b/uv.lock @@ -0,0 +1,318 @@ +version = 1 +revision = 3 +requires-python = ">=3.9" +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version < '3.10'", +] + +[manifest] +members = [ + "etx-starter-kit", + "j2735codec", +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "etx-starter-kit" +version = "0.2.0" +source = { virtual = "." } + +[package.metadata] + +[package.metadata.requires-dev] +dev = [] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "j2735codec" +version = "0.2.0" +source = { editable = "j2735codec/bindings/python" } +dependencies = [ + { name = "wasmtime" }, +] + +[package.dev-dependencies] +dev = [ + { name = "protobuf" }, + { name = "psutil" }, + { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "pytest", version = "9.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [{ name = "wasmtime", specifier = ">=25.0.0" }] + +[package.metadata.requires-dev] +dev = [ + { name = "protobuf", specifier = ">=6.33.4" }, + { name = "psutil", specifier = ">=7.2.1" }, + { name = "pytest", specifier = ">=8.3.5" }, + { name = "ruff", specifier = ">=0.14.11" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "protobuf" +version = "6.33.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/b8/cda15d9d46d03d4aa3a67cb6bffe05173440ccf86a9541afaf7ac59a1b6b/protobuf-6.33.4.tar.gz", hash = "sha256:dc2e61bca3b10470c1912d166fe0af67bfc20eb55971dcef8dfa48ce14f0ed91", size = 444346, upload-time = "2026-01-12T18:33:40.109Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/be/24ef9f3095bacdf95b458543334d0c4908ccdaee5130420bf064492c325f/protobuf-6.33.4-cp310-abi3-win32.whl", hash = "sha256:918966612c8232fc6c24c78e1cd89784307f5814ad7506c308ee3cf86662850d", size = 425612, upload-time = "2026-01-12T18:33:29.656Z" }, + { url = "https://files.pythonhosted.org/packages/31/ad/e5693e1974a28869e7cd244302911955c1cebc0161eb32dfa2b25b6e96f0/protobuf-6.33.4-cp310-abi3-win_amd64.whl", hash = "sha256:8f11ffae31ec67fc2554c2ef891dcb561dae9a2a3ed941f9e134c2db06657dbc", size = 436962, upload-time = "2026-01-12T18:33:31.345Z" }, + { url = "https://files.pythonhosted.org/packages/66/15/6ee23553b6bfd82670207ead921f4d8ef14c107e5e11443b04caeb5ab5ec/protobuf-6.33.4-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2fe67f6c014c84f655ee06f6f66213f9254b3a8b6bda6cda0ccd4232c73c06f0", size = 427612, upload-time = "2026-01-12T18:33:32.646Z" }, + { url = "https://files.pythonhosted.org/packages/2b/48/d301907ce6d0db75f959ca74f44b475a9caa8fcba102d098d3c3dd0f2d3f/protobuf-6.33.4-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:757c978f82e74d75cba88eddec479df9b99a42b31193313b75e492c06a51764e", size = 324484, upload-time = "2026-01-12T18:33:33.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/1c/e53078d3f7fe710572ab2dcffd993e1e3b438ae71cfc031b71bae44fcb2d/protobuf-6.33.4-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:c7c64f259c618f0bef7bee042075e390debbf9682334be2b67408ec7c1c09ee6", size = 339256, upload-time = "2026-01-12T18:33:35.231Z" }, + { url = "https://files.pythonhosted.org/packages/e8/8e/971c0edd084914f7ee7c23aa70ba89e8903918adca179319ee94403701d5/protobuf-6.33.4-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:3df850c2f8db9934de4cf8f9152f8dc2558f49f298f37f90c517e8e5c84c30e9", size = 323311, upload-time = "2026-01-12T18:33:36.305Z" }, + { url = "https://files.pythonhosted.org/packages/2f/bd/5c6cda3fbdde7473edcfd4c93a698a3021ffdcc92f3c101203a93bfd9c04/protobuf-6.33.4-cp39-cp39-win32.whl", hash = "sha256:955478a89559fa4568f5a81dce77260eabc5c686f9e8366219ebd30debf06aa6", size = 425734, upload-time = "2026-01-12T18:33:37.247Z" }, + { url = "https://files.pythonhosted.org/packages/a8/51/a128b3eb55954074074bdba124003e64d255314a12888fd41faecc458798/protobuf-6.33.4-cp39-cp39-win_amd64.whl", hash = "sha256:0f12ddbf96912690c3582f9dffb55530ef32015ad8e678cd494312bd78314c4f", size = 436984, upload-time = "2026-01-12T18:33:38.303Z" }, + { url = "https://files.pythonhosted.org/packages/75/b1/1dc83c2c661b4c62d56cc081706ee33a4fc2835bd90f965baa2663ef7676/protobuf-6.33.4-py3-none-any.whl", hash = "sha256:1fe3730068fcf2e595816a6c34fe66eeedd37d51d0400b72fabc848811fdc1bc", size = 170532, upload-time = "2026-01-12T18:33:39.199Z" }, +] + +[[package]] +name = "psutil" +version = "7.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/73/cb/09e5184fb5fc0358d110fc3ca7f6b1d033800734d34cac10f4136cfac10e/psutil-7.2.1.tar.gz", hash = "sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3", size = 490253, upload-time = "2025-12-29T08:26:00.169Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/8e/f0c242053a368c2aa89584ecd1b054a18683f13d6e5a318fc9ec36582c94/psutil-7.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9f33bb525b14c3ea563b2fd521a84d2fa214ec59e3e6a2858f78d0844dd60d", size = 129624, upload-time = "2025-12-29T08:26:04.255Z" }, + { url = "https://files.pythonhosted.org/packages/26/97/a58a4968f8990617decee234258a2b4fc7cd9e35668387646c1963e69f26/psutil-7.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:81442dac7abfc2f4f4385ea9e12ddf5a796721c0f6133260687fec5c3780fa49", size = 130132, upload-time = "2025-12-29T08:26:06.228Z" }, + { url = "https://files.pythonhosted.org/packages/db/6d/ed44901e830739af5f72a85fa7ec5ff1edea7f81bfbf4875e409007149bd/psutil-7.2.1-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea46c0d060491051d39f0d2cff4f98d5c72b288289f57a21556cc7d504db37fc", size = 180612, upload-time = "2025-12-29T08:26:08.276Z" }, + { url = "https://files.pythonhosted.org/packages/c7/65/b628f8459bca4efbfae50d4bf3feaab803de9a160b9d5f3bd9295a33f0c2/psutil-7.2.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:35630d5af80d5d0d49cfc4d64c1c13838baf6717a13effb35869a5919b854cdf", size = 183201, upload-time = "2025-12-29T08:26:10.622Z" }, + { url = "https://files.pythonhosted.org/packages/fb/23/851cadc9764edcc18f0effe7d0bf69f727d4cf2442deb4a9f78d4e4f30f2/psutil-7.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:923f8653416604e356073e6e0bccbe7c09990acef442def2f5640dd0faa9689f", size = 139081, upload-time = "2025-12-29T08:26:12.483Z" }, + { url = "https://files.pythonhosted.org/packages/59/82/d63e8494ec5758029f31c6cb06d7d161175d8281e91d011a4a441c8a43b5/psutil-7.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cfbe6b40ca48019a51827f20d830887b3107a74a79b01ceb8cc8de4ccb17b672", size = 134767, upload-time = "2025-12-29T08:26:14.528Z" }, + { url = "https://files.pythonhosted.org/packages/05/c2/5fb764bd61e40e1fe756a44bd4c21827228394c17414ade348e28f83cd79/psutil-7.2.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:494c513ccc53225ae23eec7fe6e1482f1b8a44674241b54561f755a898650679", size = 129716, upload-time = "2025-12-29T08:26:16.017Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d2/935039c20e06f615d9ca6ca0ab756cf8408a19d298ffaa08666bc18dc805/psutil-7.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3fce5f92c22b00cdefd1645aa58ab4877a01679e901555067b1bd77039aa589f", size = 130133, upload-time = "2025-12-29T08:26:18.009Z" }, + { url = "https://files.pythonhosted.org/packages/77/69/19f1eb0e01d24c2b3eacbc2f78d3b5add8a89bf0bb69465bc8d563cc33de/psutil-7.2.1-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93f3f7b0bb07711b49626e7940d6fe52aa9940ad86e8f7e74842e73189712129", size = 181518, upload-time = "2025-12-29T08:26:20.241Z" }, + { url = "https://files.pythonhosted.org/packages/e1/6d/7e18b1b4fa13ad370787626c95887b027656ad4829c156bb6569d02f3262/psutil-7.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d34d2ca888208eea2b5c68186841336a7f5e0b990edec929be909353a202768a", size = 184348, upload-time = "2025-12-29T08:26:22.215Z" }, + { url = "https://files.pythonhosted.org/packages/98/60/1672114392dd879586d60dd97896325df47d9a130ac7401318005aab28ec/psutil-7.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2ceae842a78d1603753561132d5ad1b2f8a7979cb0c283f5b52fb4e6e14b1a79", size = 140400, upload-time = "2025-12-29T08:26:23.993Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7b/d0e9d4513c46e46897b46bcfc410d51fc65735837ea57a25170f298326e6/psutil-7.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:08a2f175e48a898c8eb8eace45ce01777f4785bc744c90aa2cc7f2fa5462a266", size = 135430, upload-time = "2025-12-29T08:26:25.999Z" }, + { url = "https://files.pythonhosted.org/packages/c5/cf/5180eb8c8bdf6a503c6919f1da28328bd1e6b3b1b5b9d5b01ae64f019616/psutil-7.2.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42", size = 128137, upload-time = "2025-12-29T08:26:27.759Z" }, + { url = "https://files.pythonhosted.org/packages/c5/2c/78e4a789306a92ade5000da4f5de3255202c534acdadc3aac7b5458fadef/psutil-7.2.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1", size = 128947, upload-time = "2025-12-29T08:26:29.548Z" }, + { url = "https://files.pythonhosted.org/packages/29/f8/40e01c350ad9a2b3cb4e6adbcc8a83b17ee50dd5792102b6142385937db5/psutil-7.2.1-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8", size = 154694, upload-time = "2025-12-29T08:26:32.147Z" }, + { url = "https://files.pythonhosted.org/packages/06/e4/b751cdf839c011a9714a783f120e6a86b7494eb70044d7d81a25a5cd295f/psutil-7.2.1-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6", size = 156136, upload-time = "2025-12-29T08:26:34.079Z" }, + { url = "https://files.pythonhosted.org/packages/44/ad/bbf6595a8134ee1e94a4487af3f132cef7fce43aef4a93b49912a48c3af7/psutil-7.2.1-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f78baafb38436d5a128f837fab2d92c276dfb48af01a240b861ae02b2413ada8", size = 148108, upload-time = "2025-12-29T08:26:36.225Z" }, + { url = "https://files.pythonhosted.org/packages/1c/15/dd6fd869753ce82ff64dcbc18356093471a5a5adf4f77ed1f805d473d859/psutil-7.2.1-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:99a4cd17a5fdd1f3d014396502daa70b5ec21bf4ffe38393e152f8e449757d67", size = 147402, upload-time = "2025-12-29T08:26:39.21Z" }, + { url = "https://files.pythonhosted.org/packages/34/68/d9317542e3f2b180c4306e3f45d3c922d7e86d8ce39f941bb9e2e9d8599e/psutil-7.2.1-cp37-abi3-win_amd64.whl", hash = "sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17", size = 136938, upload-time = "2025-12-29T08:26:41.036Z" }, + { url = "https://files.pythonhosted.org/packages/3e/73/2ce007f4198c80fcf2cb24c169884f833fe93fbc03d55d302627b094ee91/psutil-7.2.1-cp37-abi3-win_arm64.whl", hash = "sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442", size = 133836, upload-time = "2025-12-29T08:26:43.086Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pytest" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.10'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.10'" }, + { name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "packaging", marker = "python_full_version < '3.10'" }, + { name = "pluggy", marker = "python_full_version < '3.10'" }, + { name = "pygments", marker = "python_full_version < '3.10'" }, + { name = "tomli", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, +] + +[[package]] +name = "pytest" +version = "9.0.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, + { name = "iniconfig", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "packaging", marker = "python_full_version >= '3.10'" }, + { name = "pluggy", marker = "python_full_version >= '3.10'" }, + { name = "pygments", marker = "python_full_version >= '3.10'" }, + { name = "tomli", marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, +] + +[[package]] +name = "ruff" +version = "0.14.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/50/0a/1914efb7903174b381ee2ffeebb4253e729de57f114e63595114c8ca451f/ruff-0.14.13.tar.gz", hash = "sha256:83cd6c0763190784b99650a20fec7633c59f6ebe41c5cc9d45ee42749563ad47", size = 6059504, upload-time = "2026-01-15T20:15:16.918Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/ae/0deefbc65ca74b0ab1fd3917f94dc3b398233346a74b8bbb0a916a1a6bf6/ruff-0.14.13-py3-none-linux_armv6l.whl", hash = "sha256:76f62c62cd37c276cb03a275b198c7c15bd1d60c989f944db08a8c1c2dbec18b", size = 13062418, upload-time = "2026-01-15T20:14:50.779Z" }, + { url = "https://files.pythonhosted.org/packages/47/df/5916604faa530a97a3c154c62a81cb6b735c0cb05d1e26d5ad0f0c8ac48a/ruff-0.14.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:914a8023ece0528d5cc33f5a684f5f38199bbb566a04815c2c211d8f40b5d0ed", size = 13442344, upload-time = "2026-01-15T20:15:07.94Z" }, + { url = "https://files.pythonhosted.org/packages/4c/f3/e0e694dd69163c3a1671e102aa574a50357536f18a33375050334d5cd517/ruff-0.14.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d24899478c35ebfa730597a4a775d430ad0d5631b8647a3ab368c29b7e7bd063", size = 12354720, upload-time = "2026-01-15T20:15:09.854Z" }, + { url = "https://files.pythonhosted.org/packages/c3/e8/67f5fcbbaee25e8fc3b56cc33e9892eca7ffe09f773c8e5907757a7e3bdb/ruff-0.14.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9aaf3870f14d925bbaf18b8a2347ee0ae7d95a2e490e4d4aea6813ed15ebc80e", size = 12774493, upload-time = "2026-01-15T20:15:20.908Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ce/d2e9cb510870b52a9565d885c0d7668cc050e30fa2c8ac3fb1fda15c083d/ruff-0.14.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac5b7f63dd3b27cc811850f5ffd8fff845b00ad70e60b043aabf8d6ecc304e09", size = 12815174, upload-time = "2026-01-15T20:15:05.74Z" }, + { url = "https://files.pythonhosted.org/packages/88/00/c38e5da58beebcf4fa32d0ddd993b63dfacefd02ab7922614231330845bf/ruff-0.14.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d2b1097750d90ba82ce4ba676e85230a0ed694178ca5e61aa9b459970b3eb9", size = 13680909, upload-time = "2026-01-15T20:15:14.537Z" }, + { url = "https://files.pythonhosted.org/packages/61/61/cd37c9dd5bd0a3099ba79b2a5899ad417d8f3b04038810b0501a80814fd7/ruff-0.14.13-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:7d0bf87705acbbcb8d4c24b2d77fbb73d40210a95c3903b443cd9e30824a5032", size = 15144215, upload-time = "2026-01-15T20:15:22.886Z" }, + { url = "https://files.pythonhosted.org/packages/56/8a/85502d7edbf98c2df7b8876f316c0157359165e16cdf98507c65c8d07d3d/ruff-0.14.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3eb5da8e2c9e9f13431032fdcbe7681de9ceda5835efee3269417c13f1fed5c", size = 14706067, upload-time = "2026-01-15T20:14:48.271Z" }, + { url = "https://files.pythonhosted.org/packages/7e/2f/de0df127feb2ee8c1e54354dc1179b4a23798f0866019528c938ba439aca/ruff-0.14.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:642442b42957093811cd8d2140dfadd19c7417030a7a68cf8d51fcdd5f217427", size = 14133916, upload-time = "2026-01-15T20:14:57.357Z" }, + { url = "https://files.pythonhosted.org/packages/0d/77/9b99686bb9fe07a757c82f6f95e555c7a47801a9305576a9c67e0a31d280/ruff-0.14.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4acdf009f32b46f6e8864af19cbf6841eaaed8638e65c8dac845aea0d703c841", size = 13859207, upload-time = "2026-01-15T20:14:55.111Z" }, + { url = "https://files.pythonhosted.org/packages/7d/46/2bdcb34a87a179a4d23022d818c1c236cb40e477faf0d7c9afb6813e5876/ruff-0.14.13-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:591a7f68860ea4e003917d19b5c4f5ac39ff558f162dc753a2c5de897fd5502c", size = 14043686, upload-time = "2026-01-15T20:14:52.841Z" }, + { url = "https://files.pythonhosted.org/packages/1a/a9/5c6a4f56a0512c691cf143371bcf60505ed0f0860f24a85da8bd123b2bf1/ruff-0.14.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:774c77e841cc6e046fc3e91623ce0903d1cd07e3a36b1a9fe79b81dab3de506b", size = 12663837, upload-time = "2026-01-15T20:15:18.921Z" }, + { url = "https://files.pythonhosted.org/packages/fe/bb/b920016ece7651fa7fcd335d9d199306665486694d4361547ccb19394c44/ruff-0.14.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:61f4e40077a1248436772bb6512db5fc4457fe4c49e7a94ea7c5088655dd21ae", size = 12805867, upload-time = "2026-01-15T20:14:59.272Z" }, + { url = "https://files.pythonhosted.org/packages/7d/b3/0bd909851e5696cd21e32a8fc25727e5f58f1934b3596975503e6e85415c/ruff-0.14.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6d02f1428357fae9e98ac7aa94b7e966fd24151088510d32cf6f902d6c09235e", size = 13208528, upload-time = "2026-01-15T20:15:03.732Z" }, + { url = "https://files.pythonhosted.org/packages/3b/3b/e2d94cb613f6bbd5155a75cbe072813756363eba46a3f2177a1fcd0cd670/ruff-0.14.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e399341472ce15237be0c0ae5fbceca4b04cd9bebab1a2b2c979e015455d8f0c", size = 13929242, upload-time = "2026-01-15T20:15:11.918Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c5/abd840d4132fd51a12f594934af5eba1d5d27298a6f5b5d6c3be45301caf/ruff-0.14.13-py3-none-win32.whl", hash = "sha256:ef720f529aec113968b45dfdb838ac8934e519711da53a0456038a0efecbd680", size = 12919024, upload-time = "2026-01-15T20:14:43.647Z" }, + { url = "https://files.pythonhosted.org/packages/c2/55/6384b0b8ce731b6e2ade2b5449bf07c0e4c31e8a2e68ea65b3bafadcecc5/ruff-0.14.13-py3-none-win_amd64.whl", hash = "sha256:6070bd026e409734b9257e03e3ef18c6e1a216f0435c6751d7a8ec69cb59abef", size = 14097887, upload-time = "2026-01-15T20:15:01.48Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e1/7348090988095e4e39560cfc2f7555b1b2a7357deba19167b600fdf5215d/ruff-0.14.13-py3-none-win_arm64.whl", hash = "sha256:7ab819e14f1ad9fe39f246cfcc435880ef7a9390d81a2b6ac7e01039083dd247", size = 13080224, upload-time = "2026-01-15T20:14:45.853Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/30/31573e9457673ab10aa432461bee537ce6cef177667deca369efb79df071/tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c", size = 17477, upload-time = "2026-01-11T11:22:38.165Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/d9/3dc2289e1f3b32eb19b9785b6a006b28ee99acb37d1d47f78d4c10e28bf8/tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867", size = 153663, upload-time = "2026-01-11T11:21:45.27Z" }, + { url = "https://files.pythonhosted.org/packages/51/32/ef9f6845e6b9ca392cd3f64f9ec185cc6f09f0a2df3db08cbe8809d1d435/tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9", size = 148469, upload-time = "2026-01-11T11:21:46.873Z" }, + { url = "https://files.pythonhosted.org/packages/d6/c2/506e44cce89a8b1b1e047d64bd495c22c9f71f21e05f380f1a950dd9c217/tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95", size = 236039, upload-time = "2026-01-11T11:21:48.503Z" }, + { url = "https://files.pythonhosted.org/packages/b3/40/e1b65986dbc861b7e986e8ec394598187fa8aee85b1650b01dd925ca0be8/tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76", size = 243007, upload-time = "2026-01-11T11:21:49.456Z" }, + { url = "https://files.pythonhosted.org/packages/9c/6f/6e39ce66b58a5b7ae572a0f4352ff40c71e8573633deda43f6a379d56b3e/tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d", size = 240875, upload-time = "2026-01-11T11:21:50.755Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ad/cb089cb190487caa80204d503c7fd0f4d443f90b95cf4ef5cf5aa0f439b0/tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576", size = 246271, upload-time = "2026-01-11T11:21:51.81Z" }, + { url = "https://files.pythonhosted.org/packages/0b/63/69125220e47fd7a3a27fd0de0c6398c89432fec41bc739823bcc66506af6/tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a", size = 96770, upload-time = "2026-01-11T11:21:52.647Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0d/a22bb6c83f83386b0008425a6cd1fa1c14b5f3dd4bad05e98cf3dbbf4a64/tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa", size = 107626, upload-time = "2026-01-11T11:21:53.459Z" }, + { url = "https://files.pythonhosted.org/packages/2f/6d/77be674a3485e75cacbf2ddba2b146911477bd887dda9d8c9dfb2f15e871/tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614", size = 94842, upload-time = "2026-01-11T11:21:54.831Z" }, + { url = "https://files.pythonhosted.org/packages/3c/43/7389a1869f2f26dba52404e1ef13b4784b6b37dac93bac53457e3ff24ca3/tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1", size = 154894, upload-time = "2026-01-11T11:21:56.07Z" }, + { url = "https://files.pythonhosted.org/packages/e9/05/2f9bf110b5294132b2edf13fe6ca6ae456204f3d749f623307cbb7a946f2/tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8", size = 149053, upload-time = "2026-01-11T11:21:57.467Z" }, + { url = "https://files.pythonhosted.org/packages/e8/41/1eda3ca1abc6f6154a8db4d714a4d35c4ad90adc0bcf700657291593fbf3/tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a", size = 243481, upload-time = "2026-01-11T11:21:58.661Z" }, + { url = "https://files.pythonhosted.org/packages/d2/6d/02ff5ab6c8868b41e7d4b987ce2b5f6a51d3335a70aa144edd999e055a01/tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1", size = 251720, upload-time = "2026-01-11T11:22:00.178Z" }, + { url = "https://files.pythonhosted.org/packages/7b/57/0405c59a909c45d5b6f146107c6d997825aa87568b042042f7a9c0afed34/tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b", size = 247014, upload-time = "2026-01-11T11:22:01.238Z" }, + { url = "https://files.pythonhosted.org/packages/2c/0e/2e37568edd944b4165735687cbaf2fe3648129e440c26d02223672ee0630/tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51", size = 251820, upload-time = "2026-01-11T11:22:02.727Z" }, + { url = "https://files.pythonhosted.org/packages/5a/1c/ee3b707fdac82aeeb92d1a113f803cf6d0f37bdca0849cb489553e1f417a/tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729", size = 97712, upload-time = "2026-01-11T11:22:03.777Z" }, + { url = "https://files.pythonhosted.org/packages/69/13/c07a9177d0b3bab7913299b9278845fc6eaaca14a02667c6be0b0a2270c8/tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da", size = 108296, upload-time = "2026-01-11T11:22:04.86Z" }, + { url = "https://files.pythonhosted.org/packages/18/27/e267a60bbeeee343bcc279bb9e8fbed0cbe224bc7b2a3dc2975f22809a09/tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3", size = 94553, upload-time = "2026-01-11T11:22:05.854Z" }, + { url = "https://files.pythonhosted.org/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0", size = 154915, upload-time = "2026-01-11T11:22:06.703Z" }, + { url = "https://files.pythonhosted.org/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e", size = 149038, upload-time = "2026-01-11T11:22:07.56Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8a/6d38870bd3d52c8d1505ce054469a73f73a0fe62c0eaf5dddf61447e32fa/tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4", size = 242245, upload-time = "2026-01-11T11:22:08.344Z" }, + { url = "https://files.pythonhosted.org/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e", size = 250335, upload-time = "2026-01-11T11:22:09.951Z" }, + { url = "https://files.pythonhosted.org/packages/a5/3d/4cdb6f791682b2ea916af2de96121b3cb1284d7c203d97d92d6003e91c8d/tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c", size = 245962, upload-time = "2026-01-11T11:22:11.27Z" }, + { url = "https://files.pythonhosted.org/packages/f2/4a/5f25789f9a460bd858ba9756ff52d0830d825b458e13f754952dd15fb7bb/tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f", size = 250396, upload-time = "2026-01-11T11:22:12.325Z" }, + { url = "https://files.pythonhosted.org/packages/aa/2f/b73a36fea58dfa08e8b3a268750e6853a6aac2a349241a905ebd86f3047a/tomli-2.4.0-cp313-cp313-win32.whl", hash = "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86", size = 97530, upload-time = "2026-01-11T11:22:13.865Z" }, + { url = "https://files.pythonhosted.org/packages/3b/af/ca18c134b5d75de7e8dc551c5234eaba2e8e951f6b30139599b53de9c187/tomli-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87", size = 108227, upload-time = "2026-01-11T11:22:15.224Z" }, + { url = "https://files.pythonhosted.org/packages/22/c3/b386b832f209fee8073c8138ec50f27b4460db2fdae9ffe022df89a57f9b/tomli-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132", size = 94748, upload-time = "2026-01-11T11:22:16.009Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c4/84047a97eb1004418bc10bdbcfebda209fca6338002eba2dc27cc6d13563/tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6", size = 154725, upload-time = "2026-01-11T11:22:17.269Z" }, + { url = "https://files.pythonhosted.org/packages/a8/5d/d39038e646060b9d76274078cddf146ced86dc2b9e8bbf737ad5983609a0/tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc", size = 148901, upload-time = "2026-01-11T11:22:18.287Z" }, + { url = "https://files.pythonhosted.org/packages/73/e5/383be1724cb30f4ce44983d249645684a48c435e1cd4f8b5cded8a816d3c/tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66", size = 243375, upload-time = "2026-01-11T11:22:19.154Z" }, + { url = "https://files.pythonhosted.org/packages/31/f0/bea80c17971c8d16d3cc109dc3585b0f2ce1036b5f4a8a183789023574f2/tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d", size = 250639, upload-time = "2026-01-11T11:22:20.168Z" }, + { url = "https://files.pythonhosted.org/packages/2c/8f/2853c36abbb7608e3f945d8a74e32ed3a74ee3a1f468f1ffc7d1cb3abba6/tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702", size = 246897, upload-time = "2026-01-11T11:22:21.544Z" }, + { url = "https://files.pythonhosted.org/packages/49/f0/6c05e3196ed5337b9fe7ea003e95fd3819a840b7a0f2bf5a408ef1dad8ed/tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8", size = 254697, upload-time = "2026-01-11T11:22:23.058Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f5/2922ef29c9f2951883525def7429967fc4d8208494e5ab524234f06b688b/tomli-2.4.0-cp314-cp314-win32.whl", hash = "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776", size = 98567, upload-time = "2026-01-11T11:22:24.033Z" }, + { url = "https://files.pythonhosted.org/packages/7b/31/22b52e2e06dd2a5fdbc3ee73226d763b184ff21fc24e20316a44ccc4d96b/tomli-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475", size = 108556, upload-time = "2026-01-11T11:22:25.378Z" }, + { url = "https://files.pythonhosted.org/packages/48/3d/5058dff3255a3d01b705413f64f4306a141a8fd7a251e5a495e3f192a998/tomli-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2", size = 96014, upload-time = "2026-01-11T11:22:26.138Z" }, + { url = "https://files.pythonhosted.org/packages/b8/4e/75dab8586e268424202d3a1997ef6014919c941b50642a1682df43204c22/tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9", size = 163339, upload-time = "2026-01-11T11:22:27.143Z" }, + { url = "https://files.pythonhosted.org/packages/06/e3/b904d9ab1016829a776d97f163f183a48be6a4deb87304d1e0116a349519/tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0", size = 159490, upload-time = "2026-01-11T11:22:28.399Z" }, + { url = "https://files.pythonhosted.org/packages/e3/5a/fc3622c8b1ad823e8ea98a35e3c632ee316d48f66f80f9708ceb4f2a0322/tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df", size = 269398, upload-time = "2026-01-11T11:22:29.345Z" }, + { url = "https://files.pythonhosted.org/packages/fd/33/62bd6152c8bdd4c305ad9faca48f51d3acb2df1f8791b1477d46ff86e7f8/tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d", size = 276515, upload-time = "2026-01-11T11:22:30.327Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ff/ae53619499f5235ee4211e62a8d7982ba9e439a0fb4f2f351a93d67c1dd2/tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f", size = 273806, upload-time = "2026-01-11T11:22:32.56Z" }, + { url = "https://files.pythonhosted.org/packages/47/71/cbca7787fa68d4d0a9f7072821980b39fbb1b6faeb5f5cf02f4a5559fa28/tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b", size = 281340, upload-time = "2026-01-11T11:22:33.505Z" }, + { url = "https://files.pythonhosted.org/packages/f5/00/d595c120963ad42474cf6ee7771ad0d0e8a49d0f01e29576ee9195d9ecdf/tomli-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087", size = 108106, upload-time = "2026-01-11T11:22:34.451Z" }, + { url = "https://files.pythonhosted.org/packages/de/69/9aa0c6a505c2f80e519b43764f8b4ba93b5a0bbd2d9a9de6e2b24271b9a5/tomli-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd", size = 120504, upload-time = "2026-01-11T11:22:35.764Z" }, + { url = "https://files.pythonhosted.org/packages/b3/9f/f1668c281c58cfae01482f7114a4b88d345e4c140386241a1a24dcc9e7bc/tomli-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4", size = 99561, upload-time = "2026-01-11T11:22:36.624Z" }, + { url = "https://files.pythonhosted.org/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", size = 14477, upload-time = "2026-01-11T11:22:37.446Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "wasmtime" +version = "40.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/96/3e7e9b4c5b9d3071b469502d0c4418d1492e5ce52bbf5b985703b08c6892/wasmtime-40.0.0.tar.gz", hash = "sha256:48417c59f13be145184cff61fef61bb52556ea0e7417c25bec09af2d859745ab", size = 117370, upload-time = "2025-12-22T16:30:39.179Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/19/da6935d495d5bf5a1defa261c183af3e624b6684bfe8d54a0aa4caf238b6/wasmtime-40.0.0-py3-none-android_26_arm64_v8a.whl", hash = "sha256:f81dcd8850c66bbe8da53774515bd255a18fce595899e9d851f9969d48d7f592", size = 6894176, upload-time = "2025-12-22T16:30:23.962Z" }, + { url = "https://files.pythonhosted.org/packages/bf/20/2d6afa0e102e85745a3f637e399151f725e836e91c1cd8304bf8cda6eb8f/wasmtime-40.0.0-py3-none-android_26_x86_64.whl", hash = "sha256:b462e868f9af4bc69ee353e2cebb3ea5c14984f07b703e3dfc208697ac798fc9", size = 7735017, upload-time = "2025-12-22T16:30:25.709Z" }, + { url = "https://files.pythonhosted.org/packages/ac/fa/4d061d3b54d8b550c1a043d197380dd54fb1954c58363b914c061fa7a86e/wasmtime-40.0.0-py3-none-any.whl", hash = "sha256:b7532706094f768fcab15fa0cf8c57278f7bc2770a32a74b98e3be7db0984e56", size = 6297908, upload-time = "2025-12-22T16:30:27.164Z" }, + { url = "https://files.pythonhosted.org/packages/64/33/10a68779d53557a7d441b40106a7ea0085e9b0af9d82466082cafa890258/wasmtime-40.0.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:e2f374948982a749e5c64de04d1a322ecc79ffd633e0f269c47567c3834c4836", size = 7507846, upload-time = "2025-12-22T16:30:28.312Z" }, + { url = "https://files.pythonhosted.org/packages/2c/5f/ef035900032a5012aad368017abf2a7b626aed38b31e8f35c3266a3a3676/wasmtime-40.0.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fd2d37071c493377b7c4b27e5d1fe2154f4434fbb6af70f1dce9969f287dac62", size = 6533509, upload-time = "2025-12-22T16:30:29.99Z" }, + { url = "https://files.pythonhosted.org/packages/01/bb/8f6dd6a213706a101c7c598609015648fbd82bd34455cabdec300c304d8c/wasmtime-40.0.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:d1ad1be984bea3f2325e67258bc9d6d2d4520cfdbcc3b0ae752c8b4817d0212c", size = 7798564, upload-time = "2025-12-22T16:30:31.649Z" }, + { url = "https://files.pythonhosted.org/packages/a8/d2/d6f1b1f22da240c14bc60459677fbc13cd630260a2c5eac9737dbde63bb5/wasmtime-40.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:3e711b1049ac95f5f34c945b827311c5d382236af5e535a880a26b8861e85aae", size = 6815182, upload-time = "2025-12-22T16:30:33.154Z" }, + { url = "https://files.pythonhosted.org/packages/be/9f/401934f38c6a6559d2be12180793f18c7c726938a1d207fcfc20a8d4091b/wasmtime-40.0.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:504a903099b0518d589db5c17ee6c95b207392c58a272081dc59c33d7000d11f", size = 6893582, upload-time = "2025-12-22T16:30:34.344Z" }, + { url = "https://files.pythonhosted.org/packages/9f/60/c9300d1146f577847aab879ec90d9da3bc7e20f62150386f08adc4aacf41/wasmtime-40.0.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:fee1be5dea191e8350db2e00ff0e57205b9c2d552c6537d736c5c9c75b1470da", size = 7831639, upload-time = "2025-12-22T16:30:35.6Z" }, + { url = "https://files.pythonhosted.org/packages/85/be/2f81a31430f02f57602ae1b4ff0e369b3cbd07c2fcdd0b696b75e9bfc30a/wasmtime-40.0.0-py3-none-win_amd64.whl", hash = "sha256:ebce72e82d1d18726ce3e769094fd8b1d9fc9a1d310cd87c6a85d3ce48fa6567", size = 6297915, upload-time = "2025-12-22T16:30:36.878Z" }, + { url = "https://files.pythonhosted.org/packages/d2/87/35cbfdf9619c958a8b48f2ad083b88abc1521d771bfab668002e4405a1da/wasmtime-40.0.0-py3-none-win_arm64.whl", hash = "sha256:7667966236bba5e80a1c454553e566a1fa700328bc3e65b5ca970bee7e177e57", size = 5398931, upload-time = "2025-12-22T16:30:38.047Z" }, +] From 3d7794974617e4428ccd7fbd3d416ee9f39c2189 Mon Sep 17 00:00:00 2001 From: Sean Hsu Date: Fri, 16 Jan 2026 19:39:40 -0500 Subject: [PATCH 13/21] feat: add protobuf header support for node bindings --- Makefile | 13 +- j2735codec/bindings/node/package.json | 20 +- j2735codec/bindings/node/src/codec.ts | 57 +- .../node/src/protobuf/georoutedmsg.ts | 2 +- j2735codec/bindings/node/tests/codec.test.ts | 116 ++- package-lock.json | 846 ++++++++++++------ package.json | 5 + 7 files changed, 738 insertions(+), 321 deletions(-) diff --git a/Makefile b/Makefile index 5a390db..a6f52c4 100644 --- a/Makefile +++ b/Makefile @@ -159,8 +159,19 @@ install-js: clean-js build-js trap 'rm -rf $$TEMP_DIR' EXIT; \ cd $$TEMP_DIR && $(NPM) init -y > /dev/null; \ $(NPM) install $$FULL_TARBALL_PATH > /dev/null; \ + \ + # 1. Copy the tests themselves cp -r $(PROJECT_ROOT)/$(BINDING_JS)/tests ./tests; \ - if [ -d "$(PROJECT_ROOT)/$(BINDING_JS)/samples" ]; then cp -r $(PROJECT_ROOT)/$(BINDING_JS)/samples ./samples; fi; \ + \ + # 2. Copy the samples from the CORE directory (JER JSONs) + mkdir -p samples; \ + echo "πŸ“‚ Copying JER samples from core for isolation test..."; \ + cp -r $(PROJECT_ROOT)/j2735codec/core/$(J2735_REV)/samples/jer/* ./samples/; \ + \ + # 3. Create a minimal Vitest config to ensure it resolves the installed package correctly + echo "import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { environment: 'node' } });" > vitest.config.ts; \ + \ + # 4. Run the verification echo "$(BOLD)πŸš€ Verifying tarball in isolation...$(RESET)"; \ $(NPM) exec vitest run || exit 1; \ echo "$(GREEN)$(BOLD)βœ… Success: Node Tarball verified.$(RESET)" diff --git a/j2735codec/bindings/node/package.json b/j2735codec/bindings/node/package.json index a88110b..4ef85d7 100644 --- a/j2735codec/bindings/node/package.json +++ b/j2735codec/bindings/node/package.json @@ -6,7 +6,7 @@ "scripts": { "clean": "rimraf dist", "build": "npm run clean && tsc -b tsconfig.build.json && npm run copy-wasm", - "copy-wasm": "copyfiles -u 1 \"src/generated/**/*\" dist/", + "copy-wasm": "mkdir -p dist/generated && cp -r src/generated/* dist/generated/", "test": "vitest run" }, "keywords": [], @@ -18,14 +18,24 @@ }, "devDependencies": { "@types/node": "^25.0.8", - "copyfiles": "^2.4.1", + "cpx2": "^8.0.0", "rimraf": "^6.1.2", "typescript": "^5.9.3", "vitest": "^4.0.17" }, "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + } + }, "files": [ - "dist/src", - "src/wasm" - ] + "dist", + "package.json" + ], + "dependencies": { + "@bufbuild/protobuf": "^2.10.2" + } } diff --git a/j2735codec/bindings/node/src/codec.ts b/j2735codec/bindings/node/src/codec.ts index 2d15bbc..d970837 100644 --- a/j2735codec/bindings/node/src/codec.ts +++ b/j2735codec/bindings/node/src/codec.ts @@ -10,11 +10,18 @@ import { dirname, join } from 'node:path'; import { PDUTypes } from './generated/pdu.js'; import { EncodingRules } from './generated/encodings.js'; +import { GeoRoutedMsg } from './protobuf/georoutedmsg.js'; /** ESM-safe directory resolution */ const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); +export interface GeoRoutedHeader { + lat: number; + lon: number; + timestamp?: Date; +} + /** * Factory function to initialize the V2X Codec WebAssembly module. * * @returns A promise resolving to an initialized V2XCodec instance. @@ -74,6 +81,54 @@ export class V2XCodec { this.exports = wasmInstance.exports; } + /** + * Transcodes a J2735 message and wraps it in a Verizon ETX Protobuf envelope. + */ + public encodeEtx( + buffer: string | Uint8Array, + args: GeoRoutedHeader, + pdu: PDUTypes = PDUTypes.MessageFrame, + inputEncoding: EncodingRules = EncodingRules.JER, + outputEncoding: EncodingRules = EncodingRules.UNALIGNED_BASIC_PER + ): Uint8Array { + let payloadBytes: Uint8Array; + + if (inputEncoding === outputEncoding) { + payloadBytes = typeof buffer === 'string' ? new TextEncoder().encode(buffer) : buffer; + } else { + payloadBytes = this.transcodeJ2735(inputEncoding, outputEncoding, pdu, buffer); + } + + const msg = GeoRoutedMsg.create({ + msgBytes: payloadBytes, + position: { latitude: args.lat, longitude: args.lon }, + time: args.timestamp || new Date() + }); + + return GeoRoutedMsg.encode(msg).finish(); + } + + /** + * Unpacks an ETX Protobuf envelope and decodes the inner J2735 payload. + */ + public decodeEtx( + payload: Uint8Array, + inputEncoding: EncodingRules = EncodingRules.UNALIGNED_BASIC_PER, + outputEncoding: EncodingRules = EncodingRules.JER, + pdu: PDUTypes = PDUTypes.MessageFrame + ): string | Uint8Array { + const envelope = GeoRoutedMsg.decode(payload); + + if (inputEncoding === outputEncoding) { + return envelope.msgBytes; + } + + const result = this.transcodeJ2735(inputEncoding, outputEncoding, pdu, envelope.msgBytes); + + // If output is JER (JSON), return as string, otherwise return bytes + return outputEncoding === EncodingRules.JER ? new TextDecoder().decode(result) : result; + } + /** * Transcodes a buffer between different ASN.1 encoding rules (e.g., UPER to JER). * * @param inEncodingRule - The encoding rule of the input buffer. @@ -83,7 +138,7 @@ export class V2XCodec { * @returns A copy of the transcoded data as a Uint8Array. * @throws {Error} If transcoding fails in the underlying C logic. */ - public transcode( + public transcodeJ2735( inEncodingRule: EncodingRules, outEncodingRule: EncodingRules, pduType: PDUTypes, diff --git a/j2735codec/bindings/node/src/protobuf/georoutedmsg.ts b/j2735codec/bindings/node/src/protobuf/georoutedmsg.ts index 46fa5dc..2bf30cf 100644 --- a/j2735codec/bindings/node/src/protobuf/georoutedmsg.ts +++ b/j2735codec/bindings/node/src/protobuf/georoutedmsg.ts @@ -6,7 +6,7 @@ /* eslint-disable */ import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; -import { Timestamp } from "./google/protobuf/timestamp"; +import { Timestamp } from "./google/protobuf/timestamp.js"; export const protobufPackage = "georoutedmsg"; diff --git a/j2735codec/bindings/node/tests/codec.test.ts b/j2735codec/bindings/node/tests/codec.test.ts index 961b15c..a1de5f9 100644 --- a/j2735codec/bindings/node/tests/codec.test.ts +++ b/j2735codec/bindings/node/tests/codec.test.ts @@ -1,38 +1,38 @@ import { describe, it, expect, beforeAll } from 'vitest'; import { existsSync, readdirSync, readFileSync } from 'node:fs'; -import { fileURLToPath } from 'node:url'; -import { dirname, join } from 'node:path'; -import { createV2XCodec, V2XCodec, EncodingRules, PDUTypes } from 'j2735codec'; +import { join } from 'node:path'; +import { + V2XCodec, + GeoRoutedHeader, + createV2XCodec, + EncodingRules, + PDUTypes, +} from 'j2735codec'; -describe('V2X Codec 202409 Integration Tests', () => { +describe('V2X Codec Comprehensive Coverage', () => { let codec: V2XCodec; - // Define sample paths relative to this test file - const __filename = fileURLToPath(import.meta.url); - const __dirname = dirname(__filename); - - const sampleDir = join(__dirname, '../../../core/j2735_202409/samples/jer'); + const sampleDir = existsSync("./samples") + ? "./samples" + : "../../core/j2735_202409/samples/jer"; beforeAll(async () => { - // Ensure samples exist before starting if (!existsSync(sampleDir)) { - console.error(`❌ Sample directory missing: ${sampleDir}`); - throw new Error(`ENOENT: Check j2735codec/bindings/node/samples/j2735_202409/json`); + throw new Error(`❌ Sample directory missing: ${sampleDir}`); } - - // Initialize the WASM codec once - codec = await createV2XCodec(); + // Initialize the WASM codec + codec = await createV2XCodec() }); - // Get all JSON samples from the 202409 revision const messageFiles = readdirSync(sampleDir).filter(f => f.endsWith('.json')); - it.each(messageFiles)('should round-trip transcode 202409 sample: %s', (fileName) => { - const filePath = join(sampleDir, fileName); - const originalContent = readFileSync(filePath, "utf8"); + /** + * Test 1: Standard Round-Trip (JER -> UPER -> JER) + */ + it.each(messageFiles)('should round-trip transcode: %s', (fileName) => { + const originalContent = readFileSync(join(sampleDir, fileName), "utf8"); - // 1. JER (JSON) -> UPER (Binary) - const encoded = codec.transcode( + const encoded = codec.transcodeJ2735( EncodingRules.JER, EncodingRules.UNALIGNED_BASIC_PER, PDUTypes.MessageFrame, @@ -42,8 +42,7 @@ describe('V2X Codec 202409 Integration Tests', () => { expect(encoded).toBeInstanceOf(Uint8Array); expect(encoded.length).toBeGreaterThan(0); - // 2. UPER (Binary) -> JER (JSON) - const decoded = codec.transcode( + const decoded = codec.transcodeJ2735( EncodingRules.UNALIGNED_BASIC_PER, EncodingRules.JER, PDUTypes.MessageFrame, @@ -51,12 +50,75 @@ describe('V2X Codec 202409 Integration Tests', () => { ); const decodedStr = new TextDecoder().decode(decoded); - expect(decodedStr.length).toBeGreaterThan(0); - - // Final Verification const json = JSON.parse(decodedStr); expect(json).toBeDefined(); - // 202409 specific check: Ensure MessageFrame wrapper exists expect(json).toHaveProperty('messageId'); }); + + /** + * Test 2: ETX Protobuf Envelope (encodeETX -> decodeETX) + */ + it('should correctly wrap and unwrap ETX Protobuf envelopes', () => { + const fileName = messageFiles[0]; + const originalContent = readFileSync(join(sampleDir, fileName), "utf8"); + + const header: GeoRoutedHeader = { + lat: 34.0522, + lon: -118.2437, + timestamp: new Date() + }; + + // Wrap into Protobuf + const etxBlob = codec.encodeEtx( + originalContent, + header, + PDUTypes.MessageFrame, + EncodingRules.JER, + EncodingRules.UNALIGNED_BASIC_PER + ); + + expect(etxBlob).toBeInstanceOf(Uint8Array); + + // Unwrap and transcode back to JSON + const result = codec.decodeEtx( + etxBlob, + EncodingRules.UNALIGNED_BASIC_PER, + EncodingRules.JER, + PDUTypes.MessageFrame + ); + + const decodedStr = typeof result === 'string' ? result : new TextDecoder().decode(result); + const json = JSON.parse(decodedStr); + expect(json).toHaveProperty('messageId'); + }); + + /** + * Test 3: WASM Memory Stability (Leak Check) + * This mirrors the Python memory check by monitoring the underlying + * WebAssembly.Memory buffer size over 100 iterations. + */ + it('should maintain stable WASM memory over multiple iterations', () => { + const fileName = messageFiles[0]; + const content = readFileSync(join(sampleDir, fileName), "utf8"); + + // Accessing the private memory for the check (cast as any for test) + const getMemSize = () => (codec as any).memory.buffer.byteLength; + + const initialMemory = getMemSize(); + + for (let i = 0; i < 100; i++) { + codec.transcodeJ2735( + EncodingRules.JER, + EncodingRules.UNALIGNED_BASIC_PER, + PDUTypes.MessageFrame, + content + ); + } + + const finalMemory = getMemSize(); + + // The memory might grow once to fit a large message, but it shouldn't + // grow continuously (linearly) if free() is working correctly. + expect(finalMemory).toBeLessThanOrEqual(initialMemory * 2); + }); }); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 25dfd99..a66bcf8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,15 +9,23 @@ "version": "0.2.0", "workspaces": [ "j2735codec/bindings/node" - ] + ], + "devDependencies": { + "rimraf": "^6.1.2", + "typescript": "^5.9.3", + "vitest": "^4.0.17" + } }, "j2735codec/bindings/node": { "name": "j2735codec", "version": "0.2.0", "license": "Apache-2.0", + "dependencies": { + "@bufbuild/protobuf": "^2.10.2" + }, "devDependencies": { "@types/node": "^25.0.8", - "copyfiles": "^2.4.1", + "cpx2": "^8.0.0", "rimraf": "^6.1.2", "typescript": "^5.9.3", "vitest": "^4.0.17" @@ -26,6 +34,12 @@ "node": ">=22.0.0" } }, + "node_modules/@bufbuild/protobuf": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.10.2.tgz", + "integrity": "sha512-uFsRXwIGyu+r6AMdz+XijIIZJYpoWeYzILt5yZ2d3mCjQrWUTVpVD9WL/jZAbvp+Ed04rOhrsk7FiTcEDseB5A==", + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", @@ -491,6 +505,24 @@ "node": "20 || >=22" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", @@ -1002,26 +1034,26 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" @@ -1037,24 +1069,6 @@ "node": ">=12" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/chai": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", @@ -1065,18 +1079,6 @@ "node": ">=18" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1097,44 +1099,99 @@ "dev": true, "license": "MIT" }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "node_modules/cpx2": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cpx2/-/cpx2-8.0.0.tgz", + "integrity": "sha512-RxD9jrSVNSOmfcbiPlr3XnKbUKH9K1w2HCv0skczUKhsZTueiDBecxuaSAKQkYSLQaGVA4ZQJZlTj5hVNNEvKg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "debounce": "^2.0.0", + "debug": "^4.1.1", + "duplexer": "^0.1.1", + "fs-extra": "^11.1.0", + "glob": "^11.0.0", + "glob2base": "0.0.12", + "ignore": "^6.0.2", + "minimatch": "^10.0.1", + "p-map": "^7.0.0", + "resolve": "^1.12.0", + "safe-buffer": "^5.2.0", + "shell-quote": "^1.8.0", + "subarg": "^1.0.0" + }, + "bin": { + "cpx": "bin/index.js" + }, + "engines": { + "node": "^20.0.0 || >=22.0.0", + "npm": ">=10" + } }, - "node_modules/copyfiles": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", - "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { - "glob": "^7.0.5", - "minimatch": "^3.0.3", - "mkdirp": "^1.0.4", - "noms": "0.0.0", - "through2": "^2.0.1", - "untildify": "^4.0.0", - "yargs": "^16.1.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "bin": { - "copyfiles": "copyfiles", - "copyup": "copyfiles" + "engines": { + "node": ">= 8" + } + }, + "node_modules/debounce": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-2.2.0.tgz", + "integrity": "sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, "license": "MIT" }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, "license": "MIT" }, @@ -1187,16 +1244,6 @@ "@esbuild/win32-x64": "0.27.2" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -1235,12 +1282,44 @@ } } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "node_modules/find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha512-uJ5vWrfBKMcE6y2Z8834dwEZj9mNGxYa3t3I53OwFeuZ8D9oc2E5zcsrkuhX6h4iYrjhiv0T3szQmxlAV9uxDg==", "dev": true, - "license": "ISC" + "license": "MIT" + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs-extra": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } }, "node_modules/fsevents": { "version": "2.3.3", @@ -1257,57 +1336,98 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", + "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "node_modules/glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha512-ZyqlgowMbfj2NPjxaZZ/EtsXlOch28FRXgMd64vqZWk1bT9+wvSRLYD1om9M7QfQru51zJPAT17qXm4/zd+9QA==", "dev": true, - "license": "ISC", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "find-index": "^0.1.1" + }, + "engines": { + "node": ">= 0.10" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "license": "ISC" }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", + "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -1318,17 +1438,46 @@ "node": ">=8" } }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, - "license": "MIT" + "license": "ISC" }, "node_modules/j2735codec": { "resolved": "j2735codec/bindings/node", "link": true }, + "node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/lru-cache": { "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", @@ -1350,16 +1499,29 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^1.1.7" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": "*" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minipass": { @@ -1372,18 +1534,12 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } + "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", @@ -1404,17 +1560,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/noms": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", - "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==", - "dev": true, - "license": "ISC", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "~1.0.31" - } - }, "node_modules/obug": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", @@ -1426,14 +1571,17 @@ ], "license": "MIT" }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/p-map": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/package-json-from-dist": { @@ -1443,16 +1591,23 @@ "dev": true, "license": "BlueOak-1.0.0" }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, "node_modules/path-scurry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", @@ -1526,34 +1681,25 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/rimraf": { @@ -1594,22 +1740,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/rollup": { "version": "4.55.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", @@ -1656,12 +1786,62 @@ } }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT" }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -1669,6 +1849,19 @@ "dev": true, "license": "ISC" }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -1693,14 +1886,26 @@ "dev": true, "license": "MIT" }, - "node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/string-width": { + "node_modules/string-width-cjs": { + "name": "string-width", "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", @@ -1715,7 +1920,24 @@ "node": ">=8" } }, - "node_modules/strip-ansi": { + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", @@ -1728,48 +1950,67 @@ "node": ">=8" } }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/through2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "engines": { + "node": ">=8" } }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "minimist": "^1.1.0" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/tinybench": { @@ -1837,23 +2078,16 @@ "dev": true, "license": "MIT" }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 10.0.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, "node_modules/vite": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", @@ -2007,6 +2241,22 @@ } } }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/why-is-node-running": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", @@ -2025,6 +2275,25 @@ } }, "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", @@ -2042,60 +2311,65 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.4" + "node": ">=8" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">=10" + "node": ">=8" } } } diff --git a/package.json b/package.json index 93d2f79..85d26b8 100644 --- a/package.json +++ b/package.json @@ -12,5 +12,10 @@ "build:all": "make wasm && npm run build --workspaces", "test:all": "npm test --workspaces", "clean": "make purge" + }, + "devDependencies": { + "rimraf": "^6.1.2", + "typescript": "^5.9.3", + "vitest": "^4.0.17" } } From 01c723bb5d99d0ee6b9ee73edbf292ad44a48511 Mon Sep 17 00:00:00 2001 From: Sean Hsu Date: Fri, 16 Jan 2026 20:07:02 -0500 Subject: [PATCH 14/21] ci: fix missing protobuf folder error - Rename J2735Codec to V2XCodec for python bindings. --- .github/workflows/ci-release.yml | 61 +++++++++++-------- .../python/src/j2735codec/__init__.py | 4 +- .../bindings/python/src/j2735codec/codec.py | 8 +-- .../bindings/python/tests/test_codec.py | 4 +- 4 files changed, 42 insertions(+), 35 deletions(-) diff --git a/.github/workflows/ci-release.yml b/.github/workflows/ci-release.yml index ad763dd..97f7119 100644 --- a/.github/workflows/ci-release.yml +++ b/.github/workflows/ci-release.yml @@ -42,13 +42,18 @@ jobs: run: | source emsdk/emsdk_env.sh make wasm + # Create __init__.py files before uploading to ensure Python recognizes them + touch j2735codec/bindings/python/src/j2735codec/generated/__init__.py + touch j2735codec/bindings/python/src/j2735codec/protobuf/__init__.py + - name: Upload Python Artifacts uses: actions/upload-artifact@v4 with: name: python-wasm-binaries - path: | - j2735codec/bindings/python/src/j2735codec/generated/ - j2735codec/bindings/python/src/j2735codec/protobuf/ + # Capture the whole package folder to preserve 'generated' and 'protobuf' hierarchy + path: j2735codec/bindings/python/src/j2735codec/ + include-hidden-files: true + - name: Upload Node Artifacts uses: actions/upload-artifact@v4 with: @@ -65,16 +70,35 @@ jobs: binding: [python, node] steps: - uses: actions/checkout@v4 - - uses: actions/download-artifact@v4 + + - name: Download Artifacts + uses: actions/download-artifact@v4 with: name: ${{ matrix.binding }}-wasm-binaries - path: j2735codec/bindings/${{ matrix.binding }}/${{ matrix.binding == 'python' && 'src/j2735codec/generated/' || 'src/generated/' }} + # For Python, we download into the package root to populate generated/ and protobuf/ + path: j2735codec/bindings/${{ matrix.binding }}/${{ matrix.binding == 'python' && 'src/j2735codec/' || 'src/generated/' }} + + - name: Repair and Verify Structure + run: | + if [ "${{ matrix.binding }}" == "python" ]; then + cd j2735codec/bindings/python/src/j2735codec + touch __init__.py generated/__init__.py protobuf/__init__.py + echo "πŸ” Verifying Python Structure:" + ls -R + fi + - name: Setup & Test run: | if [ "${{ matrix.binding }}" == "python" ]; then - pip install uv && cd j2735codec/bindings/python && uv sync && uv run pytest + pip install uv + cd j2735codec/bindings/python + # --reinstall-package is vital to ensure uv doesn't use a cached version without the new files + uv sync --reinstall-package j2735codec + uv run pytest tests -s else - npm install && npm run build -w j2735codec && npm test -w j2735codec + npm install + npm run build -w j2735codec + npm test -w j2735codec fi publish-release: @@ -94,18 +118,15 @@ jobs: - name: Build & Stage Assets run: | - # 1. Create a clean staging area at the ROOT STAGING="$GITHUB_WORKSPACE/dist_release" mkdir -p $STAGING # 2. Build Python PY_DIR="$GITHUB_WORKSPACE/j2735codec/bindings/python" - mkdir -p $PY_DIR/src/j2735codec/generated/ - cp -R artifacts/python-wasm-binaries/* $PY_DIR/src/j2735codec/generated/ + # Restore the hierarchy from artifacts + cp -R artifacts/python-wasm-binaries/* $PY_DIR/src/j2735codec/ pip install uv cd $PY_DIR && uv build --out-dir ./dist_local - - # Use find to move and prefix files safely find ./dist_local -type f -exec bash -c 'cp "$1" "'$STAGING'/python-$(basename "$1")"' _ {} \; # 3. Build Node @@ -116,32 +137,18 @@ jobs: npm install npm run build -w j2735codec cd $JS_DIR && npm pack - - # Move and prefix node tarball find . -maxdepth 1 -name "*.tgz" -exec bash -c 'cp "$1" "'$STAGING'/node-$(basename "$1")"' _ {} \; # 4. Grab Raw WASM Binary - cp $GITHUB_WORKSPACE/artifacts/python-wasm-binaries/j2735codec.wasm $STAGING/j2735codec.wasm + cp artifacts/python-wasm-binaries/generated/j2735codec.wasm $STAGING/j2735codec.wasm # 5. Legal cp $GITHUB_WORKSPACE/LICENSE $STAGING/ cp $GITHUB_WORKSPACE/NOTICE $STAGING/ - - name: Verify Staging Contents - run: | - echo "Listing files to be uploaded:" - ls -lh dist_release/ - if [ $(ls dist_release/ | wc -l) -eq 0 ]; then echo "EMPTY STAGING FOLDER" && exit 1; fi - - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: name: "Release ${{ github.ref_name }}" - body: | - ## J2735 Codec Release ${{ github.ref_name }} - - **python-***: Python Wheel & Source Dist - - **node-***: Node.js Tarball - - **j2735codec.wasm**: Standalone WASM engine - prerelease: ${{ contains(github.ref_name, 'test') || contains(github.ref_name, 'alpha') || contains(github.ref_name, 'beta') }} files: dist_release/* generate_release_notes: true \ No newline at end of file diff --git a/j2735codec/bindings/python/src/j2735codec/__init__.py b/j2735codec/bindings/python/src/j2735codec/__init__.py index 0729e01..dc108bc 100644 --- a/j2735codec/bindings/python/src/j2735codec/__init__.py +++ b/j2735codec/bindings/python/src/j2735codec/__init__.py @@ -1,5 +1,5 @@ -from j2735codec.codec import J2735Codec, GeoRoutedHeader +from j2735codec.codec import V2XCodec, GeoRoutedHeader from j2735codec.generated.encodings import EncodingRules from j2735codec.generated.pdu import PDUTypes -__all__ = ["EncodingRules", "PDUTypes", "J2735Codec", "GeoRoutedHeader"] \ No newline at end of file +__all__ = ["EncodingRules", "PDUTypes", "V2XCodec", "GeoRoutedHeader"] \ No newline at end of file diff --git a/j2735codec/bindings/python/src/j2735codec/codec.py b/j2735codec/bindings/python/src/j2735codec/codec.py index cb033e7..804170c 100644 --- a/j2735codec/bindings/python/src/j2735codec/codec.py +++ b/j2735codec/bindings/python/src/j2735codec/codec.py @@ -37,7 +37,7 @@ class GeoRoutedHeader: lon: float timestamp: Optional[datetime] = None -class J2735Codec: +class V2XCodec: """ Represents a V2X codec for transcoding data between encodings. @@ -188,7 +188,7 @@ def transcode_j2735( # Allocate memory for the output pointer (void**) out_buffer_ptr = self._malloc( self._store, - J2735Codec.WASM_POINTER_SIZE) + V2XCodec.WASM_POINTER_SIZE) if not out_buffer_ptr: self._free(self._store, in_buffer_wasm) # Cleanup raise RuntimeError("Failed to allocate output pointer WASM memory.") @@ -218,10 +218,10 @@ def transcode_j2735( view_after = self._memory.data_ptr(self._store) # Read the bytes representing the address - ptr_bytes = bytes(view_after[out_buffer_ptr : out_buffer_ptr + J2735Codec.WASM_POINTER_SIZE]) + ptr_bytes = bytes(view_after[out_buffer_ptr : out_buffer_ptr + V2XCodec.WASM_POINTER_SIZE]) # Unpack those bytes to get the integer address of the actual output buffer - pointer_format = " Date: Fri, 16 Jan 2026 20:53:46 -0500 Subject: [PATCH 15/21] build: fix install-js build artifacts --- Makefile | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index a6f52c4..6f8890b 100644 --- a/Makefile +++ b/Makefile @@ -156,24 +156,19 @@ install-js: clean-js build-js @TARBALL_PATH=$$(ls $(BINDING_JS)/*.tgz | head -n 1); \ FULL_TARBALL_PATH=$$(pwd)/$$TARBALL_PATH; \ TEMP_DIR=$$(mktemp -d); \ - trap 'rm -rf $$TEMP_DIR' EXIT; \ - cd $$TEMP_DIR && $(NPM) init -y > /dev/null; \ - $(NPM) install $$FULL_TARBALL_PATH > /dev/null; \ - \ - # 1. Copy the tests themselves - cp -r $(PROJECT_ROOT)/$(BINDING_JS)/tests ./tests; \ - \ - # 2. Copy the samples from the CORE directory (JER JSONs) - mkdir -p samples; \ - echo "πŸ“‚ Copying JER samples from core for isolation test..."; \ - cp -r $(PROJECT_ROOT)/j2735codec/core/$(J2735_REV)/samples/jer/* ./samples/; \ - \ - # 3. Create a minimal Vitest config to ensure it resolves the installed package correctly - echo "import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { environment: 'node' } });" > vitest.config.ts; \ - \ - # 4. Run the verification - echo "$(BOLD)πŸš€ Verifying tarball in isolation...$(RESET)"; \ - $(NPM) exec vitest run || exit 1; \ + echo "Temp Test Directory: $$TEMP_DIR"; \ + ( \ + cd $$TEMP_DIR && \ + $(NPM) init -y > /dev/null && \ + echo "πŸ“¦ Installing tarball..." && \ + $(NPM) install $$FULL_TARBALL_PATH > /dev/null && \ + cp -r $(PROJECT_ROOT)/$(BINDING_JS)/tests ./tests && \ + mkdir -p samples && \ + cp -r $(PROJECT_ROOT)/j2735codec/core/$(J2735_REV)/samples/jer/* ./samples/ && \ + echo "$(BOLD)πŸš€ Verifying tarball in isolation...$(RESET)" && \ + $(NPM) exec vitest run -- --environment node --dir ./tests \ + ) || (rm -rf $$TEMP_DIR && exit 1); \ + rm -rf $$TEMP_DIR; \ echo "$(GREEN)$(BOLD)βœ… Success: Node Tarball verified.$(RESET)" # --- C++ / WASM Logic --- From 4c075cefaa38b4e5205969bd2f32df52208b198e Mon Sep 17 00:00:00 2001 From: Sean Hsu Date: Sun, 18 Jan 2026 14:13:22 -0500 Subject: [PATCH 16/21] feat: add sample code for python - Add registration and deregistration examples. - Add vehicle, speed monitor and loopback examples. - Add CI support to release examples. - Update documentation for python examples. --- .github/workflows/ci-release.yml | 91 +++- .gitignore | 2 + Makefile | 23 +- README.md | 200 ++++++--- etx/README.md | 123 ++++++ etx/docs/DEBUGGING.md | 415 ++++++++++++++++++ etx/examples/python/README.md | 236 ++++++++++ etx/examples/python/config.json.example | 25 ++ etx/examples/python/pyproject.toml | 40 ++ .../src/examples/0_registration_example.py | 101 +++++ .../src/examples/1_deregistration_example.py | 66 +++ .../python/src/examples/2_loopback_example.py | 238 ++++++++++ .../python/src/examples/3_speedmon_example.py | 203 +++++++++ .../python/src/examples/4_vehicle_example.py | 226 ++++++++++ etx/examples/python/src/examples/__init__.py | 0 .../python/src/examples/utils/__init__.py | 0 .../python/src/examples/utils/client.py | 226 ++++++++++ .../python/src/examples/utils/config.py | 139 ++++++ .../python/src/examples/utils/logger.py | 55 +++ .../python/src/examples/utils/message.py | 172 ++++++++ .../python/src/examples/utils/mqtt.py | 249 +++++++++++ .../python/src/examples/utils/oauth.py | 99 +++++ .../python/src/examples/utils/parser.py | 83 ++++ .../python/src/examples/utils/registration.py | 272 ++++++++++++ etx/proto/georoutedmsg.proto | 15 + j2735codec/bindings/python/pyproject.toml | 11 +- .../python/src/j2735codec/__init__.py | 6 +- .../bindings/python/src/j2735codec/codec.py | 14 +- .../bindings/python/tests/test_codec.py | 4 +- pyproject.toml | 5 +- uv.lock | 197 +++++++++ 31 files changed, 3422 insertions(+), 114 deletions(-) create mode 100644 etx/README.md create mode 100644 etx/docs/DEBUGGING.md create mode 100644 etx/examples/python/README.md create mode 100644 etx/examples/python/config.json.example create mode 100644 etx/examples/python/pyproject.toml create mode 100644 etx/examples/python/src/examples/0_registration_example.py create mode 100644 etx/examples/python/src/examples/1_deregistration_example.py create mode 100644 etx/examples/python/src/examples/2_loopback_example.py create mode 100644 etx/examples/python/src/examples/3_speedmon_example.py create mode 100644 etx/examples/python/src/examples/4_vehicle_example.py create mode 100644 etx/examples/python/src/examples/__init__.py create mode 100644 etx/examples/python/src/examples/utils/__init__.py create mode 100644 etx/examples/python/src/examples/utils/client.py create mode 100644 etx/examples/python/src/examples/utils/config.py create mode 100644 etx/examples/python/src/examples/utils/logger.py create mode 100644 etx/examples/python/src/examples/utils/message.py create mode 100644 etx/examples/python/src/examples/utils/mqtt.py create mode 100644 etx/examples/python/src/examples/utils/oauth.py create mode 100644 etx/examples/python/src/examples/utils/parser.py create mode 100644 etx/examples/python/src/examples/utils/registration.py create mode 100644 etx/proto/georoutedmsg.proto diff --git a/.github/workflows/ci-release.yml b/.github/workflows/ci-release.yml index 97f7119..f851f44 100644 --- a/.github/workflows/ci-release.yml +++ b/.github/workflows/ci-release.yml @@ -42,7 +42,7 @@ jobs: run: | source emsdk/emsdk_env.sh make wasm - # Create __init__.py files before uploading to ensure Python recognizes them + # Create __init__.py files touch j2735codec/bindings/python/src/j2735codec/generated/__init__.py touch j2735codec/bindings/python/src/j2735codec/protobuf/__init__.py @@ -50,7 +50,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: python-wasm-binaries - # Capture the whole package folder to preserve 'generated' and 'protobuf' hierarchy + # Use the parent directory to ensure the j2735codec folder structure is preserved path: j2735codec/bindings/python/src/j2735codec/ include-hidden-files: true @@ -75,7 +75,6 @@ jobs: uses: actions/download-artifact@v4 with: name: ${{ matrix.binding }}-wasm-binaries - # For Python, we download into the package root to populate generated/ and protobuf/ path: j2735codec/bindings/${{ matrix.binding }}/${{ matrix.binding == 'python' && 'src/j2735codec/' || 'src/generated/' }} - name: Repair and Verify Structure @@ -92,7 +91,6 @@ jobs: if [ "${{ matrix.binding }}" == "python" ]; then pip install uv cd j2735codec/bindings/python - # --reinstall-package is vital to ensure uv doesn't use a cached version without the new files uv sync --reinstall-package j2735codec uv run pytest tests -s else @@ -119,32 +117,77 @@ jobs: - name: Build & Stage Assets run: | STAGING="$GITHUB_WORKSPACE/dist_release" - mkdir -p $STAGING + mkdir -p "$STAGING" + VERSION=$(cat VERSION) + + # --- 2. Build Python Bindings --- + PY_DIR="j2735codec/bindings/python" + + # Clean and Recreate Structure + mkdir -p "$PY_DIR/src/j2735codec/generated" + mkdir -p "$PY_DIR/src/j2735codec/protobuf" + + # Copy artifacts - using '.' to ensure we copy contents into the pre-made folders + cp -a artifacts/python-wasm-binaries/. "$PY_DIR/src/j2735codec/" + + # RE-INJECT Package Markers (Vital for Wheel packaging) + touch "$PY_DIR/src/j2735codec/__init__.py" + touch "$PY_DIR/src/j2735codec/generated/__init__.py" + touch "$PY_DIR/src/j2735codec/protobuf/__init__.py" + + # Debug: Log the tree to the console so we can see what's happening + echo "πŸ“‚ Final Python Build Tree:" + ls -R "$PY_DIR/src/j2735codec/" + + cp LICENSE "$PY_DIR/" + cp NOTICE "$PY_DIR/" - # 2. Build Python - PY_DIR="$GITHUB_WORKSPACE/j2735codec/bindings/python" - # Restore the hierarchy from artifacts - cp -R artifacts/python-wasm-binaries/* $PY_DIR/src/j2735codec/ pip install uv - cd $PY_DIR && uv build --out-dir ./dist_local - find ./dist_local -type f -exec bash -c 'cp "$1" "'$STAGING'/python-$(basename "$1")"' _ {} \; - - # 3. Build Node - cd $GITHUB_WORKSPACE - JS_DIR="$GITHUB_WORKSPACE/j2735codec/bindings/node" - mkdir -p $JS_DIR/src/generated/ - cp -R artifacts/node-wasm-binaries/* $JS_DIR/src/generated/ + cd "$PY_DIR" + uv build --wheel --out-dir ./dist_local + + # Verify Wheel Contents before moving (Security Check) + WHL_FILE=$(ls ./dist_local/*.whl) + if ! unzip -l "$WHL_FILE" | grep -q "j2735codec/generated/j2735codec.wasm"; then + echo "::error::WASM file missing from generated wheel!" + exit 1 + fi + + for f in ./dist_local/*; do cp "$f" "$STAGING/$(basename $f)"; done + cd "$GITHUB_WORKSPACE" + + # --- 3. Build Node Bindings --- + JS_DIR="j2735codec/bindings/node" + mkdir -p "$JS_DIR/src/generated/" + cp -a artifacts/node-wasm-binaries/. "$JS_DIR/src/generated/" + cp LICENSE "$JS_DIR/" + cp NOTICE "$JS_DIR/" npm install npm run build -w j2735codec - cd $JS_DIR && npm pack - find . -maxdepth 1 -name "*.tgz" -exec bash -c 'cp "$1" "'$STAGING'/node-$(basename "$1")"' _ {} \; + cd "$JS_DIR" && npm pack + for f in *.tgz; do cp "$f" "$STAGING/$f"; done + cd "$GITHUB_WORKSPACE" + + # --- 4. Package Python Samples --- + SAMPLE_DIR="etx/examples/python" + if [ -d "$SAMPLE_DIR" ]; then + cp LICENSE "$SAMPLE_DIR/" + cp NOTICE "$SAMPLE_DIR/" + cd "$SAMPLE_DIR" + ZIP_NAME="python-etx-samples-$VERSION.zip" + zip -r "$STAGING/$ZIP_NAME" . \ + -x "*config.json" -x "*/.venv/*" -x "*.venv*" -x "*/.env*" -x "*/__pycache__/*" + cd "$GITHUB_WORKSPACE" + fi - # 4. Grab Raw WASM Binary - cp artifacts/python-wasm-binaries/generated/j2735codec.wasm $STAGING/j2735codec.wasm + # --- 5. Finalize Staging --- + cp "$PY_DIR/src/j2735codec/generated/j2735codec.wasm" "$STAGING/j2735codec-$VERSION.wasm" + cp LICENSE "$STAGING/" + cp NOTICE "$STAGING/" - # 5. Legal - cp $GITHUB_WORKSPACE/LICENSE $STAGING/ - cp $GITHUB_WORKSPACE/NOTICE $STAGING/ + # Cleanup + find "$STAGING" -name "default.gitignore" -delete + find "$STAGING" -name ".*" -not -name "." -delete - name: Create GitHub Release uses: softprops/action-gh-release@v2 diff --git a/.gitignore b/.gitignore index 2ae2811..d8c8ff9 100644 --- a/.gitignore +++ b/.gitignore @@ -81,5 +81,7 @@ yarn-error.log* .env.*.local logs/ *.log +config.json +certs/ # ============================================================================= \ No newline at end of file diff --git a/Makefile b/Makefile index 6f8890b..839cda5 100644 --- a/Makefile +++ b/Makefile @@ -45,6 +45,8 @@ JS_DIST_DIR = $(BINDING_JS)/dist J2735_REV ?= j2735_202409 THREADS ?= $(shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4) + +SAMPLE_PY = etx/examples/python VERSION ?= $(shell cat VERSION 2>/dev/null || echo "0.1.0") # --- Targets --- @@ -183,12 +185,19 @@ wasm: purge: uninstall-py clean-py clean-js @echo "πŸ”₯ Hard purging all artifacts and lockfiles..." - rm -rf $(BUILD_DIR_NATIVE) $(BUILD_DIR_WASM) .venv node_modules - rm -f uv.lock package-lock.json - find . -type d -name "build" -not -path "*/emsdk/*" -exec rm -rf {} + + # 1. Remove specific known directories + rm -rf $(BUILD_DIR_NATIVE) $(BUILD_DIR_WASM) node_modules $(DIST_DIR) rm -rf $(BINDING_PY)/src/j2735codec/generated rm -rf $(BINDING_JS)/src/generated - rm -rf $(DIST_DIR) + + # 2. Find and remove all .venv directories in the project + find . -type d -name ".venv" -exec rm -rf {} + + + # 3. Find and remove other common python artifacts + find . -type d -name "build" -not -path "*/emsdk/*" -exec rm -rf {} + + find . -type d -name "*.egg-info" -exec rm -rf {} + + find . -type d -name ".pytest_cache" -exec rm -rf {} + + @echo "✨ Purged. Use 'make setup' to recreate environment." # --- Versioning Logic --- @@ -203,4 +212,8 @@ sync-version: @# Update Python manifests @perl -i -pe 's/^version\s*=\s*"[0-9.]*"/version = "$(VERSION)"/m' pyproject.toml @perl -i -pe 's/^version\s*=\s*"[0-9.]*"/version = "$(VERSION)"/m' $(BINDING_PY)/pyproject.toml - @echo "βœ… Version $(VERSION) synced." \ No newline at end of file + + @# Update Sample Python (etx-samples/python/pyproject.toml) + @perl -i -pe 's/^version\s*=\s*"[0-9.]*"/version = "$(VERSION)"/m' $(SAMPLE_PY)/pyproject.toml + + @echo "βœ… Version $(VERSION) synced across 4 manifests and CMake." \ No newline at end of file diff --git a/README.md b/README.md index c05dcc7..64b7850 100644 --- a/README.md +++ b/README.md @@ -4,16 +4,28 @@ The official onboarding resource for Verizon ETX. This kit is designed to accelerate development by providing reference implementations and a high-performance V2X codec. +## πŸ›£οΈ What is ETX? + +The Edge Transportation Exchange (ETX) is a centralized, high-performance MQTT message exchange designed to facilitate real-time V2X (Vehicle-to-Everything) communications across the transportation ecosystem. **[Learn More](etx/)** + +## Getting Started + +Navigate to the ***[examples](etx/examples/)*** directory or select from the following links to get started: + +#### **🐍 [Python](etx/examples/python/)**     **🟒 [Node](etx/examples/node/)** + + ## πŸš€ Key Features + * **Get Started Quicker:** Sample code and onboarding guides to help you build on ETX immediately. -* **Latest J2735 Standard:** Built from the [SAE J2735_202409 ASN.1 definitions](https://www.sae.org/standards/j2735asn_202409-v2x-communications-message-set-dictionary-asn-file). -* **Dual Encoding:** Full support for **UPER** (Unaligned Packed Encoding Rules) and **JER** (JSON Encoding Rules). -* **WASM Core:** The C++ codec source is compiled into a `.wasm` binary for universal compatibility across Python and Node.js. +* **Latest J2735 Standard:** Built from the [SAE J2735_202409 ASN.1 definitions](https://www.sae.org/standards/.j2735asn_202409-v2x-communications-message-set-dictionary-asn-file). +* **Codec Support:** Full support for encoding and decoding J2735 message into various formats for Python and Node. -The project is composed of two components: +This project is composed of two components: + +- **ETX sample code** to help developers get started. +- **WASM binary & runtime bindings** for the J2735 codec to help accelerate your development on different languages. -- ETX sample code to help developers get started. -- WASM binary bindings for the J2735 codec to help accelerate your development on Python and Node. ## πŸ“‚ Project Structure @@ -25,7 +37,7 @@ The project is composed of two components: β”‚ β”‚ β”œβ”€β”€ python/ # Python package (uv managed) β”‚ β”‚ └── node/ # Node.js package (npm workspace) β”‚ └── dist/ # Build artifacts (native & wasm) -β”œβ”€β”€ samples/ # ETX code samples +β”œβ”€β”€ etx/ # ETX code samples and resources β”œβ”€β”€ VERSION # Single source of truth for project versioning β”œβ”€β”€ Makefile # The central command hub └── LICENSE # Apache-2.0 @@ -33,15 +45,19 @@ The project is composed of two components: --- -## ETX Sample Code +## The J2735 Codec -(Content for ETX samples goes here.) +The J2735 codec is responsible for transforming V2X messages into a standardized form for consumption amongst various parties. This codec is based on [C/C++ codebase generated](j2735codec/core/) from [ASN.1 compiler](https://github.com/mouse07410/asn1c). ---- +In order to provide a better onboarding experience, the native codebase is transformed into WebAssembly (WASM) in the project to provide a safe, fast, and portable codec for Python, Node, and other modern runtimes. A very thin layer of wrapper code sits on top of the WebAssembly to help facilitate the interaction with the WebAssembly. This makes the encoding and decoding process between the different message format eaiser for the developers. These two components form the basis of the codec. -## J2735 Codec +**⚠️WARNING⚠️ : WebAssembly is not thread-safe; ensure there is no concurrent access to the codec library. Instead of sharing a single resource via threads or async tasks, always create separate, isolated instances.** -A cross-platform implementation of the **SAE J2735 (202409)** V2X standard. This project compiles a C++ code generated from [ASN.1 compiler](https://github.com/vlm/asn1c) into WebAssembly (WASM) to provide a safe, fast, and portable codec for Python, Node, and other modern runtimes. +**Note:** The original C/C++ code is also provided in the project. Compiling the source code into a [C static library is also supported](#πŸ› -advanced-building--management). + +### Supported Standards + +- [J2735_202409](https://www.sae.org/standards/j2735_202409-v2x-communications-message-set-dictionary) ### πŸ”Œ Supported Bindings @@ -50,82 +66,90 @@ Currently, the following language bindings are officially supported and maintain | Language | Status | Runtime Dependency | Documentation | | :--- | :--- | :--- | :--- | | **Python** | βœ… Active | `wasmtime` | [View Python README](./j2735codec/bindings/python/README.md) | -| **Node.js** | βœ… Active | None (Native Support) | [View Node README](./j2735codec/bindings/node/README.md) | +| **Node.js** | βœ… Active | Native Support | [View Node README](./j2735codec/bindings/node/README.md) | For specific installation steps and examples for Python or Node, please view the language's README. ---- -### Installation From GitHub Releases (Recommended) +### Language Binding Installation + +There are two ways to install the language binding: -Install the Python or Node bindings using the link directly from the project release page: +1. Install the bindings using the link directly from the project release page ([View Latest Releases](https://github.com/5GRealityLab/etx-starter-kit/releases/latest)). -#### Python +2. Clone this repo and bulid it yourself. + +### 1. Release Install + +##### Python **Via UV**: ```bash -uv add "https://github.com/verizon/j2735codec/releases/download/v1.0.0/j2735_codec-1.0.0-py3-none-any.whl" +uv add "https://github.com/5GRealityLab/etx-starter-kit/releases/download/v0.0.0-alpha/python-j2735codec-0.0.0-py3-none-any.whl" ``` **Via Pip**: ```bash -pip install "https://github.com/verizon/j2735codec/releases/download/v1.0.0/j2735_codec-1.0.0-py3-none-any.whl" +pip install "https://github.com/5GRealityLab/etx-starter-kit/releases/download/v0.0.0-alpha/python-j2735codec-0.0.0-py3-none-any.whl" ``` -#### Node +##### Node **Via NPM** ```bash -npm install "https://github.com/verizon/j2735codec/releases/download/v1.0.0/j2735codec-1.0.0.tgz" +npm install "https://github.com/5GRealityLab/etx-starter-kit/releases/download/v0.0.0-alpha/node-j2735codec-0.2.0.tgz" ``` -**Note**: The links above are not valid, just an example. Please see release page in this repo for proper links to to use. - ---- +**Note**: The release links above are not valid. Please see release page in this repo for proper links to to use. -### πŸ—οΈ Installation From Source +### 2. Source Install #### πŸ›  Prerequisites -##### Runtime & Package Managers +- **Runtime & Package Managers** -**Node.js**: `v22.16.0` (LTS) or higher. -- NPM is needed for the builds to work. + - For **Node.js**: `v22.16.0` (LTS) or higher. + - NPM is needed for the builds to work. -**Python**: `v3.9` or higher. + - For **Python**: `v3.9` or higher. + - [UV](https://docs.astral.sh/uv/) or Pip should be installed for builds to work. -- [UV](https://docs.astral.sh/uv/) or Pip should be installed for builds to work. -**Note**: Python or Node.js should be installed on your host as well. +- **Emscripten SDK (emsdk)** + - Required to compile the C++ source into WebAssembly. + - **Tested Version:** 4.0.10 + + **Note:** It is recommended to use the version listed above to ensure consistent WASM memory exports. -##### Emscripten SDK (emsdk) -Required to compile the C++ source into WebAssembly. + ```bash + # Clone and install the Emscripten toolchain + git clone https://github.com/emscripten-core/emsdk.git + cd emsdk + ./emsdk install 4.0.10 + ./emsdk activate 4.0.10 -* **Tested Version:** 4.0.10 -* **Note:** It is recommended to use the version listed above to ensure consistent WASM memory exports. + # Activate environment variables (must be run in every new terminal session) + source ./emsdk_env.sh + ``` -```bash -# Clone and install the Emscripten toolchain -git clone [https://github.com/emscripten-core/emsdk.git](https://github.com/emscripten-core/emsdk.git) -cd emsdk -./emsdk install 4.0.10 -./emsdk activate 4.0.10 +- **CMake (3.23+)** -# Activate environment variables (must be run in every new terminal session) -source ./emsdk_env.sh -``` + - Used to manage the C++ build process. + - macOS: `brew install cmake` + - Linux: `sudo apt install cmake` + - Windows: Download from [cmake.org](https://cmake.org) -##### CMake (3.23+) -Used to manage the C++ build process. -- macOS: `brew install cmake` -- Linux: `sudo apt install cmake` -- Windows: Download from [cmake.org](https://cmake.org) +#### Instructions -#### Installation +The first step is to clone this repository first. All of the following commands should be executed from the project root. + +```bash +git clone https://github.com/5GRealityLab/etx-starter-kit.git +``` -Clone this repository. Issue the following commands to perform a full installation: +The following commands will perform a full installation outlined below: ***Setup β†’ Build β†’ Test Code β†’ Pack Artifacts β†’ Verify Package Installation*** @@ -139,23 +163,27 @@ make install-py make install-js ``` +If anything goes wrong a "hard reset" can be performed using the following command.Use this for a completely fresh start. + +```bash +make purge +``` + --- ### πŸ›  Advanced Building & Management -The central `Makefile` orchestrates the multi-stage build process. +The `make install-x` command is really all you need to get started. It essentially operates all the following commands in a sequence. If you want more control over the build and install process, the following commands are available as well. +The central [Makefile](/Makefile) at the root of the repository orchestrates all of the commands. -#### Environment Setup -Sync all dependencies (Python packages and Node modules): -```bash -make setup -``` +**Note:** There are interdependencies across the following commands. For example, if you run build, setup and wasm compilation will be run as well. #### WebAssembly Compilation Compile codec C/C++ source into WebAssembly binary: ```bash make wasm ``` + **Note:** Ensure you have sourced your `emsdk_env.sh` before running this command. #### Build Native C Library @@ -164,29 +192,65 @@ Compile codec C/C++ source into a static C library (**sample code is not provide make native ``` ---- +#### Environment Setup +Sync all dependencies (Python packages and Node modules): +```bash +make setup-py # python +make setup-js # node +make setup # both +``` -### Version Management -To propagate a version change from the root `VERSION` file to all sub-manifests: +#### Build Bindings ```bash -# 1. Update the VERSION file at the project root. -# 2. Sync all workspaces: -make sync-version +make build-py # python +make build-js # node ``` ---- +#### Run Bindings Test +```bash +make test-py # python +make test-js # node +``` + +#### Uninstall Bindings + +Uninstall the codec bindings from your local environment. + +```bash +make uninstall-py # python +make uninstall-js # node +``` -### 🧹 Cleaning Up +### Cleanup + +Removes language-specific build artifacts (`dist` and any output folders). -**Standard Clean:** Removes language-specific build artifacts (`dist` folders). ```bash -make clean-py # or clean-js +make clean-py # python +make clean-js # node ``` -**Hard Reset (Purge):** Deletes all build directories, virtual environments, modules, packages, and generated binary files. Use this for a completely fresh start. +### Purge + +The purge command will perform a hard reset on the repository. Removing all distributions, binaries, installation, package manager, etc. + ```bash make purge ``` +--- + +### Version Management (For Contributors Only) + +To propagate a version change from the root `VERSION` file to all sub-manifests: + +```bash +# 1. Update the VERSION file at the project root. +# 2. Sync all workspaces: +make sync-version +``` + +--- + ## βš–οΈ License Licensed under the Apache License 2.0. See [LICENSE](LICENSE) and [NOTICE](NOTICE) for details. \ No newline at end of file diff --git a/etx/README.md b/etx/README.md new file mode 100644 index 0000000..90e4f4a --- /dev/null +++ b/etx/README.md @@ -0,0 +1,123 @@ +# Edge Transportation Exchange (ETX) + +## 🌐 Overview +The **Edge Transportation Exchange (ETX)** is a high-performance, mobile-network-integrated V2X (Vehicle-to-Everything) communication platform. By leveraging Verizon networks alongside low-latency Mobile Edge Compute (MEC), ETX enables near-real-time bidirectional data sharing between vehicles, vulnerable road users (pedestrians and cyclists), and intelligent infrastructure. + +Unlike traditional V2X models that rely heavily on physical roadside units (RSUs), ETX uses a virtualized architecture and a sophisticated geospatial routing engine. This engine organizes the world into high-precision **Geohashes**, ensuring that messagesβ€”from safety-critical BSMs to traffic signal timings (SPaT)β€”are delivered only to participants within relevant proximity, maximizing system efficiency and reducing network noise. + +## πŸ›  Technical Specifications +| Feature | Implementation | +| :--- | :--- | +| **Protocol** | MQTT 3.1.1 (v4) | +| **Security** | TLS 1.2+ Mutual Authentication | +| **Routing** | Geospatial (Geohash-based) | +| **Payload Format** | J2735 UPER wrapped in Protobuf | +| **QoS Levels** | 0 (Preferred), 1 supported | + +> **For more information and API specification please visit the [link here](https://thingspace.verizon.com/documentation/api-documentation.html#/http/specialized-apis/edge-transportation-exchange/mqtt-api).** + +## πŸ”„ How Message Routing Works + +Georouting in the ETX ecosystem follows a highly structured "wrapper" pipeline to balance standardized V2X intelligence with high-speed delivery. + +**Note: The encoding and wrapping mechanism (e.g. steps 1 and 2) is included in the language bindings.** + +### 1. J2735 Encoding +The process begins with a J2735 message (such as a BSM), which is encoded into a compact, binary **UPER** format using the core C++/WASM codec. + +### 2. Protobuf Wrapping +Because standard MQTT brokers are "location-blind," the raw binary is encapsulated within a **Protobuf wrapper (`GeoRoutedMsg`)**. This acts as a metadata envelope, attaching critical attributes: +* **Payload**: The raw J2735 UPER binary. +* **Location**: High-precision GPS coordinates (Lat/Long). +* **Timestamp**: Creation time for latency tracking. + +**Note: See below for how to generate these bindings yourself.** + +### 3. MQTT Transport +The serialized Protobuf object is sent as the MQTT payload to a topic structured by the client's current Geohash (e.g., `vzimp/1/GeoRelevance/...`). + +### 4. Spatial Delivery +The ETX broker parses the Geohash from the topic and the coordinates from the Protobuf header. It then "shuttles" the message to all relevant subscribers within a neighboring grid, ensuring the data reaches exactly who needs it based on physical proximity. + +## πŸ“‘ Messaging Patterns +ETX supports four distinct communication patterns to meet diverse ITS requirements: + +* **Public Broadcast**: Ecosystem-wide safety alerts (BSM/PSM). +* **Private Broadcast**: Proprietary fleet-wide updates. +* **Public Targeted**: Direct, point-to-point interactions (Session ID based). +* **Private Targeted**: Secure, authorized exchanges between specific peers. + +**Note:** The reliability of these messages are subject to the delivery semantics of the MQTT standards. Please view our API for more information. + +## ❓ Documents + +- A debugging guide for ETX registration is [provided here](./docs/DEBUGGING.md). + +## πŸ› οΈ Generate Protobuf Bindings + +Protobuf bindings are needed if you want to interact with ETX directly without the help of the language bindings provided in this project. + +**NOTE: Protobuf encoding/decoding is already happening in the langauge bindings provided!** + +### Python + +```bash +# 1. Create distribution folder. +mkdir -p ./proto/dist/python + +# 2. Install grpc tools. +pip install grpcio-tools + +# 3. Generate protobuf output. +python -m grpc_tools.protoc \ + -I=./proto \ + --python_out=./proto/dist/python \ + --pyi_out=./proto/dist/python \ + ./proto/georoutedmsg.proto +``` + +Our bindings use the following version grpcio-tools: + +```text +Name: grpcio-tools +Version: 1.76.0 +Summary: Protobuf code generator for gRPC +Home-page: https://grpc.io +Author: The gRPC Authors +Author-email: grpc-io@googlegroups.com +License: Apache License 2.0 +Location: /Users/hsuyu/.virtualenvs/test2/lib/python3.11/site-packages +Requires: grpcio, protobuf, setuptools +Required-by: +``` + +### Node + +```bash +# 1. Create distribution folder +mkdir -p ./proto/dist/node + +# 2. Install the modern TypeScript generator and runtime +# ts-proto: The compiler plugin +# protobufjs: The required lightweight runtime +npm install --save-dev ts-proto +npm install protobufjs + +# 3. Generate pure TypeScript files +# --ts_proto_out: tells protoc to use the ts-proto plugin +npx protoc \ + --ts_proto_out=./proto/dist/node \ + --ts_proto_opt=esModuleInterop=true \ + -I=./proto \ + ./proto/georoutedmsg.proto +``` + +Our bindings use the follow version: + +```text +etx-starter-kit@0.2.0 /Users/hsuyu/Documents/projects/v2x/oss/etx-starter-kit +└── ts-proto@2.11.0 + +etx-starter-kit@0.2.0 /Users/hsuyu/Documents/projects/v2x/oss/etx-starter-kit +└── protobufjs@8.0.0 +``` \ No newline at end of file diff --git a/etx/docs/DEBUGGING.md b/etx/docs/DEBUGGING.md new file mode 100644 index 0000000..516ea3d --- /dev/null +++ b/etx/docs/DEBUGGING.md @@ -0,0 +1,415 @@ +# Debugging + +The following guide provides commands that can be issued in the terminal. Replace any variables inside `${}`, `%%`, or `$` with the appropriate variables. + +## 1. Getting Access Token + +#### Bash + +```bash +curl -X POST \ + -H "Content-Type: application/x-www-form-urlencoded" \ + -H "Authorization: Basic ${TOKEN}" \ + -d "grant_type=client_credentials" \ + https://thingspace.verizon.com/api/ts/v1/oauth2/token +``` + +#### Windows Command Prompt +```batch +curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -H "Authorization: Basic %TOKEN%" -d "grant_type=client_credentials" https://thingspace.verizon.com/api/ts/v1/oauth2/token +``` + +#### PowerShell +```powershell +Invoke-RestMethod ` + -Method Post ` + -Uri "https://thingspace.verizon.com/api/ts/v1/oauth2/token" ` + -Headers @{ ` + "Content-Type" = "application/x-www-form-urlencoded"; ` + "Authorization" = "Basic $TOKEN" ` + } ` + -Body "grant_type=client_credentials" +``` + +Note: Use the `TOKEN` assigned to your account. + +### Successful Response Sample + +```json +{ + "access_token": "WXE4OTY2NTgtNzdiOC00ZGM4LWE3ZmItZDRmNzFiZjRjYzYz", + "scope": "ts.application.ro ts.mec.fullaccess", + "token_type": "Bearer", + "expires_in": 3600 +} +``` + +## 2. Getting Session Token + +#### Bash +```bash +curl -X POST \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer ${ACCESS_TOKEN}" \ + -d "{\"username\": \"${USER}\", \"password\": \"${PASS}\"}" \ + https://thingspace.verizon.com/api/m2m/v1/session/login +``` + +#### Windows Command Prompt +```batch +curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer %ACCESS_TOKEN%" -d "{\"username\": \"%USER%\", \"password\": \"%PASS%\"}" https://thingspace.verizon.com/api/m2m/v1/session/login +``` + +#### PowerShell +```powershell +Invoke-RestMethod ` + -Method Post ` + -Uri "https://thingspace.verizon.com/api/m2m/v1/session/login" ` + -Headers @{ ` + "Content-Type" = "application/json"; ` + "Authorization" = "Bearer $ACCESS_TOKEN" ` + } ` + -Body (@{ ` + username = $USER; ` + password = $PASS ` + } | ConvertTo-Json) +``` + +Notes: +- Use the `ACCESS_TOKEN` from the response of last step. +- Use the `USER` and `PASS` assigned to your account. + +### Successful Response Sample + +```json +{ + "sessionToken": "d6c26b5c-f141-4864-41bb-5bcdbd22c1dc" +} +``` + +## 3. Getting Certificates + +#### Bash +```bash +curl -X POST \ + -H "Content-Type: application/json" \ + -H "SessionToken: ${SESSION_TOKEN}" \ + -H "Authorization: Bearer ${ACCESS_TOKEN}" \ + -d "{\"VendorID\": \"${VENDOR_ID}\", \ + \"ClientType\": \"${CLIENT_TYPE}\", \ + \"ClientSubtype\": \"${CLIENT_SUBTYPE}\"}" \ + https://imp.thingspace.verizon.com/api/v2/clients/registration +``` + +#### Windows Command Prompt +```batch +curl -X POST -H "Content-Type: application/json" -H "SessionToken: %SESSION_TOKEN%" -H "Authorization: Bearer %ACCESS_TOKEN%" -d "{\"VendorID\": \"%VENDOR_ID%\", \"ClientType\": \"%CLIENT_TYPE%\", \"ClientSubtype\": \"%CLIENT_SUBTYPE%\"}" https://imp.thingspace.verizon.com/api/v2/clients/registration +``` + +#### PowerShell +```powershell +Invoke-RestMethod ` + -Method Post ` + -Uri "https://imp.thingspace.verizon.com/api/v2/clients/registration" ` + -Headers @{ ` + "Content-Type" = "application/json"; ` + "SessionToken" = $SESSION_TOKEN; ` + "Authorization" = "Bearer $ACCESS_TOKEN" ` + } ` + -Body (@{ ` + VendorID = $VENDOR_ID; ` + ClientType = $CLIENT_TYPE; ` + ClientSubtype = $CLIENT_SUBTYPE ` + } | ConvertTo-Json) +``` + +Notes: +- Use the `SESSION_TOKEN` and `ACCESS_TOKEN` retrieved from the last steps. +- Use the `VENDOR_ID`, `CLIENT_TYPE`, and `CLIENT_SUBTYPE` assigned to your account. + +### Successful Response Sample + +```json +{ + "Certificate": { + "ExpirationTime": "2026-01-16T12:25:14Z", + "ca.pem": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----\n", + "cert.pem": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----", + "key.pem": "-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----\n" + }, + "DeviceID": "35f3ef91-f951-4110-b05d-8579123ece61" +} +``` + +Notes: +- Keep track of the `DeviceID` and `Certificate`. Each account is expected to manage these credentials by themselves. There is quota for the number devices for each account. If a device ID is orphaned without deleting it (step 6), they will take up part of the quota. +- This will take awhile to respond so set timeouts appropriately. + +## 4. Get Connection Details + +#### Bash +```bash +curl -X POST \ + -H "Content-Type: application/json" \ + -H "SessionToken: ${SESSION_TOKEN}" \ + -H "Authorization: Bearer ${ACCESS_TOKEN}" \ + -H "VendorID: ${VENDOR_ID}" \ + -d "{\"DeviceID\": \"${DEVICE_ID}\", \ + \"NetworkType\": \"non-VZ\", \ + \"Geolocation\": {\"Latitude\": ${LAT}, \"Longitude\": ${LON}}}" \ + https://imp.thingspace.verizon.com/api/v2/clients/connection +``` + +#### Windows Command Prompt +```batch +curl -X POST -H "Content-Type: application/json" -H "SessionToken: %SESSION_TOKEN%" -H "Authorization: Bearer %ACCESS_TOKEN%" -H "VendorID: %VENDOR_ID%" -d "{\"DeviceID\": \"%DEVICE_ID%\", \"NetworkType\": \"non-VZ\", \"Geolocation\": {\"Latitude\": %LAT%, \"Longitude\": %LON%}}}" https://imp.thingspace.verizon.com/api/v2/clients/connection +``` + +#### PowerShell +```powershell +Invoke-RestMethod ` + -Method Post ` + -Uri "https://imp.thingspace.verizon.com/api/v2/clients/connection" ` + -Headers @{ ` + "Content-Type" = "application/json"; ` + "SessionToken" = $SESSION_TOKEN; ` + "Authorization" = "Bearer $ACCESS_TOKEN"; ` + "VendorID" = $VENDOR_ID ` + } ` + -Body (@{ ` + DeviceID = $DEVICE_ID; ` + NetworkType = "non-VZ"; ` + Geolocation = @{ ` + Latitude = [double]$LAT; ` + Longitude = [double]$LON ` + } ` + } | ConvertTo-Json) +``` + +Notes: +- Use the `SESSION_TOKEN`, `ACCESS_TOKEN`, and `DEVICE_ID` retrieved from the last steps. +- Use the `VENDOR_ID` assigned to your account. +- The `LAT`, `LON` is based on your location. +- The network type `non-VZ` is used if not connecting from VZ network. + +### Successful Response Sample + +```json +{ + "MqttURL": "mqtt://imp-atl-1.prod-us-east-1.thingspace.verizon.com:8883" +} +``` + +## 5. Deleting Device + +This removes the device ID and certificate from the credential pool. + +#### Bash +```bash +curl -X DELETE \ + -H "Content-Type: application/x-www-form-urlencoded" \ + -H "VendorID: ${VENDOR_ID}" \ + -H "Authorization: Bearer ${ACCESS_TOKEN}" \ + -H "SessionToken: ${SESSION_TOKEN}" \ + "https://imp.thingspace.verizon.com/api/v2/clients/registration?DeviceIDs=${DEVICE_ID}" +``` + +#### Windows Command Prompt +```batch +curl -X DELETE -H "Content-Type: application/x-www-form-urlencoded" -H "VendorID: %VENDOR_ID%" -H "Authorization: Bearer %ACCESS_TOKEN%" -H "SessionToken: %SESSION_TOKEN%" "https://imp.thingspace.verizon.com/api/v2/clients/registration?DeviceIDs=%DEVICE_ID%" +``` + +#### PowerShell +```powershell +Invoke-RestMethod ` + -Method Delete ` + -Uri "https://imp.thingspace.verizon.com/api/v2/clients/registration?DeviceIDs=$DEVICE_ID" ` + -Headers @{ ` + "Content-Type" = "application/x-www-form-urlencoded"; ` + "VendorID" = $VENDOR_ID; ` + "Authorization" = "Bearer $ACCESS_TOKEN"; ` + "SessionToken" = $SESSION_TOKEN ` + } +``` + +Notes: +- Use the `SESSION_TOKEN`, `ACCESS_TOKEN`, and `DEVICE_ID` retrieved from the last steps. +- Use the `VENDOR_ID` assigned to your account. + +## Other Helpful Commands + +### Check if endpoint is reachable. + +```bash +nc -vz imp-atl-1.prod-us-east-1.thingspace.verizon.com 8883 +``` + +#### Expected Return + +``` +Connection to imp-atl-1.prod-us-east-1.thingspace.verizon.com port 8883 [tcp/*] succeeded! +``` + +### Check if certificates are valid. + +```bash +openssl s_client -connect imp-atl-1.prod-us-east-1.thingspace.verizon.com port:8883 \ + -CAfile ca.crt \ + -cert client.crt \ + -key client.key \ + -verify_return_error \ + -verify 1 \ + -showcerts +``` +#### Expected Return (on macOS) + +``` +verify depth is 1 +Connecting to 3.226.205.123 +CONNECTED(00000006) +depth=2 C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root G2 +verify return:1 +depth=1 C=US, O=DigiCert Inc, CN=DigiCert Global G2 TLS RSA SHA256 2020 CA1 +verify return:1 +depth=0 C=US, ST=Florida, L=Temple Terrace, O=Verizon Data Services LLC, CN=imp-bos-1.prod-us-east-1.thingspace.verizon.com +verify return:1 +--- +Certificate chain + 0 s:C=US, ST=Florida, L=Temple Terrace, O=Verizon Data Services LLC, CN=imp-bos-1.prod-us-east-1.thingspace.verizon.com + i:C=US, O=DigiCert Inc, CN=DigiCert Global G2 TLS RSA SHA256 2020 CA1 + a:PKEY: RSA, 2048 (bit); sigalg: sha256WithRSAEncryption + v:NotBefore: Nov 12 00:00:00 2024 GMT; NotAfter: Dec 2 23:59:59 2025 GMT +-----BEGIN CERTIFICATE----- +MIIKfjCCCWagAwIBAgIQDHNDpwxuDj8znqboBGg+UTANBgkqhkiG9w0BAQsFADBZ +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMTMwMQYDVQQDEypE +aWdpQ2VydCBHbG9iYWwgRzIgVExTIFJTQSBTSEEyNTYgMjAyMCBDQTEwHhcNMjQx +MTEyMDAwMDAwWhcNMjUxMjAyMjM1OTU5WjCBljELMAkGA1UEBhMCVVMxEDAOBgNV +BAgTB0Zsb3JpZGExFzAVBgNVBAcTDlRlbXBsZSBUZXJyYWNlMSIwIAYDVQQKExlW +ZXJpem9uIERhdGEgU2VydmljZXMgTExDMTgwNgYDVQQDEy9pbXAtYm9zLTEucHJv +ZC11cy1lYXN0LTEudGhpbmdzcGFjZS52ZXJpem9uLmNvbTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAK6PvNrSUb3d5oK50tkf9CX0zJMb8liLDYpxG4lV +WB0pViRZkQUgnIWy/9NceHyst1jUyZDg/zMgUFxJOaFlMu44fjw7BXR6WQfGeo0M +N/u94eu1IIMTLYhcIAcxYI4wa/Q/oA5C3tQSQsYsc7DUoXGBTwzkOHIZdLdSFNsK +Iz6R2z/LxjCKim5kEXxDeRp4QIqoRKJ8wo+Y8yMiLebSmFGWgZ96hdT04CnhCXw/ +bGBTFf6ncyRV+iqJkau9rzMriTbEG0QMBteCafZrUyeiLiSi55AtqRX9isLnDVlw +njmDnPA32tGSXHZNJHxCqQCiKL76eLV518Gq6/ks0EAwT70CAwEAAaOCBwIwggb+ +MB8GA1UdIwQYMBaAFHSFgMBmx9833s+9KTeqAx2+7c0XMB0GA1UdDgQWBBQ/yajG +imCVAczapOUD4zc+wIqa9jCCA5EGA1UdEQSCA4gwggOEgi9pbXAtYm9zLTEucHJv +ZC11cy1lYXN0LTEudGhpbmdzcGFjZS52ZXJpem9uLmNvbYIxaW1wLWF0bC13bDEu +cHJvZC11cy1lYXN0LTEudGhpbmdzcGFjZS52ZXJpem9uLmNvbYIvaW1wLWF0bC0x +LnByb2QtdXMtZWFzdC0xLnRoaW5nc3BhY2UudmVyaXpvbi5jb22CMWltcC1kZnct +d2wxLnByb2QtdXMtZWFzdC0xLnRoaW5nc3BhY2UudmVyaXpvbi5jb22CL2ltcC1k +ZnctMS5wcm9kLXVzLWVhc3QtMS50aGluZ3NwYWNlLnZlcml6b24uY29tgjFpbXAt +ZHR3LXdsMS5wcm9kLXVzLWVhc3QtMS50aGluZ3NwYWNlLnZlcml6b24uY29tgi9p +bXAtZHR3LTEucHJvZC11cy1lYXN0LTEudGhpbmdzcGFjZS52ZXJpem9uLmNvbYIx +aW1wLW1zcC13bDEucHJvZC11cy1lYXN0LTEudGhpbmdzcGFjZS52ZXJpem9uLmNv +bYIvaW1wLW1zcC0xLnByb2QtdXMtZWFzdC0xLnRoaW5nc3BhY2UudmVyaXpvbi5j +b22CMWltcC1ueWMtd2wxLnByb2QtdXMtZWFzdC0xLnRoaW5nc3BhY2UudmVyaXpv +bi5jb22CL2ltcC1ueWMtMS5wcm9kLXVzLWVhc3QtMS50aGluZ3NwYWNlLnZlcml6 +b24uY29tgjFpbXAtYm9zLXdsMS5wcm9kLXVzLWVhc3QtMS50aGluZ3NwYWNlLnZl +cml6b24uY29tgjFpbXAtbGF4LXdsMS5wcm9kLXVzLXdlc3QtMi50aGluZ3NwYWNl +LnZlcml6b24uY29tgi9pbXAtbGF4LTEucHJvZC11cy13ZXN0LTIudGhpbmdzcGFj +ZS52ZXJpem9uLmNvbYIxaW1wLXNmby13bDEucHJvZC11cy13ZXN0LTIudGhpbmdz +cGFjZS52ZXJpem9uLmNvbYIvaW1wLXNmby0xLnByb2QtdXMtd2VzdC0yLnRoaW5n +c3BhY2UudmVyaXpvbi5jb22CMWltcC1waHgtd2wxLnByb2QtdXMtd2VzdC0yLnRo +aW5nc3BhY2UudmVyaXpvbi5jb22CL2ltcC1waHgtMS5wcm9kLXVzLXdlc3QtMi50 +aGluZ3NwYWNlLnZlcml6b24uY29tMD4GA1UdIAQ3MDUwMwYGZ4EMAQICMCkwJwYI +KwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAOBgNVHQ8BAf8E +BAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMIGfBgNVHR8EgZcw +gZQwSKBGoESGQmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2Jh +bEcyVExTUlNBU0hBMjU2MjAyMENBMS0xLmNybDBIoEagRIZCaHR0cDovL2NybDQu +ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsRzJUTFNSU0FTSEEyNTYyMDIwQ0Ex +LTEuY3JsMIGHBggrBgEFBQcBAQR7MHkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3Nw +LmRpZ2ljZXJ0LmNvbTBRBggrBgEFBQcwAoZFaHR0cDovL2NhY2VydHMuZGlnaWNl +cnQuY29tL0RpZ2lDZXJ0R2xvYmFsRzJUTFNSU0FTSEEyNTYyMDIwQ0ExLTEuY3J0 +MAwGA1UdEwEB/wQCMAAwggF8BgorBgEEAdZ5AgQCBIIBbASCAWgBZgB2ABLxTjS9 +U3JMhAYZw48/ehP457Vih4icbTAFhOvlhiY6AAABkyKg6VoAAAQDAEcwRQIhAO2k +WAe3ZciU1sQn0tHcCPzuK4KhX6BfYNmIE7h+xbvfAiArIHQXJgwhStMIk7RT5nNq +uk69Twidt68H/skVFQU+JAB1AObSMWNAd4zBEEEG13G5zsHSQPaWhIb7uocyHf0e +N45QAAABkyKg6SAAAAQDAEYwRAIgFzNzReskFb+0NqY15ONwGgX5FqC0nMp5Qs3F +I8SVQNECIBN05NlpYZNO7ZaMX+YIo7IMvuwXY10X0zfdpf7wnnCJAHUAzPsPaoVx +CWX+lZtTzumyfCLphVwNl422qX5UwP5MDbAAAAGTIqDpKgAABAMARjBEAiBVyiCE +hv0fpS33BXxvrzFW2l7MtSgTceDopq9mLr4qFQIgEz2iSu/PEUb5t3ACkXHRZIFO +D2JlAA3BEX4k0HFb5vYwDQYJKoZIhvcNAQELBQADggEBAHXAhwBbW6bUlbu6F6yx +j4YH6Hsv7eWgIE7XRT/LjECMA6Hr1iV7sv0Ec8xPYwF+x6YpRDxlmsKuG9lUi5KC +zM2+mscXN4w28QRKTsC05/HmPisXSH8mZpFhkuG0V8DwghmB3zyVUKuvQu86Sx+V +kS4bsoJHmN39vxBa43ylEVcqL9MAMwVZtmvUXxTvbohtG3UlsPf9oygrTL2K22AI +eF36ZGxW3EIx5sGxqV2AOLFNU8NecUTk3sUus2c7AfG/k5W8D1YXA/yte2/TNl7x +TpKqfBOzvqL9iPVJwZWrz+shsuCQsPouGSnnqCHRLzMFh4FhtZiyEEbZlyv/bS/7 +ASk= +-----END CERTIFICATE----- +--- +Server certificate +subject=C=US, ST=Florida, L=Temple Terrace, O=Verizon Data Services LLC, CN=imp-bos-1.prod-us-east-1.thingspace.verizon.com +issuer=C=US, O=DigiCert Inc, CN=DigiCert Global G2 TLS RSA SHA256 2020 CA1 +--- +Acceptable client certificate CA names +C=US, O=Verizon, OU=ThingSpace, CN=ThingSpace Issuing CA Dev +C=US, O=Verizon, OU=ThingSpace, CN=ThingSpace Root Certificate Authority R2 +C=US, ST=NJ, L=Basking Ridge, O=Verizon Wireless, OU=ThingSpace Develop, CN=ThingSpace Root Certificate Authority +Requested Signature Algorithms: ECDSA+SHA256:ECDSA+SHA384:ECDSA+SHA512:ed25519:ed448:rsa_pss_pss_sha256:rsa_pss_pss_sha384:rsa_pss_pss_sha512:RSA-PSS+SHA256:RSA-PSS+SHA384:RSA-PSS+SHA512:RSA+SHA256:RSA+SHA384:RSA+SHA512:ECDSA+SHA224:RSA+SHA224 +Shared Requested Signature Algorithms: ECDSA+SHA256:ECDSA+SHA384:ECDSA+SHA512:ed25519:ed448:rsa_pss_pss_sha256:rsa_pss_pss_sha384:rsa_pss_pss_sha512:RSA-PSS+SHA256:RSA-PSS+SHA384:RSA-PSS+SHA512:RSA+SHA256:RSA+SHA384:RSA+SHA512 +Peer signing digest: SHA256 +Peer signature type: rsa_pss_rsae_sha256 +Peer Temp Key: ECDH, secp384r1, 384 bits +--- +SSL handshake has read 3839 bytes and written 3548 bytes +Verification: OK +--- +New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384 +Protocol: TLSv1.3 +Server public key is 2048 bit +This TLS version forbids renegotiation. +Compression: NONE +Expansion: NONE +No ALPN negotiated +Early data was not sent +Verify return code: 0 (ok) +--- +--- +Post-Handshake New Session Ticket arrived: +SSL-Session: + Protocol : TLSv1.3 + Cipher : TLS_AES_256_GCM_SHA384 + Session-ID: D2964ADD2BFDEEC85EB8D1C21361008C55E5EC08643C37C0156A73A5E7DB237F + Session-ID-ctx: + Resumption PSK: 3E0D7C33CAD3DAC4D6EE0B657FA93B9F1314935C6E582071D2680C3D13CEA02D54D14741F40E855D91A0DCB4840FF38F + PSK identity: None + PSK identity hint: None + SRP username: None + TLS session ticket lifetime hint: 600 (seconds) + TLS session ticket: + 0000 - 99 3b e2 1f d5 cd ac 0f-d7 cd 04 16 75 cd c3 e6 .;..........u... + 0010 - 26 5f c5 5c 7b 28 fb 47-46 02 b2 5b 19 a1 c4 c7 &_.\{(.GF..[.... + + Start Time: 1752712553 + Timeout : 7200 (sec) + Verify return code: 0 (ok) + Extended master secret: no + Max Early Data: 0 +--- +read R BLOCK +--- +Post-Handshake New Session Ticket arrived: +SSL-Session: + Protocol : TLSv1.3 + Cipher : TLS_AES_256_GCM_SHA384 + Session-ID: B11455E5AFBCB862D00528DF410B1530C167AC9451D2D88B94AC64386538C321 + Session-ID-ctx: + Resumption PSK: 625678B4DBA5E58134014A38971B8F256E6C0E01758607E74D8FB52A21FBEEA28BE1BD750919A04C9836CD8AB3F289FD + PSK identity: None + PSK identity hint: None + SRP username: None + TLS session ticket lifetime hint: 600 (seconds) + TLS session ticket: + 0000 - be 71 b8 0f 49 50 64 d1-d9 62 d7 90 fc f1 0e 64 .q..IPd..b.....d + 0010 - 2b 80 b4 83 51 2c 60 f4-c5 f7 2b a4 69 74 a4 af +...Q,`...+.it.. + + Start Time: 1752712553 + Timeout : 7200 (sec) + Verify return code: 0 (ok) + Extended master secret: no + Max Early Data: 0 +--- +read R BLOCK +``` diff --git a/etx/examples/python/README.md b/etx/examples/python/README.md new file mode 100644 index 0000000..31a0c06 --- /dev/null +++ b/etx/examples/python/README.md @@ -0,0 +1,236 @@ +# Python ETX Client Sample + +This repository serves as a practical guide for developers looking to get started with the Verizon ETX platform in Python. It offers a selection of concise, self-contained examples designed to help you quickly understand core V2X conceptsβ€”such as mTLS authentication, J2735 message transcoding, and geographic topic routing. + +## Running Examples + +This version of the client sample has been tested against **Python 3.9+**. It utilizes the `j2735codec` for transcoding between JER (JSON) and UPER (Binary) formats. + +**NOTE**: All references to the project root refer to `etx/examples/python/`. This is where **ALL** the examples should be executed from. + +### Prerequisite - Setup + +The fastest way to get started is to download the packages from release. The latest release can be [found here]((https://github.com/5GRealityLab/etx-starter-kit/releases/latest)). + +The relevant Python files are: + + - Sample code **etx-python-sample-x.x.x-py3-none-any.zip**. + - Binding package **j2735codec-x.whl`**. + +1. **Install Dependencies**: + + **Install With Pip** + + ```bash + curl -L -O https://github.com/5GRealityLab/etx-starter-kit/releases/latest/download/j2735codec-x.x.x-py3-none-any.whl + curl -L -O https://github.com/5GRealityLab/etx-starter-kit/releases/latest/download/etx-python-sample-x.x.x.zip + unzip etx-python-sample-x.x.x.zip + pip install j2735codec-x.x.x-py3-none-any.whl + pip install . + ``` + + **Install with UV** + + ```bash + curl -L -O https://github.com/5GRealityLab/etx-starter-kit/releases/latest/download/j2735codec-x.x.x-py3-none-any.whl + curl -L -O https://github.com/5GRealityLab/etx-starter-kit/releases/latest/download/etx-python-sample-x.x.x.zip + unzip etx-python-sample-x.x.x.zip + uv sync --find-links . + ``` + +2. **Environment Configuration**: Create a `config.json` file to start using the examples. The [`config.json.example`](./config.json.example) file provides a good starting point. + + Here are some pointers on what to fill out for the fields in the JSON. + + | Section | Field | Type | Description | + | :--- | :--- | :--- | :--- | + | **Root** | `logLevel` | String | Controls the verbosity of the console output (e.g., `DEBUG`, `INFO`, `WARN`, `ERROR`). | + | | `certDir` | String | The local directory where security certificates and keys are generated after registration completes. | + | **identity** | `user` | String | Your Verizon ThingSpace account username. | + | | `password` | String | Your Verizon ThingSpace account password. | + | | `token` | String | The Base64 encoded Application Token (Client ID:Client Secret) from ThingSpace. | + | **attributes**| `clientType` | String | The broad category of the client (e.g., `Vehicle`, `VulnerableRoadUser`, etc). | + | | `clientSubType` | String | The specific type of vehicle (e.g., `PassengerCar`, `Truck`, `Radar`, etc). | + | | `vendorId` | String | An identifier for the software or hardware provider. | + | **location** | `lat` | Float | The initial latitude for the device (used during registration/geofencing). | + | | `lon` | Float | The initial longitude for the device. | + +**Note: The latitude and longitude determines which edge server you will conenct to.** + +**Note: The `Endpoints` section in the config is optional and does not have to be filled out.** +```json +"endpoints": { + "oauthUrl": "https://thingspace.verizon.com/api/ts/v1/oauth2/token", + "sessionUrl": "https://thingspace.verizon.com/api/m2m/v1/session/login", + "oauthTimeout": 30000, + "registrationUrl": "https://imp.thingspace.verizon.com", + "registrationTimeout": 45000 +} +``` +--- + +### Note + +- If executing examples using ***uv***, simply add ***uv run*** to the beginning of any python commands. + +*Example* +```bash +uv run python -m examples.0_registration_example +``` + +- These arguments are supported by all the following examples. + +| Arg | Required | Default | Description | +| :--- | :--- | :--- | :--- | +| logLevel | False | DEBUG | Controls the verbosity of the console output (e.g., `DEBUG`, `INFO`, `WARN`, `ERROR`). | + + +### 0. Registration Example + +The registration example is a precursor to performing any other operations on ETX. This step retrieves a unique **Device ID** and the **mTLS certificates** (CA, Certificate, and Private Key) required to connect. + +**IMPORTANT**: Each vendor ID has a fixed quota of device IDs. Always keep track of your registrations and deregister when finished. + +#### How to Run +```bash +python -m examples.0_registration_example --arg0 value +``` +*Example:* +```bash +python -m examples.0_registration_example --config config.json +``` + +**Output**: This generates a JSON "Identity Artifact" in the `certs/` folder. This file contains everything needed to "re-hydrate" your identity in the following examples. + +#### Supported Arguments + +| Arg | Required | Default | Description | +| :--- | :--- | :--- | :--- | +| certDir| False | ./cert/ | The local directory where security certificates and keys are generated after registration completes. | +| config | False | config.json | The configuration file to use for registration. | + +--- + +### 1. Deregistration Examples + +The deregistration example removes the registered device from ETX. Every vendor ID is has a limited number of device IDs. The deregistration process removes a unique device ID from circulation. This will also remove the files in the folder that contain the registration information. + +#### How to Run + +The command format to run this example (from the project root): +``` +python -m etx.examples.1_deregistration_example --device-file +``` +*Example:* +```bash +python -m examples.1_deregistration_example --device-file ./cert/latest.json +``` + +#### Supported Arguments + +| Arg | Required | Default | Description | +| :--- | :--- | :--- | :--- | +| device-file | False | config.json | The configuration file to use for registration. | + +--- + +### 2. Private Loopback Example + +A diagnostic tool to verify bidirectional private communication. + +1. Connects to the ETX platform and acquires a Session ID. +2. Subscribes to its own unique **Private Topic**. +3. Publishes a BSM to itself to verify the mTLS loop is closed. + +#### How to Run +```bash +python -m examples.2_loopback_example --device-file --count +``` +*Example:* +```bash +python -m examples.2_loopback_example --device-file ./cert/latest.json --count 10 +``` + +| Arg | Required | Default | Description | +| :--- | :--- | :--- | :--- | +| device-file | True | - | The device file to use for ETX connection. | +| count | False | 5 | The number of loopback messages to send. | + +--- + +### 3. Speed Monitor Example (RSU/App) + +Demonstrates a "Virtual Speed Trap" application. +1. **Geohashing**: Subscribes to regional topics by delimiting geohashes (e.g., `d/r/5/r/9/y`). +2. **Real-time Analytics**: Decodes BSMs from all vehicles in the neighborhood. +3. **Targeted Advisory**: If a vehicle exceeds the `--limit`, it sends a **TIM (Traveler Information Message)** warning directly to that specific vehicle's private topic. + +#### How to Run +```bash +python -m examples.3_speedmon_example --device-file --limit +``` +*Example:* +```bash +python -m examples.3_speedmon_example --device-file ./certs/config.json --limit 25.0 +``` + +#### Supported Arguments + +| Arg | Required | Default | Description | +| :--- | :--- | :--- | :--- | +| device-file | True | - | The device file to use for ETX connection. | +| lat | False | - | The default value is defined in the registration config file. | +| lon | False | - | The default value is defined in the registraiton config file. | +| limit | False | 25 | The speed limit in mph to send out warnings. | + +--- + +### 4. Vehicle Example (OBU) + +Simulates a mobile entity (On-Board Unit). It demonstrates the "Public Broadcast" pattern used in real-world V2X. +1. **Session Handshake**: Connects and retrieves a Session ID from `vzimp/1/ClientInfo`. +2. **Periodic Broadcast**: Runs a background thread to publish BSMs to the `GeoRelevance` topic at 1Hz. +3. **Regional Listening**: Subscribes to regional safety messages (TIM, SPaT, MAP). + +#### How to Run +```bash +python -m examples.4_vehicle_example --device-file --speed +``` +*Example:* +```bash +python -m examples.4_vehicle_example --device-file ./cert/config.json --speed 50 +``` + +#### Supported Arguments + +| Arg | Required | Default | Description | +| :--- | :--- | :--- | :--- | +| device-file | True | - | The device file to use for ETX connection. | +| lat | False | - | The default value is defined in the registration config file. | +| lon | False | - | The default value is defined in the registraiton config file. | +| speed | False | 30 | The speed in which the vehicle is traveling at. | +--- + +### Install and Running From Source + +It is possible to run the examples directly from this project as well. Check the prequisites for the building the [language bindings here](/README.md#2-source-install). + +```bash +git clone https://github.com/5GRealityLab/etx-starter-kit.git +cd etx-starter-kit +make install-py +cd etx/examples/python +uv run python -m examples.0_registration_example +# OR +# python -m examples.0_registration_example +``` + +--- + +### FAQ + +**What is the difference between Public and Private topics?** Public topics (`GeoRelevance` or `Regional`) are for one-to-many broadcasts based on location. Private topics are for one-to-one communication targeted at a specific `SessionID`. + +**Why use two separate Codecs?** V2X clients are multi-threaded. The MQTT library handles incoming messages on a background thread while your application publishes on the main thread. Using separate `Codec` instances prevents race conditions. + +**How do I clean up my device?** Please refer to the `0_deregistration_example` to remove your device ID from the system and reclaim your quota. diff --git a/etx/examples/python/config.json.example b/etx/examples/python/config.json.example new file mode 100644 index 0000000..317de40 --- /dev/null +++ b/etx/examples/python/config.json.example @@ -0,0 +1,25 @@ +{ + "logLevel": "DEBUG", + "certDir": "./certs", + "endpoints": { + "oauthUrl": "https://thingspace.verizon.com/api/ts/v1/oauth2/token", + "sessionUrl": "https://thingspace.verizon.com/api/m2m/v1/session/login", + "oauthTimeout": 30000, + "registrationUrl": "https://imp.thingspace.verizon.com", + "registrationTimeout": 45000 + }, + "identity": { + "user": "YOUR_THINGSPACE_USERNAME", + "password": "YOUR_THINGSPACE_PASSWORD", + "token": "YOUR_BASE64_ENCODED_APP_TOKEN", + "attributes": { + "clientType": "YOUR_ASSIGNED_CLIENT_TYPE", + "clientSubType": "YOUR_ASSIGNED_SUBTYPE", + "vendorId": "YOUR_ASSIGNED_VENDOR_ID", + "location": { + "lat": 0.0, + "lon": 0.0 + } + } + } +} \ No newline at end of file diff --git a/etx/examples/python/pyproject.toml b/etx/examples/python/pyproject.toml new file mode 100644 index 0000000..3fa28dd --- /dev/null +++ b/etx/examples/python/pyproject.toml @@ -0,0 +1,40 @@ +[project] +name = "examples" +version = "0.2.0" +description = "Reference implementations and sample code for Verizon ETX" +license = "Apache-2.0" +readme = "README.md" +authors = [ + { name = "Sean Hsu", email = "yu.hsiang.sean.hsu@verizon.com" } +] +requires-python = ">=3.9" +dependencies = [ + "j2735codec", + "paho-mqtt>=2.1.0", + "protobuf>=6.33.4", + "python-geohash>=0.8.5", + "requests>=2.32.5", +] + +[dependency-groups] +dev = [ + "ruff>=0.14.11", + "pytest>=8.0.0", +] + +[tool.pytest.ini_options] +pythonpath = "src" +testpaths = ["tests"] + +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[tool.setuptools] +package-dir = {"" = "src"} + +[tool.setuptools.packages.find] +where = ["src"] + +[tool.uv] +package = true \ No newline at end of file diff --git a/etx/examples/python/src/examples/0_registration_example.py b/etx/examples/python/src/examples/0_registration_example.py new file mode 100644 index 0000000..c81172a --- /dev/null +++ b/etx/examples/python/src/examples/0_registration_example.py @@ -0,0 +1,101 @@ +# SPDX-FileCopyrightText: 2025 Verizon +# SPDX-License-Identifier: Apache-2.0 +""" +Registration Example + +Demonstrates how to register a client with the Verizon ETX platform, +retrieving mTLS certificates and MQTT ACL rules. +""" +import json +from pathlib import Path +from datetime import datetime +from dataclasses import asdict + +from examples.utils.config import load_config +from examples.utils.registration import ( + get_connection_details, + get_registration_details, + format_acl_rules, + get_acl_rules, + deregister +) +from examples.utils.oauth import get_thingspace_token +from examples.utils.parser import get_registration_parser +from examples.utils.logger import setup_logging + +def main(): + args = get_registration_parser().parse_args() + + # 1. Load the "Master" Configuration + try: + config = load_config(args.config, args) + except RuntimeError as e: + print(f"CRITICAL: {e}") + return + + logger = setup_logging("registration_example", config.logLevel) + + token_pair = None + device_id = None + + try: + # 2. Handshake & Registration + logger.info("Retrieving ThingSpace tokens...") + token_pair = get_thingspace_token(config) + + logger.info("Fetching live MQTT ACL rules...") + acl_rules = get_acl_rules(config, token_pair) + + # Print the ACLs nicely for the user, just FYI + logger.debug("\n%s", format_acl_rules(acl_rules)) + + logger.info("Performing device registration with Verizon...") + reg_resp = get_registration_details(config, token_pair) + device_id = reg_resp.device_id + + # Print the connection URL for the user, just FYI + details = get_connection_details(config, token_pair, device_id) + logger.debug("Connection URL: %s\n", details.mqtt_url) + + # --- REGISTRATION COMPLETE --- + # The following logic persists the identity and 'freezes' the config. + + # 3. Create identities directory + cert_dir = Path(config.certDir) + cert_dir.mkdir(parents=True, exist_ok=True) + + # Generate a clean, short filename + short_id = device_id[:8] + timestamp = datetime.now().strftime("%Y%m%d_%H%M") + filename = f"{timestamp}_{short_id}.json" + output_file = cert_dir / filename + + # 4. Create the Frozen Bundle + # We combine the new registration data with the current configuration + frozen_bundle = { + "registration": asdict(reg_resp), # Includes certs, urls, and expiration + "frozen_config": asdict(config), # Snapshot of the config used to create this + } + + # Cleanup: Ensure datetime is string-serializable + frozen_bundle["registration"]["certificate"]["expiration_time"] = \ + reg_resp.certificate.expiration_time.isoformat() + + # 5. Save the Bundle + with open(output_file, "w", encoding="utf-8") as f: + json.dump(frozen_bundle, f, indent=4) + + logger.info("Identity artifact sealed: %s", output_file) + + except Exception as e: + logger.error("Registration failed: %s", e) + if device_id and token_pair: + logger.info("Attempting cleanup/deregistration for ID: %s", device_id) + try: + token_pair = get_thingspace_token(config) + deregister(config, token_pair, device_id) + except Exception as de: + logger.error("Cleanup failed: %s", de) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/etx/examples/python/src/examples/1_deregistration_example.py b/etx/examples/python/src/examples/1_deregistration_example.py new file mode 100644 index 0000000..2289bfe --- /dev/null +++ b/etx/examples/python/src/examples/1_deregistration_example.py @@ -0,0 +1,66 @@ +# SPDX-FileCopyrightText: 2025 Verizon +# SPDX-License-Identifier: Apache-2.0 +""" +Deregistration Example + +This script removes a device's cloud registration using its frozen configuration +and deletes the local identity artifact. +""" +import json +from pathlib import Path + +from examples.utils.logger import setup_logging +from examples.utils.parser import get_operational_parser +from examples.utils.registration import deregister +from examples.utils.oauth import get_thingspace_token +from examples.utils.config import load_config + +def main(): + # 1. Parse Arguments (Retrieves --device-file and --log-level) + args = get_operational_parser().parse_args() + + # 2. Load the Device Identity Artifact + device_path = Path(args.device_file).resolve() + try: + with open(device_path, "r", encoding="utf-8") as f: + artifact = json.load(f) + + # We pass the nested "frozen_config" dict directly into your existing logic. + # This re-hydrates the AppConfig dataclass and applies CLI log-level overrides. + config = load_config(artifact["frozen_config"], args) + + # grab device ID + device_id = artifact["registration"]["device_id"] + + except FileNotFoundError: + print(f"CRITICAL: Device file not found at {args.device_file}") + return + except (json.JSONDecodeError, KeyError, RuntimeError) as e: + print(f"CRITICAL: Failed to load device configuration from artifact: {e}") + return + + # 3. Setup Logging using the config (including any CLI overrides) + logger = setup_logging("deregistration_example", config.logLevel) + + try: + # 5. Authenticate + # Uses the frozen credentials stored inside the identity file + logger.info("Retrieving ThingSpace tokens for deregistration...") + token_pair = get_thingspace_token(config) + + # 6. Cloud Deregistration + logger.info("Requesting cloud deregistration for Device: %s", device_id) + deregister(config, token_pair, device_id) + logger.info("Cloud deregistration successful.") + + # 7. Local Cleanup + logger.info("Deleting local identity file: %s", device_path.name) + device_path.unlink() + + logger.info("Successfully cleaned up device: %s", device_id) + + except Exception as e: + logger.error("An unexpected error occurred during deregistration: %s", e) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/etx/examples/python/src/examples/2_loopback_example.py b/etx/examples/python/src/examples/2_loopback_example.py new file mode 100644 index 0000000..7bbcbbc --- /dev/null +++ b/etx/examples/python/src/examples/2_loopback_example.py @@ -0,0 +1,238 @@ +# SPDX-FileCopyrightText: 2025 Verizon +# SPDX-License-Identifier: Apache-2.0 +""" +Simple ETX Loopback Example + +This script demonstrates a full bidirectional communication flow: +1. Loads a device identity (certs and configuration) from a JSON artifact. +2. Establishes a secure mTLS connection to the Verizon ETX platform. +3. Obtains a Session ID via the ClientInfo topic. +4. Performs a loopback test by subscribing to a private topic and publishing + J2735 Basic Safety Messages (BSM) to itself. +""" +import json +import threading +import time +from pathlib import Path +from logging import Logger + +from j2735codec import Codec, GeoRoutedHeader + +from examples.utils.registration import RegistrationResponse +from etx.examples.python.src.examples.utils.message import BSMGenerator, MessageGenerator +from examples.utils.client import ETXClient, create_etx_client +from examples.utils.parser import get_geoaware_parser +from examples.utils.config import Location, load_config +from examples.utils.logger import setup_logging + +# ETX System topic used to retrieve the unique Session ID for the current connection +CLIENT_INFO_TOPIC = "vzimp/1/ClientInfo" + +class LoopbackClient: + """ + Handles the orchestration of the ETX connection, subscription, + and message loopback logic. + """ + + def __init__( + self, + etx_client: ETXClient, + msg_generator: MessageGenerator, + logger: Logger, + location: Location, + count: int): + """ + Initializes the Loopback Client with separate codecs for safety. + + Args: + etx_client: The authenticated ETX MQTT client. + msg_generator: Utility to generate J2735 JER (JSON) payloads. + logger: Configured logger for console output. + location: The geographic coordinates of the device. + count: Total number of loopback messages to send/receive. + """ + self._client = etx_client + self._generator = msg_generator + self._logger = logger + self._location = location + self._count = count + self._received_count = 0 + + # Best Practice: Isolated codecs for the transmit (encode) and receive (decode) paths. + # This ensures thread safety as MQTT callbacks run on a background thread. + self._encode_codec = Codec() + self._decode_codec = Codec() + + self._exit_event = threading.Event() + self.session_id = None + + def run(self): + """ + Primary execution entry point. Connects to ETX and blocks + until all messages are received or the user terminates the script. + """ + try: + self._logger.info("Connecting to ETX Platform...") + # Set up the connection and define behavior for unexpected disconnects + self._client.connect( + [self._on_connect], + [lambda c: self._logger.info("Connection closed to the ETX broker.")] + ) + + # Start a background listener so the user can hit Enter to quit at any time + input_thread = threading.Thread(target=self._wait_for_user, daemon=True) + input_thread.start() + + self._logger.info("Publishing %d messages. Press [ENTER] to exit early.", self._count) + + # This blocks the main thread until self._exit_event.set() is called + self._exit_event.wait() + self._logger.info("Finalizing session and shutting down...") + finally: + if self._client: + self._client.disconnect() + + def _wait_for_user(self): + """ + Private method: Runs in a background thread to allow manual exit. + """ + input() + self._logger.info("User-initiated shutdown requested.") + self._exit_event.set() + + def _on_connect(self, client: ETXClient): + """ + Private Callback: Triggered when the MQTT mTLS handshake is successful. + """ + self._logger.info("mTLS Secure Connection established.") + self._logger.info("Step 1: Fetching Session ID from %s", CLIENT_INFO_TOPIC) + client.subscribe(CLIENT_INFO_TOPIC, self._on_client_info) + + def _on_client_info(self, topic, payload): + """ + Private Callback: Handles the system message containing the Session ID. + """ + try: + data = json.loads(payload.decode('utf-8')) + self.session_id = data.get('SessionID') + self._logger.info("Step 2: Session ID acquired: %s", self.session_id) + + # Clean up system subscription + self._client.unsubscribe(CLIENT_INFO_TOPIC) + + # Start the loopback test + self._start_test() + except Exception as e: + self._logger.error("Failed to extract Session ID: %s", e) + self._exit_event.set() + + def _start_test(self): + """ + Private method: Sets up the loopback subscriptions and starts the + publication loop. + """ + c_type = self._client.client_type + c_sub = self._client.client_subtype + v_id = self._client.vendor_id + + # Subscription Topic: vzimp/1/Private////+/+/ + sub_topic = f"vzimp/1/Private/{c_type}/{c_sub}/{v_id}/+/+/{self.session_id}" + + # Publication Topic: vzimp/1/Private/////j2735_gr/BSM + pub_topic = f"vzimp/1/Private/{self.session_id}/{c_type}/{c_sub}/{v_id}/j2735_gr/BSM" + + self._logger.info("Step 3: Subscribing to self: %s", sub_topic) + self._client.subscribe(sub_topic, self._on_message_received) + + # Minor delay to ensure the broker has registered the subscription + time.sleep(1) + + for i in range(self._count): + if self._exit_event.is_set(): + break + self._publish_bsm(pub_topic, i + 1) + time.sleep(1) + + def _publish_bsm(self, topic, index): + """ + Private method: Encapsulates the encoding and publishing of a BSM. + Uses the dedicated ENCODE codec. + """ + try: + hdr = GeoRoutedHeader(self._location.lat, self._location.lon) + + # Generate the J2735 message structure + raw_json = self._generator.get( + lat=self._location.lat, + lon=self._location.lon, + device_id=self.session_id[:8] if self.session_id else "00000000" + ) + + # Convert JSON to Wire Binary using the Encode Codec + binary_payload = self._encode_codec.encode_etx(raw_json, hdr) + + self._client.publish(topic, binary_payload) + self._logger.info("[%d/%d] Message published to ETX", index, self._count) + except Exception as e: + self._logger.error("Encoding/Publish error: %s", e) + self._exit_event.set() + + def _on_message_received(self, topic, payload): + """ + Private Callback: Triggered when a message is received on the loopback topic. + Uses the dedicated DECODE codec. + """ + try: + # Decode Binary to JSON using the Decode Codec + decoded = self._decode_codec.decode_etx(payload) + self._logger.debug("<<< Received Loopback Content: \n%s", decoded.decode()) + + self._received_count += 1 + self._logger.info("<<< Received Loopback message %d/%d", self._received_count, self._count) + + if self._received_count >= self._count: + self._logger.info("Loopback test completed successfully!") + self._exit_event.set() + except Exception as e: + self._logger.error("Decode error: %s", e) + +if __name__ == "__main__": + parser = get_geoaware_parser() + parser.add_argument("--count", type=int, default=5, help="Messages to send") + args = parser.parse_args() + + device_path = Path(args.device_file).resolve() + try: + with open(device_path, "r") as f: + artifact = json.load(f) + + if "frozen_config" not in artifact or "registration" not in artifact: + raise RuntimeError("Invalid identity file. Please re-register the device.") + + # Hydrate the configuration + config = load_config(artifact["frozen_config"], args) + logger = setup_logging("loopback_example", config.logLevel) + + # Instantiate the ETX client with a re-hydrated RegistrationResponse object + etx_client = create_etx_client( + config, + RegistrationResponse(**artifact["registration"]) + ) + + # Initialize the message template generator + bsm_gen = BSMGenerator() + + # Execute Loopback + lb = LoopbackClient( + etx_client, + bsm_gen, + logger, + config.identity.attributes.location, + args.count + ) + lb.run() + + except KeyboardInterrupt: + pass + except Exception as e: + print(f"CRITICAL ERROR: {e}") diff --git a/etx/examples/python/src/examples/3_speedmon_example.py b/etx/examples/python/src/examples/3_speedmon_example.py new file mode 100644 index 0000000..e7629cd --- /dev/null +++ b/etx/examples/python/src/examples/3_speedmon_example.py @@ -0,0 +1,203 @@ +# SPDX-FileCopyrightText: 2026 Verizon +# SPDX-License-Identifier: Apache-2.0 +""" +ETX Speed Monitor Example + +This script acts as a "Virtual Speed Trap" or Roadside Unit (RSU) simulator: +1. Subscribes to regional "Public" BSM broadcasts using geohash-based topic paths. +2. Decodes real-time vehicle telemetry (Basic Safety Messages). +3. Compares vehicle speed against a threshold. +4. If a violation is detected, it generates a J2735 Traveler Information Message (TIM). +5. Targets the speeding vehicle specifically by publishing to its "Private" topic. +""" +import json +import logging +import threading +from pathlib import Path + +import geohash +from j2735codec import Codec, GeoRoutedHeader + +from examples.utils.registration import RegistrationResponse +from examples.utils.message import TIMGenerator +from examples.utils.client import ETXClient, create_etx_client +from examples.utils.parser import get_geoaware_parser +from examples.utils.config import load_config +from examples.utils.logger import setup_logging + +# SAE J2735 Standard: Speed is transmitted in units of 0.02 m/s +BSM_SPEED_UNIT = 0.02 +MPH_TO_MS = 0.44704 + +class SpeedMonitorClient: + """ + Monitors regional vehicle traffic and issues targeted safety warnings. + + This client demonstrates 'Geo-Aware' subscription logic where only messages + from a specific geographic neighborhood are processed. + """ + + def __init__(self, etx_client: ETXClient, config, limit_mph: float, logger: logging.Logger): + """ + Initializes the monitor with configuration and threshold. + + Args: + etx_client: Authenticated ETX MQTT client. + config: Hydrated AppConfig (contains RSU location). + limit_mps: Speed limit threshold in miles per hour. + logger: Standardized logger. + """ + self._client = etx_client + self._config = config + self._logger = logger + + # Convert metric speed to the J2735 integer format for direct comparison + self._j2735_limit = int(limit_mph * MPH_TO_MS / BSM_SPEED_UNIT) + + # Thread Safety: Use separate codecs for the RX (Listening) and TX (Warning) paths. + # This prevents collisions between the MQTT callback thread and potential + # main-thread interactions. + self._decode_codec = Codec() + self._encode_codec = Codec() + + # J2735 TIM generator for advisory messages (ITIS code 3343: Speeding) + self._tim_gen = TIMGenerator() + self._exit_event = threading.Event() + + def run(self): + """ + Establishes connection and begins monitoring. + Blocks the main thread to allow the MQTT callbacks to handle incoming BSMs. + """ + try: + self._logger.info("Initializing Regional Speed Monitor...") + self._client.connect( + [self._on_connect], + [lambda c: self._logger.info("Regional Monitor disconnected.")] + ) + + print("\n>>> SPEED MONITOR ACTIVE. Press [ENTER] to stop. <<<\n") + # Blocks here; callbacks run in the background + input() + self._exit_event.set() + finally: + if self._client: + self._client.disconnect() + + def _on_connect(self, client: ETXClient): + """ + Private Callback: Triggered on connection. + Calculates geohash neighbors to listen for all vehicles in the vicinity. + """ + lat = self._config.identity.attributes.location.lat + lon = self._config.identity.attributes.location.lon + + # Geohash precision 6 covers roughly 1.2km x 0.6km + middle = geohash.encode(lat, lon, precision=6) + # Listen to the current cell plus all 8 adjacent cells + hashes = geohash.neighbors(middle) + [middle] + + for ghash in hashes: + # ETX Convention: Geohashes in topics must be delimited by '/' + # Example: 'abcdef' -> 'a/b/c/d/e/f' + ghash_path = "/".join(ghash) + + # Topic Pattern: Regional///Public/j2735_gr/BSM/ + # The trailing '+' wildcard captures all unique vehicle sessions in this region. + topic = f"vzimp/1/Regional/{ghash_path}/+/+/+/+/Public/j2735_gr/+/+" + client.subscribe(topic, self._on_bsm_received) + self._logger.debug("Monitoring Regional Path: %s", ghash_path) + + def _on_bsm_received(self, topic: str, payload: bytes): + """ + Private Callback: Processes every BSM received in the monitored regions. + + Args: + topic: The specific regional topic (contains sender's SessionID). + payload: GeoRouted ETX binary envelope containing a BSM. + """ + try: + # 1. Decode ETX Binary -> J2735 JER (JSON) + decoded_json = self._decode_codec.decode_etx(payload) + bsm = json.loads(decoded_json.decode()) + + core_data = bsm["value"]["coreData"] + speed = core_data.get("speed", 0) + + # 2. Identify the vehicle. In ETX, the last segment of the topic + # is always the sender's SessionID. + sender_session = topic.split("/")[-1] + + # 3. Check for violation + actual_mps = speed * BSM_SPEED_UNIT / MPH_TO_MS + if speed > self._j2735_limit: + self._logger.warning("VIOLATION: Vehicle %s at %.2f mph", sender_session[:8], actual_mps) + + # J2735 Lats/Lons are stored as integers (degrees * 10^7) + v_lat = core_data["lat"] / 10000000 + v_lon = core_data["long"] / 10000000 + + # 4. Issue a targeted warning + self._send_warning(sender_session, v_lat, v_lon) + else: + self._logger.debug("Vehicle %s at %.2f mph, under the limit", sender_session[:8], actual_mps) + + except Exception as e: + self._logger.error("BSM Processing Error: %s", e) + + def _send_warning(self, session_id: str, lat: float, lon: float): + """ + Generates and sends a TIM warning. + + The message is sent to the 'Private' topic of the specific vehicle, + ensuring only that driver receives the advisory. + """ + try: + # Topic Pattern: Private/////j2735_gr/TIM + pub_topic = ( + f"vzimp/1/Private/{session_id}/{self._client.client_type}/" + f"{self._client.client_subtype}/{self._client.vendor_id}/j2735_gr/TIM" + ) + + # The GeoHeader defines the center of the warning's geographic relevance + hdr = GeoRoutedHeader(lat, lon) + + # Generate the JER JSON for the TIM warning + raw_json = self._tim_gen.get(lat=lat, lon=lon) + + # Encode to ETX binary format + binary_payload = self._encode_codec.encode_etx(raw_json, hdr) + + # 5. Execute targeted publish + self._client.publish(pub_topic, binary_payload) + self._logger.info(">>> Issued Private TIM Warning to %s", session_id[:8]) + except Exception as e: + self._logger.error("Failed to transmit TIM: %s", e) + +if __name__ == "__main__": + # Parser handles --device-file, --loglevel, and geographic overrides + parser = get_geoaware_parser() + parser.add_argument("--limit", type=float, default=25.0, help="Speed limit in mph") + args = parser.parse_args() + + try: + # Load the device artifact (Certs + Config) + device_path = Path(args.device_file).resolve() + with open(device_path, "r") as f: + artifact = json.load(f) + + # Re-hydrate the AppConfig and setup nice colored logging + config = load_config(artifact["frozen_config"], args) + logger = setup_logging("speedmon_example", config.logLevel) + + # Critically convert the plain dictionary to a structured RegistrationResponse object + reg_obj = RegistrationResponse(**artifact["registration"]) + + # Initialize the ETX client and start the monitor + etx_client = create_etx_client(config, reg_obj) + logger.debug("Setting speed limit: %d mph", args.limit) + monitor = SpeedMonitorClient(etx_client, config, args.limit, logger) + monitor.run() + + except Exception as e: + print(f"CRITICAL ERROR: {e}") \ No newline at end of file diff --git a/etx/examples/python/src/examples/4_vehicle_example.py b/etx/examples/python/src/examples/4_vehicle_example.py new file mode 100644 index 0000000..d841a2d --- /dev/null +++ b/etx/examples/python/src/examples/4_vehicle_example.py @@ -0,0 +1,226 @@ +# SPDX-FileCopyrightText: 2026 Verizon +# SPDX-License-Identifier: Apache-2.0 +""" +ETX Vehicle Example + +This script simulates a connected vehicle (OBU) lifecycle: +1. Identity: Loads mTLS certificates and configuration from a frozen JSON. +2. Connectivity: Establishes a secure connection to the Verizon ETX platform. +3. Session: Retrieves a unique SessionID from the ClientInfo topic. +4. Inbound: Subscribes to regional safety alerts (TIM) and signal data (SPaT). +5. Outbound: Runs a dedicated thread to broadcast BSM telemetry every second. +""" + +import json +import logging +import threading +import time +from pathlib import Path + +from j2735codec import Codec, GeoRoutedHeader + +from examples.utils.registration import RegistrationResponse +from examples.utils.message import BSMGenerator +from examples.utils.client import ETXClient, create_etx_client +from examples.utils.parser import get_geoaware_parser +from examples.utils.config import AppConfig, load_config +from examples.utils.logger import setup_logging + +# ETX System topic used to retrieve the unique SessionID for the current connection +CLIENT_INFO_TOPIC = "vzimp/1/ClientInfo" + +# SAE J2735 Standard: Speed is transmitted in units of 0.02 m/s +BSM_SPEED_UNIT = 0.02 +MPH_TO_MS = 0.44704 + +class VehicleClient: + """ + Orchestrates the vehicle's V2X identity and communication. + + This class manages a background thread for periodic broadcasting and + handles asynchronous MQTT callbacks for incoming messages. + """ + + # V2X Topic Schema: + # Private = Direct 1-to-1 messages (e.g., speed warnings) + # GeoRelevance = 1-to-Many regional broadcasts (e.g., traffic alerts) + SUB_TOPICS = [ + "vzimp/1/Private/+/+/+/j2735_gr/+/+", + "vzimp/1/GeoRelevance/+/+/Public/j2735_gr/TIM/+", + "vzimp/1/GeoRelevance/+/+/Public/j2735_gr/SPAT/+", + "vzimp/1/GeoRelevance/+/+/Public/j2735_gr/MAP/+", + ] + + def __init__( + self, + etx_client: ETXClient, + config: AppConfig, + reg_details: RegistrationResponse, + speed: float, + logger: logging.Logger): + """ + Initializes the vehicle client with isolated resources. + """ + self._client = etx_client + self._config = config + self._reg_details = reg_details + self._speed = int(speed * MPH_TO_MS / BSM_SPEED_UNIT) + self._logger = logger + + # Best Practice: Use separate codecs to prevent race conditions + # between the Main/Pub thread and the MQTT Background callback thread. + self._encode_codec = Codec() + self._decode_codec = Codec() + + # Template generator for standard J2735 BSM packets + self._generator = BSMGenerator() + + # Synchronization primitives for thread management + self._exit_event = threading.Event() # Signals app shutdown + self._connected_event = threading.Event() # Pauses BSM loop if MQTT drops + self._pub_thread = None + self.session_id = None + + def run(self): + """ + Main entry point. Starts the MQTT client and the broadcast thread. + Blocks the main thread until the user requests an exit via [ENTER]. + """ + try: + self._logger.info("Initializing Vehicle OBU...") + self._client.connect( + [self._on_connect], + [self._on_disconnect] + ) + + self._logger.info("VEHICLE ACTIVE. Press [ENTER] to stop.") + input() + self._exit_event.set() + finally: + if self._client: + self._client.disconnect() + + def _on_connect(self, client: ETXClient): + """ + Private Callback: Triggered by the MQTT library upon successful connection. + First step is to retrieve the SessionID. + """ + self._logger.info("mTLS Handshake successful. Fetching Session ID...") + client.subscribe(CLIENT_INFO_TOPIC, self._on_client_info) + + def _on_client_info(self, topic, payload): + """ + Private Callback: Handles the system message containing the SessionID. + Transitions the vehicle to active broadcasting mode. + """ + try: + data = json.loads(payload.decode('utf-8')) + self.session_id = data.get('SessionID') + self._logger.info("Vehicle Session ID acquired: %s", self.session_id) + + # Clean up system subscription + self._client.unsubscribe(CLIENT_INFO_TOPIC) + + # Now that we have a session, enable the broadcast loop and subscriptions + self._connected_event.set() + self._start_services() + except Exception as e: + self._logger.error("Failed to acquire Session ID: %s", e) + self._exit_event.set() + + def _start_services(self): + """ + Subscribes to safety streams and starts the periodic BSM broadcast thread. + """ + # Subscribe to safety streams + for topic in self.SUB_TOPICS: + self._client.subscribe(topic, self._on_message_received) + self._logger.debug("Active Subscription: %s", topic) + + # Spawn the broadcast thread if it hasn't started + if not self._pub_thread: + self._pub_thread = threading.Thread(target=self._publish_loop, daemon=True) + self._pub_thread.start() + + def _on_disconnect(self, client: ETXClient): + """ + Private Callback: Triggered if the connection is lost. + Forces the publication loop to pause. + """ + self._logger.warning("Network connection lost. Pausing broadcast loop.") + self._connected_event.clear() + + def _on_message_received(self, topic, payload): + """ + Private Callback: Processes inbound V2X messages (TIM, SPaT, etc). + """ + try: + decoded = self._decode_codec.decode_etx(payload) + msg_type = topic.split('/')[-2] + self._logger.info("<<< INBOUND [%s]: %s", msg_type, decoded.decode()) + except Exception as e: + self._logger.error("Codec Error on topic %s: %s", topic, e) + + def _publish_loop(self): + """ + Background Loop: Generates and publishes BSMs at a fixed interval. + """ + pub_topic = ( + f"vzimp/1/GeoRelevance/{self._client.client_type}/" + f"{self._client.client_subtype}/Public/j2735_gr/BSM" + ) + + while not self._exit_event.is_set(): + # Wait for connection and SessionID acquisition + if not self._connected_event.wait(timeout=1.0): + continue + + try: + # 1. Capture current vehicle state + lat = self._config.identity.attributes.location.lat + lon = self._config.identity.attributes.location.lon + + # 2. Generate JER JSON with current telemetry + # Note: session_id[:8] can be used if you want to override the BSM ID + raw_json = self._generator.get( + lat=lat, + lon=lon, + speed=self._speed, + ) + + # 3. Add GeoHeader for regional routing and transcode to binary + hdr = GeoRoutedHeader(lat, lon) + binary_payload = self._encode_codec.encode_etx(raw_json, hdr) + + # 4. Transmit to the platform + self._client.publish(pub_topic, binary_payload) + self._logger.debug(">>> Sent BSM (Seq: %d)", self._generator.msg_cnt) + + time.sleep(1) + + except Exception as e: + self._logger.error("Critical error in BSM loop: %s", e) + time.sleep(2) + +if __name__ == "__main__": + parser = get_geoaware_parser() + parser.add_argument("--speed", type=float, default=30.0, help="Speed in mph") + args = parser.parse_args() + + try: + device_path = Path(args.device_file).resolve() + with open(device_path, "r") as f: + artifact = json.load(f) + + config = load_config(artifact["frozen_config"], args) + logger = setup_logging("vehicle_example", config.logLevel) + reg_obj = RegistrationResponse(**artifact["registration"]) + + etx_client = create_etx_client(config, reg_obj) + # Passing reg_obj to constructor for consistency, though currently unused in logic + logger.debug("Setting speed: %d mph", args.speed) + vehicle = VehicleClient(etx_client, config, reg_obj, args.speed, logger) + vehicle.run() + + except Exception as e: + print(f"CRITICAL SYSTEM FAILURE: {e}") \ No newline at end of file diff --git a/etx/examples/python/src/examples/__init__.py b/etx/examples/python/src/examples/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/etx/examples/python/src/examples/utils/__init__.py b/etx/examples/python/src/examples/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/etx/examples/python/src/examples/utils/client.py b/etx/examples/python/src/examples/utils/client.py new file mode 100644 index 0000000..dcf79a3 --- /dev/null +++ b/etx/examples/python/src/examples/utils/client.py @@ -0,0 +1,226 @@ +# SPDX-FileCopyrightText: 2025 Verizon +# SPDX-License-Identifier: Apache-2.0 +""" +ETX Client Creation Module. + +This module provides the high-level ETXClient which manages ACL-validated +MQTT communications and the factory function to initialize it from local files. +""" +import logging +import json +from pathlib import Path +from datetime import datetime +from typing import List, Sequence, Set +from enum import Enum + +from examples.utils.mqtt import MQTTClient +from examples.utils.registration import ACLRule, Certificate, RegistrationResponse, get_acl_rules, get_connection_details +from examples.utils.config import AppConfig +from examples.utils.oauth import get_thingspace_token + +class DataDirection(Enum): + """ + Enum representing the direction of MQTT data flow. + Used for ACL validation during Publish or Subscribe attempts. + """ + PUB = "pub" + SUB = "sub" + +class ETXClient(MQTTClient): + """ + High-level ETX Client that adds ACL validation on top of the base MQTTClient. + + This class ensures that every publish or subscribe attempt is cross-referenced + against the rules fetched from the Verizon ETX platform during registration. + """ + def __init__( + self, + conf: AppConfig, + url: str, + client_id: str, + certificate: Certificate, + acl_rules: List[ACLRule], + connect_timeout: int = 3 + ): + """ + Initializes the ETX Client with specific ACL enforcement. + + Args: + conf: The validated AppConfig object. + url: The assigned MQTT broker URL. + client_id: The unique ETX DeviceID. + certificate: mTLS credentials. + acl_rules: List of ACLRule objects defining permitted topics. + connect_timeout: Seconds to wait for initial handshake. + """ + super().__init__( + url=url, + client_id=client_id, + certificate=certificate, + connect_timeout=connect_timeout + ) + self._conf = conf + self._acl_rules = acl_rules + + # Caches to avoid re-running regex/parsing for already validated topics + self._pub_topic_cache: Set[str] = set() + self._sub_topic_cache: Set[str] = set() + + # Extract identity metadata from the first ACL rule name (Verizon specific format) + # Usually formatted as "rule:namespace.clientType.clientSubtype.vendorId" + try: + profile_string = acl_rules[0].name.split(":")[-1] + parts = profile_string.split(".") + self.vendor_id = parts[-1] + self.client_subtype = parts[-2] + self.client_type = parts[-3] + except (IndexError, AttributeError): + logging.warning("ETXClient: Could not parse identity metadata from ACL rule name.") + + def _check_acl(self, direction: DataDirection, topic: str) -> bool: + """ + Internal check to verify if a topic is permitted under current ACL rules. + + Args: + direction: DataDirection.PUB or DataDirection.SUB. + topic: The MQTT topic string to validate. + + Returns: + bool: True if permitted, False otherwise. + """ + for rule in self._acl_rules: + # Select the appropriate topic list based on direction + allowed_patterns = rule.publish if direction == DataDirection.PUB else rule.subscribe + + if match_rules(allowed_patterns, topic): + return True + return False + + def publish(self, topic: str, message: str, qos: int = 0) -> bool: + """ + Publishes a message only if the topic is authorized. + + Args: + topic: Destination topic. + message: Message payload. + qos: Quality of Service (0, 1, or 2). + """ + if topic not in self._pub_topic_cache: + if not self._check_acl(DataDirection.PUB, topic): + logging.error("ETX ACL Violation: Publish denied for topic '%s'", topic) + return False + self._pub_topic_cache.add(topic) + + return super().publish(topic, message, qos) + + def subscribe(self, topic: str, callback: callable, qos: int = 0) -> bool: + """ + Subscribes to a topic only if authorized by the ACL. + + Args: + topic: Topic pattern to listen to. + callback: Function to handle incoming messages. + qos: Quality of Service. + """ + if topic not in self._sub_topic_cache: + if not self._check_acl(DataDirection.SUB, topic): + logging.error("ETX ACL Violation: Subscribe denied for topic '%s'", topic) + return False + self._sub_topic_cache.add(topic) + + return super().subscribe(topic, callback, qos) + + def get_subscription_limit(self) -> int: + """Returns the maximum allowed subscriptions from the first ACL rule.""" + return self._acl_rules[0].subscribe_limit if self._acl_rules else 0 + +def match_rules(rules: Sequence[str], input_topic: str) -> bool: + """ + Evaluates an input topic against a list of MQTT-style patterns. + + Supports: + - Exact matches + - Single-level wildcard (*) + - Multi-level wildcard (**) + - Deny prefix (^) + - Logical OR (pipe |) + """ + topic_parts = input_topic.split("/") + + for rule in rules: + matched = True + check_length = True + rule_parts = rule.split("/") + + i = 0 + while i < len(rule_parts): + # Fail if we ran out of topic parts before rule parts + if i >= len(topic_parts): + matched = False + break + + current_rule_part = rule_parts[i] + + # 1. Single-level wildcard (*) + if current_rule_part == "*": + i += 1 + continue + + # 2. Multi-level wildcard (**) - matches everything remaining + if current_rule_part == "**": + check_length = False + matched = True + break + + # 3. Deny logic (^) + is_deny = False + if current_rule_part.startswith("^"): + is_deny = True + current_rule_part = current_rule_part[1:] + + # 4. Pipe logic (|) for multiple options in one level + options = current_rule_part.split("|") + match_found = any(topic_parts[i] == opt for opt in options) + + # logical XOR for deny logic: If it's a deny rule and we matched, fail. + # If it's an allow rule and we didn't match, fail. + if (is_deny and match_found) or (not is_deny and not match_found): + matched = False + break + + i += 1 + + # Final check: unless '**' was used, rule and topic must have same part count + if check_length: + matched = matched and (i == len(topic_parts)) + + if matched: + return True + + return False + +def create_etx_client(conf: AppConfig, reg_details: RegistrationResponse) -> ETXClient: + """ + Factory function to initialize an ETXClient from a registration folder. + + This reads local registration files, fetches a fresh ThingSpace session, + retrieves assigned connection details, and returns a ready-to-use client. + """ + # 1. Get tokens for the live session + token_pair = get_thingspace_token(conf) + + # 2. Fetch MQTT endpoint (Connect logic handles regional routing via Lat/Lon) + conn_resp = get_connection_details(conf, token_pair, reg_details.device_id) + + # 3. Get ACL rules + acl_rules = get_acl_rules(conf, token_pair) + + # 4. Return the initialized client + return ETXClient( + conf=conf, + url=conn_resp.mqtt_url, + client_id=reg_details.device_id, + certificate=Certificate(**reg_details.certificate), + acl_rules=acl_rules, + connect_timeout=10 # Set a slightly longer timeout for cloud handshake + ) \ No newline at end of file diff --git a/etx/examples/python/src/examples/utils/config.py b/etx/examples/python/src/examples/utils/config.py new file mode 100644 index 0000000..8f244e5 --- /dev/null +++ b/etx/examples/python/src/examples/utils/config.py @@ -0,0 +1,139 @@ +# SPDX-FileCopyrightText: 2025 Verizon +# SPDX-License-Identifier: Apache-2.0 +import json +import argparse +from pathlib import Path +from dataclasses import dataclass +from typing import Optional, Union + +# 1. Strict Data Structures (No defaults) +@dataclass +class Location: + lat: float + lon: float + +@dataclass +class Attributes: + clientType: str + clientSubType: str + vendorId: str + location: Location + +@dataclass +class Identity: + user: str + password: str + token: str + attributes: Attributes + +@dataclass +class Endpoints: + oauthUrl: str + sessionUrl: str + oauthTimeout: int + registrationUrl: str + registrationTimeout: int + +@dataclass +class AppConfig: + logLevel: str + certDir: str + endpoints: Endpoints + identity: Identity + +def validate_coordinates(lat: float, lon: float): + """ + Validates WGS84 Latitude and Longitude. + Raises CoordinateError if values are out of bounds. + """ + # Latitude: -90 to 90 + # Longitude: -180 to 180 + if not (-90 <= lat <= 90): + raise RuntimeError(f"Invalid config for latitude: {lat}. Must be between -90 and 90.") + + if not (-180 <= lon <= 180): + raise RuntimeError(f"Invalid config for longitude: {lon}. Must be between -180 and 180.") + +def load_config(config_source: Union[str, Path], args: Optional[argparse.Namespace] = None) -> AppConfig: + """ + Loads JSON and merges CLI overrides. + Catches internal structural errors and re-raises them with human-friendly context. + """ + # 1. Determine the raw data + if isinstance(config_source, (str, Path)): + path = Path(config_source) + if not path.exists(): + raise RuntimeError(f"Config file not found: {path}") + with open(path, 'r') as f: + data = json.load(f) + elif isinstance(config_source, dict): + data = config_source + else: + raise TypeError("config_source must be a path or a dictionary") + + # 2. Catch Missing Key/Attribute Errors during mapping + try: + # Identity & Attributes (Required) + ident_raw = data["identity"] + attr_raw = ident_raw["attributes"] + loc_raw = attr_raw["location"] + + location = Location(lat=loc_raw["lat"], lon=loc_raw["lon"]) + attributes = Attributes( + clientType=attr_raw["clientType"], + clientSubType=attr_raw["clientSubType"], + vendorId=attr_raw["vendorId"], + location=location + ) + identity = Identity( + user=ident_raw["user"], + password=ident_raw["password"], + token=ident_raw["token"], + attributes=attributes + ) + + # Endpoints & Base Config (with Defaults) + end_raw = data.get("endpoints", {}) + endpoints = Endpoints( + oauthUrl=end_raw.get("oauthUrl", "https://thingspace.verizon.com/api/ts/v1/oauth2/token"), + sessionUrl=end_raw.get("sessionUrl", "https://thingspace.verizon.com/api/m2m/v1/session/login"), + oauthTimeout=end_raw.get("oauthTimeout", 30000), + registrationUrl=end_raw.get("registrationUrl", "https://imp.thingspace.verizon.com"), + registrationTimeout=end_raw.get("registrationTimeout", 45000) + ) + + config = AppConfig( + logLevel=data.get("logLevel", "DEBUG"), + certDir=data.get("certDir", "./certs"), + endpoints=endpoints, + identity=identity + ) + + except KeyError as e: + # This catches nested missing keys and turns them into a readable error + raise RuntimeError(f"Missing required configuration field: {e}. Check your config.json structure.") + except TypeError as e: + # This catches if a value is the wrong type (e.g., location is a string instead of a dict) + raise RuntimeError(f"Data type mismatch in config: {e}. Ensure your JSON follows the required schema.") + + # 3. Apply CLI Overrides + if args: + if getattr(args, 'loglevel', None): + config.logLevel = args.loglevel.upper() + + if getattr(args, 'certDir', None): + config.certDir = args.reg_folder + + if getattr(args, "lat", None): + config.identity.attributes.location.lat = args.lat + + if getattr(args, "lon", None): + config.identity.attributes.location.lon = args.lon + + # 4. Check the coordinates are appropriate. + validate_coordinates( + config.identity.attributes.location.lat, + config.identity.attributes.location.lon + ) + + return config \ No newline at end of file diff --git a/etx/examples/python/src/examples/utils/logger.py b/etx/examples/python/src/examples/utils/logger.py new file mode 100644 index 0000000..0ba8ea9 --- /dev/null +++ b/etx/examples/python/src/examples/utils/logger.py @@ -0,0 +1,55 @@ +# SPDX-FileCopyrightText: 2025 Verizon +# SPDX-License-Identifier: Apache-2.0 +import sys +import logging + +def setup_logging(name: str, level: str = "INFO"): + """ + Sets up a simple, colored logger for ETX examples. + Works on macOS, Linux, and Windows. + """ + # Standard ANSI colors (30-series) work best on macOS + CYAN = "\033[36m" + GREEN = "\033[32m" + YELLOW = "\033[33m" + RED = "\033[31m" + BOLD_RED = "\033[1;31m" + RESET = "\033[0m" + + LEVEL_COLORS = { + logging.DEBUG: CYAN, + logging.INFO: GREEN, + logging.WARNING: YELLOW, + logging.ERROR: RED, + logging.CRITICAL: BOLD_RED + } + + class ColorFormatter(logging.Formatter): + def format(self, record): + color = LEVEL_COLORS.get(record.levelno, RESET) + # Time | Level | Name:Func:Line - Message + fmt = f"{color}%(asctime)s | %(levelname)-8s | %(name)s:%(funcName)s:%(lineno)d - %(message)s{RESET}" + formatter = logging.Formatter(fmt, datefmt='%Y-%m-%d %H:%M:%S') + return formatter.format(record) + + # Configure the logger + logger = logging.getLogger(name) + logger.setLevel(level.upper()) + + # Clear existing handlers to avoid duplicates on re-run + if logger.hasHandlers(): + logger.handlers.clear() + + # Create console handler + handler = logging.StreamHandler(sys.stdout) + handler.setFormatter(ColorFormatter()) + logger.addHandler(handler) + + # Mute background noise + logging.getLogger("urllib3").setLevel(logging.WARNING) + logging.getLogger("paho").setLevel(logging.WARNING) + + # Don't send logs to the root logger + logger.propagate = False + + return logger \ No newline at end of file diff --git a/etx/examples/python/src/examples/utils/message.py b/etx/examples/python/src/examples/utils/message.py new file mode 100644 index 0000000..d2f6ca2 --- /dev/null +++ b/etx/examples/python/src/examples/utils/message.py @@ -0,0 +1,172 @@ +# SPDX-FileCopyrightText: 2025 Verizon +# SPDX-License-Identifier: Apache-2.0 +import json +import time +from abc import ABC, abstractmethod + +class MessageGenerator(ABC): + """Base interface for all V2X message templates.""" + + @abstractmethod + def get(self, **kwargs) -> str: + """Returns a JER-encoded JSON string.""" + pass + +class BSMGenerator(MessageGenerator): + """ + Generator for J2735 Basic Safety Messages (BSM). + Tracks state for msgCnt (0-127). + """ + def __init__(self): + self.msg_cnt = -1 + + def get(self, **kwargs) -> str: + """ + Generates a JER-encoded BSM JSON string. + + Available **kwargs: + device_id (str): 4-byte hex string (e.g., "0A0B0C0D"). + lat (float): Latitude in decimal degrees (e.g., 38.9123). + lon (float): Longitude in decimal degrees (e.g., -77.1234). + elev (int): Elevation in decimeters. Default: 300. + speed (int): Speed in units of 0.02 m/s. Default: 150. + heading (int): Heading in units of 0.0125 degrees. Default: 9000. + angle (int): Steering wheel angle. Default: 0. + width (int): Vehicle width in cm. Default: 180. + length (int): Vehicle length in cm. Default: 420. + + Returns: + str: JER-encoded JSON string. + """ + # Increment and wrap msgCnt (0-127) + self.msg_cnt = (self.msg_cnt + 1) % 128 + + # Extract values from kwargs with defaults + device_id = kwargs.get("device_id", "0A0B0C0D") + lat = kwargs.get("lat", 38.9123456) + lon = kwargs.get("lon", -77.1234567) + elev = kwargs.get("elev", 300) + speed = kwargs.get("speed", 150) + heading = kwargs.get("heading", 9000) + angle = kwargs.get("angle", 0) + width = kwargs.get("width", 180) + length = kwargs.get("length", 420) + + bsm_dict = { + "messageId": 20, + "value": { + "coreData": { + "msgCnt": self.msg_cnt, + "id": device_id, + "secMark": 12345, + "lat": int(lat * 10000000), + "long": int(lon * 10000000), + "elev": elev, + "accuracy": {"semiMajor": 50, "semiMinor": 50, "orientation": 0}, + "transmission": "forwardGears", + "speed": speed, + "heading": heading, + "angle": angle, + "accelSet": {"long": 0, "lat": 0, "vert": -127, "yaw": 0}, + "brakes": { + "wheelBrakes": "00", "traction": "on", "abs": "unavailable", + "scs": "unavailable", "brakeBoost": "unavailable", "auxBrakes": "unavailable" + }, + "size": { + "width": width, + "length": length + } + } + } + } + return json.dumps(bsm_dict) + +class TIMGenerator: + """ + Generator for J2735 Traveler Information Messages (TIM). + Matches specific schema with regions, path nodes, and padding fields. + """ + def __init__(self, default_itis=3343): + self.msg_cnt = 0 + self.default_itis = default_itis + + def get(self, **kwargs) -> str: + """ + Generates a JER-encoded TIM JSON string matching the provided template. + """ + self.msg_cnt = (self.msg_cnt + 1) % 128 + J2735_SCALE = 10000000 + + # Coordinates for the RoadSign position + lat = int(kwargs.get("lat", 34.0551196) * J2735_SCALE) + lon = int(kwargs.get("lon", -84.2760493) * J2735_SCALE) + + # Minute of the year (0-527040) + timestamp = int((time.time() / 60) % 527040) + + # ITIS codes: Defaults to Speeding (3343) and Vehicle (13583) + itis_list = kwargs.get("itis_codes", [self.default_itis, 13583]) + content_items = [{"item": {"itis": code}} for code in itis_list] + + # Use provided path nodes or a default small box if none provided + # Nodes should be passed as [{'lat': 34.2, 'lon': -84.1}, ...] + path_nodes = kwargs.get("path", [ + {"lat": 34.2069324, "lon": -84.1985514}, + {"lat": 34.2015808, "lon": -84.1976939} + ]) + + nodes_json = [] + for node in path_nodes: + # Note: Ensure these are already scaled or scale them here + n_lat = int(node['lat'] * J2735_SCALE) if node['lat'] < 1000 else node['lat'] + n_lon = int(node['lon'] * J2735_SCALE) if node['lon'] < 0 and node['lon'] > -180 else node['lon'] + nodes_json.append({ + "delta": { + "node-LatLon": {"lon": n_lon, "lat": n_lat} + } + }) + + tim_dict = { + "messageId": 31, + "value": { + "msgCnt": self.msg_cnt, + "timeStamp": timestamp, + "packetID": kwargs.get("packet_id", "340850DE403C715CE9"), + "urlB": "null", + "dataFrames": [{ + "doNotUse1": 0, + "frameType": "advisory", + "msgId": { + "roadSignID": { + "position": {"lat": lat, "long": lon}, + "viewAngle": "FFFF", + "mutcdCode": "warning" + } + }, + "startYear": 2026, # Current Year + "startTime": timestamp, + "durationTime": kwargs.get("duration", 28800), + "priority": kwargs.get("priority", 5), + "doNotUse2": 0, + "regions": [{ + "description": { + "path": { + "offset": { + "ll": { + "nodes": nodes_json + } + } + } + } + }], + "doNotUse3": 0, + "doNotUse4": 0, + "content": { + "advisory": content_items + }, + "url": "null" + }] + } + } + + return json.dumps(tim_dict) \ No newline at end of file diff --git a/etx/examples/python/src/examples/utils/mqtt.py b/etx/examples/python/src/examples/utils/mqtt.py new file mode 100644 index 0000000..d619490 --- /dev/null +++ b/etx/examples/python/src/examples/utils/mqtt.py @@ -0,0 +1,249 @@ +# SPDX-FileCopyrightText: 2025 Verizon +# SPDX-License-Identifier: Apache-2.0 +import os +import tempfile +import logging +from dataclasses import dataclass +from typing import Callable, List, Dict, Optional, Any +from urllib.parse import urlparse +import paho.mqtt.client as mqtt +from examples.utils.registration import Certificate + +# Type aliases for enhanced readability +MQTTMessageCallback = Callable[[str, bytes], None] +MQTTEventCallback = Callable[['MQTTClient'], None] + +@dataclass +class MQTTConfig: + """ + Internal data container for MQTT connection parameters. + + Attributes: + broker_address: Hostname of the Verizon regional broker. + port: Connection port (typically 8883 for mTLS). + client_id: Unique ETX DeviceID. + certificate: The Certificate dataclass containing PEM strings. + connect_timeout: Seconds to wait for initial handshake. + """ + broker_address: str + port: int + client_id: str + certificate: Certificate + connect_timeout: int = 3 + +class MQTTClient: + """ + A high-level wrapper for Paho MQTT with integrated mTLS management. + + This class handles the complexity of temporary certificate file lifecycles, + background threading, and mapping MQTT topics to specific Python callbacks. + """ + + def __init__( + self, + url: str, + client_id: str, + certificate: Certificate, + connect_timeout: int = 3 + ): + """ + Initializes the MQTT Client by parsing the broker URL. + + Args: + url: The broker URL (e.g., 'mqtts://broker.hostname.com:8883'). + client_id: The unique identifier for this MQTT session. + certificate: Certificate object containing CA, Cert, and Key PEMs. + connect_timeout: How long to wait for the connection to be established. + """ + parsed = urlparse(url) + if not parsed.hostname or not parsed.port: + raise ValueError(f"Invalid MQTT URL: {url}. Port and Hostname are required.") + + # Store configuration in a clean dataclass + self.config = MQTTConfig( + broker_address=parsed.hostname, + port=parsed.port, + client_id=client_id, + certificate=certificate, + connect_timeout=connect_timeout + ) + + # Initialize Paho Client with Version 1 API + self.client = mqtt.Client( + callback_api_version=mqtt.CallbackAPIVersion.VERSION1, + client_id=self.config.client_id, + clean_session=True + ) + + # Internal state management + self.is_connected = False + self._temp_files: List[str] = [] + self._topic_callbacks: Dict[str, Callable] = {} + self._connect_callbacks: List[MQTTEventCallback] = [] + self._disconnect_callbacks: List[MQTTEventCallback] = [] + + # Map internal Paho events to private methods + self.client.on_connect = self._on_connect + self.client.on_disconnect = self._on_disconnect + self.client.on_subscribe = self._on_subscribe + + def _on_connect(self, client: mqtt.Client, userdata: Any, flags: Dict, rc: int): + """Handles the broker's response to the connection request.""" + if rc == 0: + logging.info("Client %s: Connection successful.", self.config.client_id) + self.is_connected = True + for cb in self._connect_callbacks: + cb(self) + else: + logging.error("Client %s: Connection failed (Return Code: %d).", self.config.client_id, rc) + self.is_connected = False + + def _on_disconnect(self, client: mqtt.Client, userdata: Any, rc: int): + """Handles unexpected or intentional disconnections.""" + self.is_connected = False + logging.info("Client %s: Disconnected from broker.", self.config.client_id) + for cb in self._disconnect_callbacks: + cb(self) + + def _on_subscribe(self, client: mqtt.Client, userdata: Any, mid: int, granted_qos: List[int]): + """Logs the result of subscription attempts.""" + for qos in granted_qos: + if qos > 2: + logging.error("Client %s: Subscription %d rejected by broker.", self.config.client_id, mid) + else: + logging.debug("Client %s: Subscription %d granted (QoS %d).", self.config.client_id, mid, qos) + + def _create_temp_cert_file(self, content: str) -> str: + """ + Writes PEM content to a temporary file on disk. + + Required because OpenSSL (used by Paho) generally expects physical files + rather than memory strings for mTLS handshakes. + """ + # delete=False is critical: Paho needs to re-read these files during auto-reconnects. + with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.pem') as f: + f.write(content) + self._temp_files.append(f.name) + return f.name + + def connect( + self, + connect_callbacks: Optional[List[MQTTEventCallback]] = None, + disconnect_callbacks: Optional[List[MQTTEventCallback]] = None + ): + """ + Configures TLS security and establishes a background connection. + + Args: + connect_callbacks: Functions to call upon successful connection. + disconnect_callbacks: Functions to call upon disconnection. + """ + self._connect_callbacks = connect_callbacks or [] + self._disconnect_callbacks = disconnect_callbacks or [] + + # Write PEM strings to temporary files for the mTLS engine + ca_path = self._create_temp_cert_file(self.config.certificate.ca) + cert_path = self._create_temp_cert_file(self.config.certificate.cert) + key_path = self._create_temp_cert_file(self.config.certificate.key) + + + + # Configure the client for mutual TLS authentication + self.client.tls_set( + ca_certs=ca_path, + certfile=cert_path, + keyfile=key_path + ) + + # Initiate non-blocking connection + self.client.connect(self.config.broker_address, self.config.port) + + # Start the background networking thread (handles auto-reconnects) + self.client.loop_start() + + def publish(self, topic: str, message: str, qos: int = 0) -> bool: + """ + Publishes a message to the broker. + + Args: + topic: The MQTT topic path. + message: The message string (UTF-8). + qos: Quality of Service level (0, 1, or 2). + + Returns: + bool: True if the message was successfully queued for delivery. + """ + info = self.client.publish(topic, message, qos=qos) + return info.rc == mqtt.MQTT_ERR_SUCCESS + + def subscribe(self, topic: str, callback: MQTTMessageCallback, qos: int = 0) -> bool: + """ + Subscribes to a topic and assigns a specific message handler. + + Args: + topic: The topic pattern to subscribe to. + callback: A function receiving (topic, payload) when a message arrives. + qos: Quality of Service level. + + Returns: + bool: True if the subscription request was sent successfully. + """ + if not callable(callback): + raise ValueError("The 'callback' argument must be a callable function.") + + # Wrap the Paho-style callback into our simpler (topic, payload) signature + def message_wrapper(client, userdata, msg: mqtt.MQTTMessage): + callback(msg.topic, msg.payload) + + result, _ = self.client.subscribe(topic, qos) + if result == mqtt.MQTT_ERR_SUCCESS: + self._topic_callbacks[topic] = message_wrapper + self.client.message_callback_add(topic, message_wrapper) + return True + return False + + def unsubscribe(self, topic: str) -> bool: + """ + Removes a subscription and its associated callback. + + Args: + topic: The topic to unsubscribe from. + + Returns: + bool: True if the unsubscribe request was successful. + """ + if topic in self._topic_callbacks: + self.client.message_callback_remove(topic) + self._topic_callbacks.pop(topic) + + result, _ = self.client.unsubscribe(topic) + return result == mqtt.MQTT_ERR_SUCCESS + + def disconnect(self): + """ + Disconnects the client and cleans up temporary certificate files. + + Must be called to prevent sensitive security files from remaining on disk. + """ + self.client.loop_stop() + self.client.disconnect() + + # Manually remove the temporary PEM files created for mTLS + for path in self._temp_files: + try: + if os.path.exists(path): + os.remove(path) + except Exception as e: + logging.warning("Cleanup: Could not remove temporary file %s: %s", path, e) + + self._temp_files.clear() + logging.info("Client %s: Cleaned up temporary security files.", self.config.client_id) + + def __enter__(self): + """Context manager support for 'with MQTTClient(...) as client:'""" + self.connect() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + """Automatic cleanup when exiting a context block.""" + self.disconnect() \ No newline at end of file diff --git a/etx/examples/python/src/examples/utils/oauth.py b/etx/examples/python/src/examples/utils/oauth.py new file mode 100644 index 0000000..69aad01 --- /dev/null +++ b/etx/examples/python/src/examples/utils/oauth.py @@ -0,0 +1,99 @@ +# SPDX-FileCopyrightText: 2025 Verizon +# SPDX-License-Identifier: Apache-2.0 +from dataclasses import dataclass +from examples.utils.config import AppConfig +import requests + +@dataclass +class TokenPair: + """ + Data container for the two-tier authentication tokens required by Verizon. + + Attributes: + access_token: The OAuth2 bearer token for API authorization. + session_token: The M2M session token for specific device operations. + """ + access_token: str + session_token: str + +def get_thingspace_token(config: AppConfig) -> TokenPair: + """ + Orchestrates the two-step authentication flow for Verizon ThingSpace. + + This function performs: + 1. A Client Credentials exchange for an OAuth2 Access Token (valid for 60 mins). + 2. A Session Login using that Access Token + User Credentials for a Session Token. + This session token has a rolling 20 minutes validity period. + + Args: + config: An instance of AppConfig containing endpoints and identity data. + + Returns: + TokenPair: An object containing both valid tokens. + + Raises: + requests.exceptions.RequestException: If any network call fails. + KeyError: If the API response format deviates from the expected structure. + """ + + # --- STEP 1: OBTAIN OAUTH2 ACCESS TOKEN --- + # We use the Base64 'token' (Client ID:Secret) from config.identity.token + + access_headers = { + "Content-Type": "application/x-www-form-urlencoded", + "Authorization": f"Basic {config.identity.token}" + } + + # ThingSpace requires grant_type=client_credentials for this flow + access_data = { + "grant_type": "client_credentials", + } + + # config.endpoints.oauthTimeout is in ms; requests.post expects seconds + access_response = requests.post( + config.endpoints.oauthUrl, + headers=access_headers, + data=access_data, + timeout=config.endpoints.oauthTimeout / 1000 + ) + + # Raise exception for 4xx or 5xx errors + access_response.raise_for_status() + + # Extract the bearer token from the JSON response + access_json = access_response.json() + access_token = access_json["access_token"] + + # --- STEP 2: OBTAIN M2M SESSION TOKEN --- + # We use the Access Token from Step 1 and the User/Password from config.identity + + session_headers = { + "Content-Type": "application/json", + "Authorization": f"Bearer {access_token}" + } + + # Payload requires the ThingSpace portal username and password + session_payload = { + "username": config.identity.user, + "password": config.identity.password, + } + + session_response = requests.post( + config.endpoints.sessionUrl, + headers=session_headers, + json=session_payload, + timeout=config.endpoints.oauthTimeout / 1000 + ) + + # Raise exception for 4xx or 5xx errors + session_response.raise_for_status() + + # ThingSpace returns 'sessionToken' (camelCase). + # This token is typically used in the 'VZ-M2M-Token' header for V2X APIs. + session_json = session_response.json() + session_token = session_json["sessionToken"] + + return TokenPair( + access_token=access_token, + session_token=session_token + ) \ No newline at end of file diff --git a/etx/examples/python/src/examples/utils/parser.py b/etx/examples/python/src/examples/utils/parser.py new file mode 100644 index 0000000..7539d7a --- /dev/null +++ b/etx/examples/python/src/examples/utils/parser.py @@ -0,0 +1,83 @@ +# SPDX-FileCopyrightText: 2025 Verizon +# SPDX-License-Identifier: Apache-2.0 +import argparse + +def get_registration_parser() -> argparse.ArgumentParser: + """ + Parser for 0_registration_example.py. + Requires master config to bootstrap the device. + """ + parser = argparse.ArgumentParser( + description="ETX Device Registration Utility", + formatter_class=argparse.ArgumentDefaultsHelpFormatter + ) + + parser.add_argument( + "--config", + type=str, + default="config.json", + help="Path to the master JSON configuration file" + ) + + parser.add_argument( + "--cert-dir", + dest="certDir", + type=str, + help="Directory where the resulting identity artifact will be saved" + ) + + parser.add_argument( + "--log-level", + dest="logLevel", + choices=["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"], + help="Set the logging verbosity level" + ) + + return parser + +def get_operational_parser() -> argparse.ArgumentParser: + """ + Parser for other examples. + Only needs the specific device identity file. + """ + parser = argparse.ArgumentParser( + description="ETX Operational Example", + formatter_class=argparse.ArgumentDefaultsHelpFormatter + ) + + parser.add_argument( + "--device-file", + required=True, + help="Path to the {timestamp}_{id}.json identity file created during registration" + ) + + parser.add_argument( + "--log-level", + dest="logLevel", + default="DEBUG", + choices=["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"], + help="Set the logging verbosity level" + ) + + return parser + +def get_geoaware_parser() -> argparse.ArgumentParser: + """ + Parser for other examples. + Only needs the specific device identity file. + """ + parser = get_operational_parser() + + parser.add_argument( + "--lat", + dest="lat", + help="Override the latitude of the example" + ) + + parser.add_argument( + "--lon", + dest="lon", + help="Override the longitude of the example" + ) + + return parser \ No newline at end of file diff --git a/etx/examples/python/src/examples/utils/registration.py b/etx/examples/python/src/examples/utils/registration.py new file mode 100644 index 0000000..1d0cc6c --- /dev/null +++ b/etx/examples/python/src/examples/utils/registration.py @@ -0,0 +1,272 @@ +# SPDX-FileCopyrightText: 2025 Verizon +# SPDX-License-Identifier: Apache-2.0 +import requests +from datetime import datetime +from dataclasses import dataclass +from typing import List, Sequence +from urllib.parse import urljoin + +# Ensure these import paths match your project structure +from examples.utils.config import AppConfig +from examples.utils.oauth import TokenPair, get_thingspace_token + +@dataclass +class Certificate: + """Holds the cryptographic artifacts for device identity. + + Attributes: + expiration_time: The UTC timestamp when the certificate expires. + ca: The Root Certificate Authority string in PEM format. + cert: The Device Certificate string in PEM format. + key: The Private Key string in PEM format. + """ + expiration_time: datetime + ca: str + cert: str + key: str + +@dataclass +class RegistrationResponse: + """Response container for the device registration handshake.""" + device_id: str + certificate: Certificate + +@dataclass +class ConnectionResponse: + """Response container for the assigned MQTT connectivity details.""" + mqtt_url: str + +@dataclass +class ACLRule: + """Defines the MQTT publish and subscribe permissions for a client. + + Attributes: + name: The human-readable name of the access rule. + subscribe_limit: Maximum number of active subscriptions allowed. + publish_rate_limit: Maximum messages allowed per second. + publish: List of authorized topics for sending data. + subscribe: List of authorized topics for receiving data. + """ + name: str + subscribe_limit: int + publish_rate_limit: int + publish: Sequence[str] + subscribe: Sequence[str] + +def get_registration_details(config: AppConfig, tokens: TokenPair) -> RegistrationResponse: + """Orchestrates device registration with the ETX Enrollment Authority. + + This function sends the device's identity attributes (VendorID, ClientType) + to Verizon to obtain a unique DeviceID and short-lived certificates. + + Args: + config: The application configuration containing endpoints and identity. + tokens: A valid TokenPair (Access and Session) from ThingSpace. + + Returns: + RegistrationResponse: The resulting device ID and PEM certificates. + """ + common_header = { + "Accept": "application/json", + "Content-Type": "application/json", + "Authorization": f"Bearer {tokens.access_token}", + "SessionToken": tokens.session_token, + } + + reg_url = urljoin(config.endpoints.registrationUrl, "/api/v2/clients/registration") + + payload = { + "VendorID": config.identity.attributes.vendorId, + "ClientType": config.identity.attributes.clientType, + "ClientSubtype": config.identity.attributes.clientSubType, + } + + response = requests.post( + reg_url, + headers=common_header, + json=payload, + timeout=config.endpoints.registrationTimeout / 1000, + ) + response.raise_for_status() + data = response.json() + + # Extract certificate nested data + c_data = data["Certificate"] + + # Backward compatibility: Python < 3.11 doesn't handle 'Z' in fromisoformat + expiry_str = c_data["ExpirationTime"].replace("Z", "+00:00") + + certificate = Certificate( + expiration_time=datetime.fromisoformat(expiry_str), + ca=c_data["ca.pem"], + cert=c_data["cert.pem"], + key=c_data["key.pem"] + ) + + return RegistrationResponse(device_id=data["DeviceID"], certificate=certificate) + +def get_connection_details(config: AppConfig, tokens: TokenPair, device_id: str) -> ConnectionResponse: + """Retrieves the assigned MQTT broker URL for a registered device. + + This function uses the device's current location (Lat/Lon) to route + it to the geographically closest Verizon regional message broker. + + Args: + config: The application configuration including location data. + tokens: Valid ThingSpace tokens. + device_id: The unique ID received during the registration step. + + Returns: + ConnectionResponse: The MQTT URL for the broker. + """ + common_header = { + "Accept": "application/json", + "Content-Type": "application/json", + "Authorization": f"Bearer {tokens.access_token}", + "SessionToken": tokens.session_token, + "VendorID": config.identity.attributes.vendorId, + } + + conn_url = urljoin(config.endpoints.registrationUrl, "/api/v2/clients/connection") + + payload = { + "DeviceID": device_id, + "NetworkType": "non-VZ", + "Geolocation": { + "Latitude": config.identity.attributes.location.lat, + "Longitude": config.identity.attributes.location.lon, + }, + } + + resp = requests.post( + conn_url, + headers=common_header, + json=payload, + timeout=config.endpoints.registrationTimeout / 1000, + ) + resp.raise_for_status() + + return ConnectionResponse(mqtt_url=resp.json()["MqttURL"]) + +def get_acl_rules(config: AppConfig, tokens: TokenPair) -> List[ACLRule]: + """Fetches and processes the MQTT Access Control List rules for a vendor. + + The function retrieves the vendor's policy and dynamically replaces + placeholders (e.g., ${clientType}) with the values from the current config. + + Args: + config: The application configuration. + tokens: Valid ThingSpace tokens. + + Returns: + List[ACLRule]: A list of rules with fully resolved topic strings. + """ + def fill_placeholders(text: str) -> str: + # Replaces template variables in topic strings with active config values + text = text.replace("${clientType}", config.identity.attributes.clientType) + text = text.replace("${clientSubtype}", config.identity.attributes.clientSubType) + return text + + common_header = { + "Accept": "application/json", + "Content-Type": "application/json", + "Authorization": f"Bearer {tokens.access_token}", + "SessionToken": tokens.session_token, + } + + acl_url = urljoin(config.endpoints.registrationUrl, "/api/v1/device-roles/vendor") + + response = requests.get( + acl_url, + params={"VendorID": config.identity.attributes.vendorId}, + headers=common_header, + timeout=config.endpoints.registrationTimeout / 1000, + ) + response.raise_for_status() + + processed_rules = [] + for rule in response.json(): + processed_rules.append(ACLRule( + name=fill_placeholders(rule["name"]), + subscribe_limit=rule["subscribeLimit"], + publish_rate_limit=rule["publishRateLimit"], + publish=[fill_placeholders(p) for p in rule["publish"]], + subscribe=[fill_placeholders(s) for s in rule["subscribe"]] + )) + + # Manually append the global ClientInfo topic if rules exist + if processed_rules: + processed_rules[0].subscribe.append("vzimp/1/ClientInfo") + + return processed_rules + +def format_acl_rules(acl_rules: List[ACLRule]) -> str: + """ + Format the ACL rules into a clean, human-readable string for logging. + + Args: + acl_rules: A list of ACLRule dataclasses. + + Returns: + str: A formatted block of text. + """ + if not acl_rules: + return "No ACL rules available." + + lines = [] + lines.append("-" * 40) + lines.append("AUTHORIZED MQTT TOPICS (ACLs)") + lines.append("-" * 40) + + for i, rule in enumerate(acl_rules, 1): + lines.append(f"[{i}] Profile: {rule.name}") + lines.append(f" - Subscribe Limit : {rule.subscribe_limit}") + lines.append(f" - Publish Rate Limit : {rule.publish_rate_limit}") + + # Format Publish Section + if rule.publish: + lines.append(" - Allowed to Publish:") + for p in rule.publish: + lines.append(f" > {p}") + else: + lines.append(" - Allowed to Publish: None") + + # Format Subscribe Section + if rule.subscribe: + lines.append(" - Allowed to Subscribe:") + for s in rule.subscribe: + lines.append(f" > {s}") + else: + lines.append(" - Allowed to Subscribe: None") + + if i < len(acl_rules): + lines.append("") # Spacer between rules + + lines.append("-" * 40) + return "\n".join(lines) + +def deregister(config: AppConfig, tokens: TokenPair, device_id: str) -> None: + """Removes the device registration from the Verizon ThingSpace system. + + This function should be called during cleanup or decommissioning + to revoke the device's credentials. + + Args: + config: The application configuration. + device_id: The unique Device ID to be removed. + """ + # Fetch a fresh token specifically for the delete operation + registration_url = urljoin(config.endpoints.registrationUrl, "/api/v2/clients/registration") + + resp = requests.delete( + registration_url, + headers={ + "Content-Type": "application/x-www-form-urlencoded", + "VendorID": config.identity.attributes.vendorId, + "Authorization": f"Bearer {tokens.access_token}", + "SessionToken": tokens.session_token, + }, + params={"DeviceIDs": device_id}, + timeout=config.endpoints.registrationTimeout / 1000, + ) + resp.raise_for_status() \ No newline at end of file diff --git a/etx/proto/georoutedmsg.proto b/etx/proto/georoutedmsg.proto new file mode 100644 index 0000000..1d01a55 --- /dev/null +++ b/etx/proto/georoutedmsg.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; + +import "google/protobuf/timestamp.proto"; +package georoutedmsg; + +message Position { + double latitude = 1; + double longitude = 2; +} + +message GeoRoutedMsg { + bytes msgBytes = 1; + google.protobuf.Timestamp time = 2; + optional Position position = 3; +} \ No newline at end of file diff --git a/j2735codec/bindings/python/pyproject.toml b/j2735codec/bindings/python/pyproject.toml index 0ffb15e..3449349 100644 --- a/j2735codec/bindings/python/pyproject.toml +++ b/j2735codec/bindings/python/pyproject.toml @@ -26,11 +26,12 @@ dev = [ [tool.hatch.build.targets.wheel] packages = ["src/j2735codec"] -artifacts = [ - "src/j2735codec/py.typed", - "src/j2735codec/generated/*.wasm", - "src/j2735codec/generated/*.py", -] + +# Force Hatch to include the CI-generated files even if untracked by Git +[tool.hatch.build.targets.wheel.force-include] +"src/j2735codec/generated" = "j2735codec/generated" +"src/j2735codec/protobuf" = "j2735codec/protobuf" +"src/j2735codec/py.typed" = "j2735codec/py.typed" [tool.pytest.ini_options] pythonpath = "src" diff --git a/j2735codec/bindings/python/src/j2735codec/__init__.py b/j2735codec/bindings/python/src/j2735codec/__init__.py index dc108bc..2aa494d 100644 --- a/j2735codec/bindings/python/src/j2735codec/__init__.py +++ b/j2735codec/bindings/python/src/j2735codec/__init__.py @@ -1,5 +1,7 @@ -from j2735codec.codec import V2XCodec, GeoRoutedHeader +# SPDX-FileCopyrightText: 2025 Verizon +# SPDX-License-Identifier: Apache-2.0 +from j2735codec.codec import Codec, GeoRoutedHeader from j2735codec.generated.encodings import EncodingRules from j2735codec.generated.pdu import PDUTypes -__all__ = ["EncodingRules", "PDUTypes", "V2XCodec", "GeoRoutedHeader"] \ No newline at end of file +__all__ = ["EncodingRules", "PDUTypes", "Codec", "GeoRoutedHeader"] \ No newline at end of file diff --git a/j2735codec/bindings/python/src/j2735codec/codec.py b/j2735codec/bindings/python/src/j2735codec/codec.py index 804170c..a7a93a9 100644 --- a/j2735codec/bindings/python/src/j2735codec/codec.py +++ b/j2735codec/bindings/python/src/j2735codec/codec.py @@ -3,7 +3,7 @@ """ A Python module for V2X data transcoding using WebAssembly. -This provides a V2XCodec class that allows for transcoding +This provides a Codec class that allows for transcoding Vehicle-to-Everything (V2X) data between different encoding rules and PDU types. It uses the wasmtime library to load and execute a WebAssembly module that performs the transcoding. @@ -37,11 +37,11 @@ class GeoRoutedHeader: lon: float timestamp: Optional[datetime] = None -class V2XCodec: +class Codec: """ - Represents a V2X codec for transcoding data between encodings. + Represents a codec for transcoding data between encodings. - V2XCodec is a class that provides methods to transcode V2X data + Codec is a class that provides methods to transcode V2X data between different encoding rules and PDU types using WebAssembly. It uses the wasmtime library to load and execute a WebAssembly module that performs the transcoding. @@ -188,7 +188,7 @@ def transcode_j2735( # Allocate memory for the output pointer (void**) out_buffer_ptr = self._malloc( self._store, - V2XCodec.WASM_POINTER_SIZE) + Codec.WASM_POINTER_SIZE) if not out_buffer_ptr: self._free(self._store, in_buffer_wasm) # Cleanup raise RuntimeError("Failed to allocate output pointer WASM memory.") @@ -218,10 +218,10 @@ def transcode_j2735( view_after = self._memory.data_ptr(self._store) # Read the bytes representing the address - ptr_bytes = bytes(view_after[out_buffer_ptr : out_buffer_ptr + V2XCodec.WASM_POINTER_SIZE]) + ptr_bytes = bytes(view_after[out_buffer_ptr : out_buffer_ptr + Codec.WASM_POINTER_SIZE]) # Unpack those bytes to get the integer address of the actual output buffer - pointer_format = " Date: Sun, 18 Jan 2026 20:54:32 -0500 Subject: [PATCH 17/21] feat: add sample code for node - Add registration and deregistration examples. - Add vehicle, speed monitor, and loopback examples. - Add CI support to release examples. - Update documentation for node examples. --- .github/workflows/ci-release.yml | 57 +- Makefile | 12 +- README.md | 5 +- etx/examples/node/.nvmrc | 1 + etx/examples/node/README.md | 201 +++++ etx/examples/node/config.json.example | 25 + etx/examples/node/package.json | 32 + .../node/src/0_registration_example.ts | 113 +++ .../node/src/1_deregistration_example.ts | 68 ++ etx/examples/node/src/2_loopback_example.ts | 183 ++++ etx/examples/node/src/3_speedmon_example.ts | 212 +++++ etx/examples/node/src/4_vehicle_example.ts | 184 ++++ etx/examples/node/src/utils/client.ts | 171 ++++ etx/examples/node/src/utils/config.ts | 129 +++ etx/examples/node/src/utils/logger.ts | 63 ++ etx/examples/node/src/utils/message.ts | 185 ++++ etx/examples/node/src/utils/mqtt.ts | 187 ++++ etx/examples/node/src/utils/oauth.ts | 83 ++ etx/examples/node/src/utils/parser.ts | 97 +++ etx/examples/node/src/utils/registration.ts | 248 ++++++ etx/examples/node/tsconfig.json | 44 + etx/examples/python/README.md | 106 ++- .../python/src/examples/2_loopback_example.py | 2 +- j2735codec/bindings/node/src/codec.ts | 10 +- j2735codec/bindings/node/src/index.ts | 4 + j2735codec/bindings/node/tests/codec.test.ts | 12 +- package-lock.json | 813 +++++++++++++++++- package.json | 3 +- 28 files changed, 3165 insertions(+), 85 deletions(-) create mode 100644 etx/examples/node/.nvmrc create mode 100644 etx/examples/node/README.md create mode 100644 etx/examples/node/config.json.example create mode 100644 etx/examples/node/package.json create mode 100644 etx/examples/node/src/0_registration_example.ts create mode 100644 etx/examples/node/src/1_deregistration_example.ts create mode 100644 etx/examples/node/src/2_loopback_example.ts create mode 100644 etx/examples/node/src/3_speedmon_example.ts create mode 100644 etx/examples/node/src/4_vehicle_example.ts create mode 100644 etx/examples/node/src/utils/client.ts create mode 100644 etx/examples/node/src/utils/config.ts create mode 100644 etx/examples/node/src/utils/logger.ts create mode 100644 etx/examples/node/src/utils/message.ts create mode 100644 etx/examples/node/src/utils/mqtt.ts create mode 100644 etx/examples/node/src/utils/oauth.ts create mode 100644 etx/examples/node/src/utils/parser.ts create mode 100644 etx/examples/node/src/utils/registration.ts create mode 100644 etx/examples/node/tsconfig.json diff --git a/.github/workflows/ci-release.yml b/.github/workflows/ci-release.yml index f851f44..7cf4ca6 100644 --- a/.github/workflows/ci-release.yml +++ b/.github/workflows/ci-release.yml @@ -173,21 +173,70 @@ jobs: if [ -d "$SAMPLE_DIR" ]; then cp LICENSE "$SAMPLE_DIR/" cp NOTICE "$SAMPLE_DIR/" + + # Inject the language wrapper (the wheel) + mkdir -p "$SAMPLE_DIR/j2735codec" + cp "$STAGING"/*.whl "$SAMPLE_DIR/j2735codec/" + cd "$SAMPLE_DIR" + VERSION=$(cat "$GITHUB_WORKSPACE/VERSION") ZIP_NAME="python-etx-samples-$VERSION.zip" zip -r "$STAGING/$ZIP_NAME" . \ -x "*config.json" -x "*/.venv/*" -x "*.venv*" -x "*/.env*" -x "*/__pycache__/*" cd "$GITHUB_WORKSPACE" fi - # --- 5. Finalize Staging --- + # --- 5. Package Node/TS Samples --- + NODE_SAMPLE_DIR="etx/examples/node" + if [ -d "$NODE_SAMPLE_DIR" ]; then + VERSION=$(cat "$GITHUB_WORKSPACE/VERSION") + PKG_STAGING="$GITHUB_WORKSPACE/node_pkg_temp" + mkdir -p "$PKG_STAGING" + + # 1. Copy the source (leaves your repo untouched) + cp -r "$NODE_SAMPLE_DIR"/. "$PKG_STAGING/" + + # 2. Rewrite the path to the PORTABLE local path + # This changes the monorepo path to the ZIP-friendly path + sed -i "s|\"j2735codec\": \".*\"|\"j2735codec\": \"file:./j2735codec/j2735codec-$VERSION.tgz\"|g" "$PKG_STAGING/package.json" + + # 3. Inject the tarball into the staging area + mkdir -p "$PKG_STAGING/j2735codec" + cp "$STAGING"/j2735codec-$VERSION.tgz "$PKG_STAGING/j2735codec/" + + # 4. GENERATE THE LOCKFILE HERE + # This lockfile will now contain the correct, portable reference to the codec + cd "$PKG_STAGING" + npm install --package-lock-only --no-workspaces + + # 5. ZIP EVERYTHING + # Now the ZIP contains a package.json and a package-lock.json + # that both point to the local ./j2735codec folder. + ZIP_NAME="node-etx-samples-$VERSION.zip" + zip -r "$STAGING/$ZIP_NAME" . -x "node_modules/*" "dist/*" + + # We zip EVERYTHING (*) in this folder, excluding ONLY the junk + zip -r "$STAGING/$ZIP_NAME" . \ + -x "certs/*" "dist/*" "node_modules/*" "config.json" ".env*" "npm-debug.log*" + + cd "$GITHUB_WORKSPACE" + rm -rf "$PKG_STAGING" + fi + + # --- 6. Finalize Staging --- cp "$PY_DIR/src/j2735codec/generated/j2735codec.wasm" "$STAGING/j2735codec-$VERSION.wasm" cp LICENSE "$STAGING/" cp NOTICE "$STAGING/" - # Cleanup - find "$STAGING" -name "default.gitignore" -delete - find "$STAGING" -name ".*" -not -name "." -delete + # --- 7. FIXED Safe Cleanup --- + echo "🧹 Performing final cleanup..." + # Do NOT use -delete on a broad glob. Delete specific files. + rm -f "$STAGING"/.DS_Store + rm -f "$STAGING"/.env + rm -f "$STAGING"/default.gitignore + + echo "βœ… Contents of $STAGING for release:" + ls -la "$STAGING" - name: Create GitHub Release uses: softprops/action-gh-release@v2 diff --git a/Makefile b/Makefile index 839cda5..39e551f 100644 --- a/Makefile +++ b/Makefile @@ -47,6 +47,9 @@ J2735_REV ?= j2735_202409 THREADS ?= $(shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4) SAMPLE_PY = etx/examples/python + +SAMPLE_JS = etx/examples/node + VERSION ?= $(shell cat VERSION 2>/dev/null || echo "0.1.0") # --- Targets --- @@ -206,14 +209,15 @@ sync-version: @echo "πŸ”„ Syncing version $(VERSION) to manifests..." @# Update Root CMake @perl -i -pe 's/VERSION\s+"[0-9.]+"/VERSION "$(VERSION)"/gi' j2735codec/CMakeLists.txt + @# Update Node manifests @npm version $(VERSION) --no-git-tag-version --allow-same-version || true @cd $(BINDING_JS) && npm version $(VERSION) --no-git-tag-version --allow-same-version || true - @# Update Python manifests + @cd $(SAMPLE_JS) && npm version $(VERSION) --no-git-tag-version --allow-same-version || true + + @# Update Python manifests (root, binding, sample) @perl -i -pe 's/^version\s*=\s*"[0-9.]*"/version = "$(VERSION)"/m' pyproject.toml @perl -i -pe 's/^version\s*=\s*"[0-9.]*"/version = "$(VERSION)"/m' $(BINDING_PY)/pyproject.toml - - @# Update Sample Python (etx-samples/python/pyproject.toml) @perl -i -pe 's/^version\s*=\s*"[0-9.]*"/version = "$(VERSION)"/m' $(SAMPLE_PY)/pyproject.toml - @echo "βœ… Version $(VERSION) synced across 4 manifests and CMake." \ No newline at end of file + @echo "βœ… Version $(VERSION) synced across 6 manifests and CMake." \ No newline at end of file diff --git a/README.md b/README.md index 64b7850..1efc709 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ For specific installation steps and examples for Python or Node, please view the ### Language Binding Installation -There are two ways to install the language binding: +It is possible to just install the langauge bindings for encoding and decoding messages. 1. Install the bindings using the link directly from the project release page ([View Latest Releases](https://github.com/5GRealityLab/etx-starter-kit/releases/latest)). @@ -101,7 +101,7 @@ pip install "https://github.com/5GRealityLab/etx-starter-kit/releases/download/v npm install "https://github.com/5GRealityLab/etx-starter-kit/releases/download/v0.0.0-alpha/node-j2735codec-0.2.0.tgz" ``` -**Note**: The release links above are not valid. Please see release page in this repo for proper links to to use. +**Note**: The release links above are not valid. Please see release page for proper links to to use. You can also download the files from the release page and install locally as well. ### 2. Source Install @@ -147,6 +147,7 @@ The first step is to clone this repository first. All of the following commands ```bash git clone https://github.com/5GRealityLab/etx-starter-kit.git +cd etx-starter-kit ``` The following commands will perform a full installation outlined below: diff --git a/etx/examples/node/.nvmrc b/etx/examples/node/.nvmrc new file mode 100644 index 0000000..aebd91c --- /dev/null +++ b/etx/examples/node/.nvmrc @@ -0,0 +1 @@ +v22.16.0 diff --git a/etx/examples/node/README.md b/etx/examples/node/README.md new file mode 100644 index 0000000..40c4eba --- /dev/null +++ b/etx/examples/node/README.md @@ -0,0 +1,201 @@ +# Node ETX Client Sample + +This repository serves as a practical guide for developers looking to get started with the Verizon ETX platform in Node. It offers a selection of concise, self-contained examples designed to help you quickly understand core V2X conceptsβ€”such as mTLS authentication, J2735 message transcoding, and geographic topic routing. + +## Running Examples + +This version of the client sample has been tested against **v22.16.0**. It utilizes the `j2735codec` for transcoding between JER (JSON) and UPER (Binary) formats. + +**NOTE**: All references to the project root refer to `etx/examples/node/`. This is where **ALL** the examples should be executed from. + +### Prerequisite - Setup + +The fastest way to get started is to download the packages from release. The latest release can be [found here](https://github.com/5GRealityLab/etx-starter-kit/releases/latest). + +The file to download will look like: `node-etx-sample-x.x.x.zip`, where x.x.x is the version fo the project. + +1. **Install Dependencies**: + + **Install With Pip** + + ```bash + curl -L -O https://github.com/5GRealityLab/etx-starter-kit/releases/latest/download/node-etx-sample-x.x.x.zip + unzip node-etx-sample-x.x.x.zip -d node-etx-sample + cd node-etx-sample + npm install ./j2735codec/j2735codec-*.tgz + + # Ready to Run! + ``` + +2. **Environment Configuration**: Create a `config.json` file to start using the examples. The [`config.json.example`](./config.json.example) file provides a good starting point. + + Here are some pointers on what to fill out for the fields in the JSON. + + | Section | Field | Type | Description | + | :--- | :--- | :--- | :--- | + | **Root** | `logLevel` | String | Controls the verbosity of the console output (e.g., `DEBUG`, `INFO`, `WARN`, `ERROR`). | + | | `certDir` | String | The local directory where security certificates and keys are generated after registration completes. | + | **identity** | `user` | String | Your Verizon ThingSpace account username. | + | | `password` | String | Your Verizon ThingSpace account password. | + | | `token` | String | The Base64 encoded Application Token (Client ID:Client Secret) from ThingSpace. | + | **attributes**| `clientType` | String | The broad category of the client (e.g., `Vehicle`, `VulnerableRoadUser`, etc). | + | | `clientSubType` | String | The specific type of vehicle (e.g., `PassengerCar`, `Truck`, `Radar`, etc). | + | | `vendorId` | String | An identifier for the software or hardware provider. | + | **location** | `lat` | Float | The initial latitude for the device (used during registration/geofencing). | + | | `lon` | Float | The initial longitude for the device. | + +**Note: The latitude and longitude determines which edge server you will conenct to.** + +**Note: The `Endpoints` section in the config is optional and does not have to be filled out or included in the final `config.json`.** +```json +"endpoints": { + "oauthUrl": "https://thingspace.verizon.com/api/ts/v1/oauth2/token", + "sessionUrl": "https://thingspace.verizon.com/api/m2m/v1/session/login", + "oauthTimeout": 30000, + "registrationUrl": "https://imp.thingspace.verizon.com", + "registrationTimeout": 45000 +} +``` + +#### Supported Arguments + +The following command line arguments are supported by all examples in the next section. + +| Arg | Required | Default | Description | +| :--- | :--- | :--- | :--- | +| --log-level | False | DEBUG | Controls the verbosity of the console output (e.g., `DEBUG`, `INFO`, `WARN`, `ERROR`). | + +--- + +### 0. Registration Example + +The registration example is a precursor to performing any other operations on ETX. This step retrieves a unique **Device ID** and the **mTLS certificates** (CA, Certificate, and Private Key) required to connect. + +**IMPORTANT**: Each vendor ID has a fixed quota of device IDs. Always keep track of your registrations and deregister when finished. + +#### How to Run +```bash +npm run registration -- --config config.json --cert-dir ./certs +``` + +**Output**: The above command generates a JSON "Identity Artifact" in the `./certs/` folder. This file contains everything needed to "re-hydrate" your identity in the following examples. + +#### Supported Arguments + +| Arg | Required | Default | Description | +| :--- | :--- | :--- | :--- | +| --cert-dir| False | ./cert/ | The local directory where security certificates and keys are generated after registration completes. | +| --config | False | config.json | The configuration file to use for registration. | + +--- + +### 1. Deregistration Examples + +The deregistration example removes the registered device from ETX. Every vendor ID is has a limited number of device IDs. The deregistration process removes a unique device ID from circulation. This will also remove the files in the folder that contain the registration information. + +#### How to Run + +The command format to run this example (from the project root): +```bash +npm run deregistration -- --device-files ./certs/20260119_0101_f355703d.json +``` + +#### Supported Arguments + +| Arg | Required | Default | Description | +| :--- | :--- | :--- | :--- | +| --device-file | False | config.json | The configuration file to use for registration. | + +--- + +### 2. Private Loopback Example + +A diagnostic tool to verify bidirectional private communication. + +1. Connects to the ETX platform and acquires a Session ID. +2. Subscribes to its own unique **Private Topic**. +3. Publishes a BSM to itself to verify the mTLS loop is closed. + +#### How to Run +```bash +npm run loopback -- --device-file ./certs/20260119_0101_f355703d.json --count 5 +``` +#### Supported Arguments + +| Arg | Required | Default | Description | +| :--- | :--- | :--- | :--- | +| --device-file | True | - | The device file to use for ETX connection. | +| --count | False | 5 | The number of loopback messages to send. | + +--- + +### 3. Speed Monitor Example (RSU/App) + +Demonstrates a "Virtual Speed Trap" application. +1. **Geohashing**: Subscribes to regional topics by delimiting geohashes (e.g., `d/r/5/r/9/y`). +2. **Real-time Analytics**: Decodes BSMs from all vehicles in the neighborhood. +3. **Targeted Advisory**: If a vehicle exceeds the `--limit`, it sends a **TIM (Traveler Information Message)** warning directly to that specific vehicle's private topic. + +#### How to Run +```bash +npm run speedmon -- --device-file ./certs/20260119_0101_f355703d.json --limit 25 +``` + +#### Supported Arguments + +| Arg | Required | Default | Description | +| :--- | :--- | :--- | :--- | +| --device-file | True | - | The device file to use for ETX connection. | +| --lat | False | - | The default value is defined in the registration config file. | +| --lon | False | - | The default value is defined in the registraiton config file. | +| --limit | False | 25 | The speed limit in mph to send out warnings. | + +--- + +### 4. Vehicle Example (OBU) + +Simulates a mobile entity (On-Board Unit). It demonstrates the "Public Broadcast" pattern used in real-world V2X. +1. **Session Handshake**: Connects and retrieves a Session ID from `vzimp/1/ClientInfo`. +2. **Periodic Broadcast**: Runs a background thread to publish BSMs to the `GeoRelevance` topic at 1Hz. +3. **Regional Listening**: Subscribes to regional safety messages (TIM, SPaT, MAP). + +#### How to Run +```bash +npm run vehicle -- --device-file ./certs/20260119_0101_f355703d.json --speed 25 +``` + +**Note**: You can try running both the speed monitor and vehicle example together to see when TIM messages are sent to warn the vehicle of speed limit violations. **Remember to use two different registration profiles! One for the monitor and one for the vehicle.** + +#### Supported Arguments + +| Arg | Required | Default | Description | +| :--- | :--- | :--- | :--- | +| --device-file | True | - | The device file to use for ETX connection. | +| --lat | False | - | The default value is defined in the registration config file. | +| --lon | False | - | The default value is defined in the registraiton config file. | +| --speed | False | 30 | The speed in which the vehicle is traveling at. | +--- + +### Install and Running From Source (For Project Contributors) + +It is possible to run the examples directly from this project as well. Check the prequisites for the building the [language bindings here](/README.md#2-source-install). + +```bash +git clone https://github.com/5GRealityLab/etx-starter-kit.git +cd etx-starter-kit +make install-js +cd etx/examples/node + +# Run examples above + +``` + +--- + +### FAQ + +**What is the difference between Public and Private topics?** Public topics (`GeoRelevance` or `Regional`) are for one-to-many broadcasts based on location. Private topics are for one-to-one communication targeted at a specific `SessionID`. + +**Why use two separate Codecs?** V2X clients are multi-threaded. The MQTT library handles incoming messages on a background thread while your application publishes on the main thread. Using separate `Codec` instances prevents race conditions. + +**How do I clean up my device?** Please refer to the `0_deregistration_example` to remove your device ID from the system and reclaim your quota. diff --git a/etx/examples/node/config.json.example b/etx/examples/node/config.json.example new file mode 100644 index 0000000..317de40 --- /dev/null +++ b/etx/examples/node/config.json.example @@ -0,0 +1,25 @@ +{ + "logLevel": "DEBUG", + "certDir": "./certs", + "endpoints": { + "oauthUrl": "https://thingspace.verizon.com/api/ts/v1/oauth2/token", + "sessionUrl": "https://thingspace.verizon.com/api/m2m/v1/session/login", + "oauthTimeout": 30000, + "registrationUrl": "https://imp.thingspace.verizon.com", + "registrationTimeout": 45000 + }, + "identity": { + "user": "YOUR_THINGSPACE_USERNAME", + "password": "YOUR_THINGSPACE_PASSWORD", + "token": "YOUR_BASE64_ENCODED_APP_TOKEN", + "attributes": { + "clientType": "YOUR_ASSIGNED_CLIENT_TYPE", + "clientSubType": "YOUR_ASSIGNED_SUBTYPE", + "vendorId": "YOUR_ASSIGNED_VENDOR_ID", + "location": { + "lat": 0.0, + "lon": 0.0 + } + } + } +} \ No newline at end of file diff --git a/etx/examples/node/package.json b/etx/examples/node/package.json new file mode 100644 index 0000000..79c7f31 --- /dev/null +++ b/etx/examples/node/package.json @@ -0,0 +1,32 @@ +{ + "name": "examples", + "version": "0.2.0", + "type": "module", + "description": "Reference implementations and sample code for Verizon ETX", + "scripts": { + "build": "tsc", + "registration": "node dist/0_registration_example.js", + "preregistration": "npm run build", + "deregistration": "node dist/1_deregistration_example.js", + "prederegistration": "npm run build", + "loopback": "node dist/2_loopback_example.js", + "preloopback": "npm run build", + "speedmon": "node dist/3_speedmon_example.js", + "prespeedmon": "npm run build", + "vehicle": "node dist/4_vehicle_example.js", + "prevehicle": "npm run build" + }, + "author": "Sean Hsu", + "license": "Apache-2.0", + "devDependencies": { + "@types/ngeohash": "^0.6.8", + "@types/node": "^25.0.9", + "ts-node": "^1.7.1", + "typescript": "^5.9.3" + }, + "dependencies": { + "j2735codec": "^0.2.0", + "mqtt": "^5.14.1", + "ngeohash": "^0.6.3" + } +} diff --git a/etx/examples/node/src/0_registration_example.ts b/etx/examples/node/src/0_registration_example.ts new file mode 100644 index 0000000..9cd5e5c --- /dev/null +++ b/etx/examples/node/src/0_registration_example.ts @@ -0,0 +1,113 @@ +// SPDX-FileCopyrightText: 2025 Verizon +// SPDX-License-Identifier: Apache-2.0 + +import { writeFileSync, mkdirSync } from 'fs'; +import { join } from 'path'; +import { logger } from './utils/logger.js'; +import { getRegistrationArgs } from './utils/parser.js'; +import { loadConfig } from './utils/config.js'; +import { getThingSpaceToken } from './utils/oauth.js'; +import { + getRegistrationDetails, + getConnectionDetails, + getAclRules, + formatAclRules +} from './utils/registration.js' + +/** + * Registration Example + * Demonstrates how to register a client with the Verizon ETX platform, + * retrieving mTLS certificates and MQTT ACL rules. + */ +async function main() { + // 1. Parse CLI Arguments (Handled by node:util parseArgs) + const args = getRegistrationArgs(); + + // 2. Load Configuration (Merges JSON + CLI overrides) + let config; + try { + config = loadConfig(args.config as string, args); + logger.setLevel(config.logLevel); + } catch (e: any) { + console.error(`CRITICAL: ${e.message}`); + process.exit(1); + } + + let deviceId: string | null = null; + + try { + logger.info("Starting ETX Device Registration..."); + + // 3. Handshake & Registration: Obtain ThingSpace tokens + logger.info("Retrieving ThingSpace tokens..."); + const tokenPair = await getThingSpaceToken(config); + + // 4. Fetch live MQTT ACL rules for this Vendor + logger.info("Fetching live MQTT ACL rules..."); + const aclRules = await getAclRules(config, tokenPair); + + // Print the ACLs nicely for the user + logger.debug(formatAclRules(aclRules)); + + // 5. Perform device registration with Verizon Enrollment Authority + logger.info("Performing device registration with Verizon..."); + const regResp = await getRegistrationDetails(config, tokenPair); + deviceId = regResp.deviceId; + + // 6. Get the regional MQTT connection URL (Geo-routed) + const connDetails = await getConnectionDetails(config, tokenPair, deviceId); + logger.debug(`Connection URL: ${connDetails.mqttUrl}`); + + // --- REGISTRATION COMPLETE --- + + // 7. Prepare the "Frozen Bundle" (Identity Artifact) + const frozenBundle = { + registration: { + deviceId: regResp.deviceId, + certificate: { + // Convert Date back to string for JSON persistence + expiration_time: regResp.certificate.expirationTime.toISOString(), + ca: regResp.certificate.ca, + cert: regResp.certificate.cert, + key: regResp.certificate.key + } + }, + frozen_config: config // Snapshot of the configuration used + }; + + // 8. Persist the Identity Artifact to Disk + const certDir = config.certDir; + mkdirSync(certDir, { recursive: true }); + + const shortId = deviceId.substring(0, 8); + + // Formats to: YYYYMMDD_HHMM (e.g., 20260118_1420) + const now = new Date().toISOString(); + const timestamp = now.substring(0, 10).replace(/-/g, '') + + '_' + + now.substring(11, 16).replace(/:/g, ''); + + // Optional: If you prefer the dash-separated version we discussed for Python: + // const timestamp = now.toISOString().replace(/[:T]/g, '-').split('.')[0]; + + const fileName = `${timestamp}_${shortId}.json`; + const filePath = join(certDir, fileName); + + writeFileSync(filePath, JSON.stringify(frozenBundle, null, 4), 'utf-8'); + + logger.info(`Identity artifact sealed: ${filePath}`); + logger.info("Use this file with the --device-file flag in operational examples."); + + } catch (error: any) { + logger.error(`Registration failed: ${error.message}`); + + // If we registered but failed later, a real-world app should deregister here. + if (deviceId) { + logger.warn(`Device ID ${deviceId} may need manual cleanup or deregistration.`); + } + process.exit(1); + } +} + +// Top-level async execution +main(); \ No newline at end of file diff --git a/etx/examples/node/src/1_deregistration_example.ts b/etx/examples/node/src/1_deregistration_example.ts new file mode 100644 index 0000000..cd1cd0b --- /dev/null +++ b/etx/examples/node/src/1_deregistration_example.ts @@ -0,0 +1,68 @@ +// SPDX-FileCopyrightText: 2025 Verizon +// SPDX-License-Identifier: Apache-2.0 + +import { readFileSync, unlinkSync } from 'fs'; +import { resolve } from 'path'; +import { logger } from './utils/logger.js'; +import { getOperationalArgs } from './utils/parser.js'; +import { loadConfig } from './utils/config.js'; +import { getThingSpaceToken } from './utils/oauth.js'; +import { deregister } from './utils/registration.js'; + +/** + * Deregistration Example + * Removes a device's cloud registration using its frozen configuration + * and deletes the local identity artifact. + */ +async function main() { + // 1. Parse Arguments (Retrieves --device-file and --log-level) + const args = getOperationalArgs(); + + // 2. Load the Device Identity Artifact + const devicePath = resolve(process.cwd(), args.deviceFile as string); + let artifact: any; + let config: any; + let deviceId: string; + + try { + const rawData = readFileSync(devicePath, 'utf-8'); + artifact = JSON.parse(rawData); + + // We pass the nested "frozen_config" object directly into loadConfig. + // This re-hydrates the AppConfig and applies CLI log-level overrides. + config = loadConfig(artifact.frozen_config, args); + logger.setLevel(config.logLevel); + + // Extract device ID from the registration block + deviceId = artifact.registration.deviceId; + + } catch (error: any) { + console.error(`CRITICAL: Failed to load device artifact: ${error.message}`); + process.exit(1); + } + + try { + // 3. Authenticate + // Uses the frozen credentials stored inside the identity file + logger.info("Retrieving ThingSpace tokens for deregistration..."); + const tokenPair = await getThingSpaceToken(config); + + // 4. Cloud Deregistration + logger.info(`Requesting cloud deregistration for Device: ${deviceId}`); + await deregister(config, tokenPair, deviceId); + logger.info("Cloud deregistration successful."); + + // 5. Local Cleanup + logger.info(`Deleting local identity file: ${devicePath}`); + unlinkSync(devicePath); + + logger.info(`Successfully cleaned up device: ${deviceId}`); + + } catch (error: any) { + logger.error(`An unexpected error occurred during deregistration: ${error.message}`); + process.exit(1); + } +} + +// Execute +main(); \ No newline at end of file diff --git a/etx/examples/node/src/2_loopback_example.ts b/etx/examples/node/src/2_loopback_example.ts new file mode 100644 index 0000000..d9983a2 --- /dev/null +++ b/etx/examples/node/src/2_loopback_example.ts @@ -0,0 +1,183 @@ +// SPDX-FileCopyrightText: 2026 Verizon +// SPDX-License-Identifier: Apache-2.0 + +import { readFileSync } from 'node:fs'; +import { resolve } from 'node:path'; +import readline from 'node:readline'; +import { logger } from './utils/logger.js'; +import { getGeoAwareArgs } from './utils/parser.js'; +import { loadConfig } from './utils/config.js'; +import { createEtxClient } from './utils/client.js'; +import { BSMGenerator } from './utils/message.js'; +import { createCodec, type Codec } from "j2735codec"; +import type { MQTTClient } from './utils/mqtt.js'; + +/** + * Orchestrates a bidirectional loopback test on the ETX platform. + * This client sends BSMs (Basic Safety Messages) and listens for them + * to be echoed back by the ETX broker to verify mTLS and routing. + */ +class LoopbackClient { + private received = 0; + private sent = 0; + private readonly msgCount = 5; // Total messages to exchange before exit + private interval: NodeJS.Timeout | null = null; + private rl: readline.Interface; + + constructor( + private client: MQTTClient, + private codec: Codec, + private bsmGen: BSMGenerator, + private location: any + ) { + // Setup the "Panic Button" for manual exit (Press Enter to quit) + this.rl = readline.createInterface({ input: process.stdin, terminal: false }); + this.rl.on('line', () => this.shutdown("Manual exit triggered")); + } + + /** + * Starts the connection and begins the loopback sequence. + */ + public start(): void { + this.client.connect((etx) => { + logger.info("Connected to ETX Broker. Fetching Session ID..."); + this.setupSession(etx); + }); + } + + /** + * Subscribes to ClientInfo to obtain the unique SessionID assigned by the platform. + */ + private setupSession(etx: any): void { + const CLIENT_INFO_TOPIC = "vzimp/1/ClientInfo"; + + etx.subscribe(CLIENT_INFO_TOPIC, (topic: string, payload: Buffer) => { + try { + const { SessionID } = JSON.parse(payload.toString()); + etx.unsubscribe(CLIENT_INFO_TOPIC); + + logger.info(`Session ID acquired: ${SessionID}`); + this.runExchange(etx, SessionID); + } catch (err) { + logger.error("Failed to parse ClientInfo payload. Ensure broker is ETX-compliant."); + } + }); + } + + /** + * Main logic loop for publishing and receiving BSMs. + */ + private runExchange(etx: any, sessionId: string): void { + // Subscribe to the Private topic (where the broker echoes back the messages) + const subTopic = `vzimp/1/Private/+/+/+/+/+/${sessionId}`; + // Publish to the BSM ingest topic + const pubTopic = `vzimp/1/Private/${sessionId}/${etx.clientType}/${etx.clientSubtype}/${etx.vendorId}/j2735_gr/BSM`; + + // --- Handle Incoming Messages (Subscriber) --- + etx.subscribe(subTopic, (t: string, p: Buffer) => { + this.received++; + + try { + /** + * Mimicking Python Debug: Decode the incoming binary (UPER) + * back into a JSON object (JER) to inspect the contents. + */ + // 1. Get the raw result from the WASM codec (String or Int8Array) + const rawResult = this.codec.decodeEtx(p); + + // 2. Normalize to string + const jsonStr = (typeof rawResult === 'string') + ? rawResult + : new TextDecoder().decode(rawResult); + + // 3. Print the raw decoded string directly + logger.info(`<<< [${this.received}/${this.msgCount}] Received Loopback`); + logger.debug(`Printing Payload #${this.received}:\n${jsonStr}`) + } catch (decodeErr) { + logger.error(`<<< Received message but failed to decode J2735: ${decodeErr}`); + } + + if (this.received >= this.msgCount) { + this.shutdown("All messages received successfully"); + } + }); + + // --- Handle Outgoing Messages (Publisher @ 1Hz) --- + this.interval = setInterval(() => { + this.sent++; + + // Generate a fresh BSM JSON (JER) + const bsmJer = this.bsmGen.get({ + lat: this.location.lat, + lon: this.location.lon, + device_id: sessionId.substring(0, 8) + }); + + // Convert JER -> UPER (Binary) and wrap in ETX Protobuf Envelope + const bin = this.codec.encodeEtx(bsmJer, this.location); + + etx.publish(pubTopic, Buffer.from(bin)); + logger.info(`>>> [${this.sent}/${this.msgCount}] Published BSM to ETX`); + + if (this.sent >= this.msgCount && this.interval) { + clearInterval(this.interval); + logger.info("Outbound message limit reached. Waiting for final loopback..."); + } + }, 1000); + } + + /** + * Cleanly closes connections and exits the process. + */ + private shutdown(reason: string): void { + logger.info(`${reason}. Cleaning up...`); + if (this.interval) clearInterval(this.interval); + + this.client.disconnect(); + this.rl.close(); + + // Force process termination + setTimeout(() => process.exit(0), 500); + } +} + +/** + * Main bootstrap function to initialize services and start the client. + */ +async function main() { + try { + const args = getGeoAwareArgs(); + const devicePath = resolve(process.cwd(), args.deviceFile as string); + const artifact = JSON.parse(readFileSync(devicePath, 'utf-8')); + + // Load configuration from frozen_config (mTLS certs, URLs, etc.) + const config = loadConfig(artifact.frozen_config, args); + logger.setLevel(config.logLevel); + + // Initialize WASM Codec and mTLS MQTT Client concurrently + const [codec, client] = await Promise.all([ + createCodec(), + createEtxClient(config, artifact.registration) + ]); + + const loopback = new LoopbackClient( + client, + codec, + new BSMGenerator(), + config.identity.attributes.location + ); + + loopback.start(); + + } catch (err: any) { + // Top-level error handling for initialization failures + if (logger) { + logger.error(`Main Execution Failed: ${err.message}`); + } else { + console.error(`Main Execution Failed: ${err.message}`); + } + process.exit(1); + } +} + +main(); \ No newline at end of file diff --git a/etx/examples/node/src/3_speedmon_example.ts b/etx/examples/node/src/3_speedmon_example.ts new file mode 100644 index 0000000..5025034 --- /dev/null +++ b/etx/examples/node/src/3_speedmon_example.ts @@ -0,0 +1,212 @@ +// SPDX-FileCopyrightText: 2026 Verizon +// SPDX-License-Identifier: Apache-2.0 + +import { readFileSync } from 'node:fs'; +import { resolve } from 'node:path'; +import readline from 'node:readline'; +import nGhash from 'ngeohash'; + +import { logger } from './utils/logger.js'; +import { getGeoAwareArgs } from './utils/parser.js'; +import { loadConfig } from './utils/config.js'; +import { createEtxClient, ETXClient } from './utils/client.js'; +import { TIMGenerator } from './utils/message.js'; +import { createCodec, type Codec } from "j2735codec"; +import type { MQTTClient } from './utils/mqtt.js'; +import { parseArgs } from 'node:util'; + +// SAE J2735 Standard: Speed is transmitted in units of 0.02 m/s +const BSM_SPEED_UNIT = 0.02; +const MPH_TO_MS = 0.44704; + +/** + * Monitors regional vehicle traffic and issues targeted safety warnings. + * Demonstrates 'Geo-Aware' subscription logic and targeted Private TIM issuance. + */ +class SpeedMonitorClient { + private j2735Limit: number; + private timGen: TIMGenerator; + private decodeCodec: Codec; + private encodeCodec: Codec; + private rl: readline.Interface; + + constructor( + private client: ETXClient, + private config: any, + limitMph: number, + rxCodec: Codec, + txCodec: Codec + ) { + // Convert MPH to J2735 integer format (0.02 m/s units) + this.j2735Limit = Math.floor((limitMph * MPH_TO_MS) / BSM_SPEED_UNIT); + + this.timGen = new TIMGenerator(); + this.decodeCodec = rxCodec; + this.encodeCodec = txCodec; + + // Panic button for manual exit + this.rl = readline.createInterface({ input: process.stdin, terminal: false }); + this.rl.on('line', () => this.shutdown("Manual exit triggered")); + } + + /** + * Establishes connection and begins monitoring. + */ + public start(): void { + logger.info("Initializing Regional Speed Monitor..."); + this.client.connect((etx) => { + this.onConnect(etx); + }); + + console.log("\n>>> SPEED MONITOR ACTIVE. Press [ENTER] to stop. <<<\n"); + } + + /** + * Calculates geohash neighbors to listen for all vehicles in the vicinity. + */ + private onConnect(client: MQTTClient): void { + const { lat, lon } = this.config.identity.attributes.location; + + // Geohash precision 6 covers roughly 1.2km x 0.6km + const middle = nGhash.encode(lat, lon, 6); + // Get the center cell plus all 8 adjacent cells + const hashes = [middle, ...nGhash.neighbors(middle)]; + + for (const ghash of hashes) { + // ETX Convention: Geohashes in topics must be delimited by '/' + const ghashPath = ghash.split('').join('/'); + + // Topic Pattern: Regional//+/+/+/+/Public/j2735_gr/BSM/ + const topic = `vzimp/1/Regional/${ghashPath}/+/+/+/+/Public/j2735_gr/+/+`; + + client.subscribe(topic, (t, p) => this.onBsmReceived(t, p)); + logger.debug(`Monitoring Regional Path: ${ghashPath}`); + } + } + + /** + * Processes every BSM received in the monitored regions. + */ + private onBsmReceived(topic: string, payload: Buffer): void { + try { + // 1. Decode ETX Binary -> J2735 JER (JSON String) + const decodedJson = this.decodeCodec.decodeEtx(new Uint8Array(payload)) as string; + const bsm = JSON.parse(decodedJson); + + console.log(bsm); + + // Access J2735 path: value -> coreData + const coreData = bsm.value.coreData; + const speed = coreData.speed || 0; + + // 2. Extract sender's SessionID from the last segment of the topic + const parts = topic.split("/"); + const senderSession = parts[parts.length - 1] || "unknown"; + + // 3. Check for violation + const actualMph = (speed * BSM_SPEED_UNIT) / MPH_TO_MS; + + if (speed > this.j2735Limit) { + logger.warn(`VIOLATION: Vehicle ${senderSession.substring(0, 8)} at ${actualMph.toFixed(2)} mph`); + + // J2735 Lats/Lons are degrees * 10^7 + const vLat = coreData.lat / 10000000; + const vLon = coreData.long / 10000000; + + // 4. Issue a targeted warning + this.sendWarning(senderSession, vLat, vLon); + } else { + logger.debug(`Vehicle ${senderSession.substring(0, 8)} at ${actualMph.toFixed(2)} mph, under limit`); + } + } catch (e: any) { + logger.error(`BSM Processing Error: ${e.message}`); + } + } + + /** + * Generates and sends a targeted Private TIM warning. + */ + private sendWarning(sessionId: string, lat: number, lon: number): void { + try { + // Targeted Private Topic: Private/////j2735_gr/TIM + const pubTopic = `vzimp/1/Private/${sessionId}/${this.client['clientType']}/${this.client['clientSubtype']}/${this.client['vendorId']}/j2735_gr/TIM`; + + // Generate TIM JER JSON + const rawJson = this.timGen.get({ lat, lon }); + + // Encode to ETX binary using the TX codec + const binaryPayload = this.encodeCodec.encodeEtx(rawJson, { lat, lon }); + + this.client.publish(pubTopic, Buffer.from(binaryPayload)); + logger.info(`>>> Issued Private TIM Warning to ${sessionId.substring(0, 8)}`); + } catch (e: any) { + logger.error(`Failed to transmit TIM: ${e.message}`); + } + } + + private shutdown(reason: string): void { + logger.info(`${reason}. Cleaning up...`); + this.client.disconnect(); + this.rl.close(); + process.exit(0); + } +} + +/** + * Helper function to parse speed argument. + */ +function parseSpeedArg() { + const limitArg = {'limit': {type: 'string' as const, default: '25.0'}}; + const { values } = parseArgs({ options: limitArg, strict: false}); + const limitMph = parseFloat(values.limit as string); + if (isNaN(limitMph) || limitMph < 0) { + logger.error(`Invalid speed value: "${values.limit}". Please provide a positive number.`); + return undefined + } + return limitMph; +} + +/** --- Bootstrap Logic --- */ +async function main() { + try { + const args = getGeoAwareArgs(); + const limitMph = parseSpeedArg(); + if (!limitMph){ + process.exit(1); + } + + const devicePath = resolve(process.cwd(), args.deviceFile as string); + const artifact = JSON.parse(readFileSync(devicePath, 'utf-8')); + const config = loadConfig(artifact.frozen_config, args); + + logger.setLevel(config.logLevel); + + /** + * Initialize two codecs to mimic the thread-safety of the Python version + * (One for decoding incoming BSMs, one for encoding outgoing TIMs) + */ + const [rxCodec, txCodec, client] = await Promise.all([ + createCodec(), + createCodec(), + createEtxClient(config, artifact.registration) + ]); + + logger.debug(`Setting speed limit: ${limitMph} mph`); + + const monitor = new SpeedMonitorClient( + client, + config, + limitMph, + rxCodec, + txCodec + ); + + monitor.start(); + + } catch (err: any) { + logger.error(`Main Execution Failed: ${err.message}`); + process.exit(1); + } +} + +main(); \ No newline at end of file diff --git a/etx/examples/node/src/4_vehicle_example.ts b/etx/examples/node/src/4_vehicle_example.ts new file mode 100644 index 0000000..a09e4b2 --- /dev/null +++ b/etx/examples/node/src/4_vehicle_example.ts @@ -0,0 +1,184 @@ +// SPDX-FileCopyrightText: 2026 Verizon +// SPDX-License-Identifier: Apache-2.0 + +import { readFileSync } from 'node:fs'; +import { resolve } from 'node:path'; +import readline from 'node:readline'; + +import { logger } from './utils/logger.js'; +import { getGeoAwareArgs } from './utils/parser.js'; +import { loadConfig } from './utils/config.js'; +import { createEtxClient } from './utils/client.js'; +import { BSMGenerator } from './utils/message.js'; +import { createCodec, type Codec } from "j2735codec"; +import type { MQTTClient } from './utils/mqtt.js'; +import { parseArgs } from 'node:util'; + +// SAE J2735 Standard Units +const BSM_SPEED_UNIT = 0.02; // 0.02 m/s per unit +const MPH_TO_MS = 0.44704; + +/** + * VehicleClient + * Simulates an On-Board Unit (OBU): + * 1. Broadcasts BSM telemetry at 1Hz (Outbound). + * 2. Listens for regional TIM, SPaT, and MAP messages (Inbound). + */ +class VehicleClient { + private bsmGen: BSMGenerator; + private decodeCodec: Codec; + private encodeCodec: Codec; + private broadcastInterval: NodeJS.Timeout | null = null; + private rl: readline.Interface; + private sessionId: string | null = null; + private speedUnits: number; + + // V2X Topic Schema for inbound safety streams + private readonly SUB_TOPICS = [ + "vzimp/1/Private/+/+/+/j2735_gr/+/+", + "vzimp/1/GeoRelevance/+/+/Public/j2735_gr/TIM/+", + "vzimp/1/GeoRelevance/+/+/Public/j2735_gr/SPAT/+", + "vzimp/1/GeoRelevance/+/+/Public/j2735_gr/MAP/+", + ]; + + constructor( + private client: MQTTClient, + private config: any, + rxCodec: Codec, + txCodec: Codec, + speedMph: number + ) { + this.bsmGen = new BSMGenerator(); + this.decodeCodec = rxCodec; + this.encodeCodec = txCodec; + + // Convert MPH to J2735 integer units + this.speedUnits = Math.floor((speedMph * MPH_TO_MS) / BSM_SPEED_UNIT); + + this.rl = readline.createInterface({ input: process.stdin, terminal: false }); + this.rl.on('line', () => this.shutdown("User Exit")); + } + + public start(): void { + logger.info("Initializing Vehicle OBU..."); + this.client.connect((etx) => { + this.onConnect(etx); + }); + + console.log("\n>>> VEHICLE ACTIVE. Press [ENTER] to stop. <<<\n"); + } + + private onConnect(etx: any): void { + logger.info("mTLS Handshake successful. Fetching Session ID..."); + etx.subscribe("vzimp/1/ClientInfo", (topic: string, payload: Buffer) => { + const { SessionID } = JSON.parse(payload.toString()); + this.sessionId = SessionID; + etx.unsubscribe("vzimp/1/ClientInfo"); + + logger.info(`Vehicle Session ID acquired: ${this.sessionId}`); + + this.startServices(etx); + }); + } + + private startServices(etx: any): void { + // 1. Subscribe to inbound safety streams + for (const topic of this.SUB_TOPICS) { + etx.subscribe(topic, (t: string, p: Buffer) => this.onMessageReceived(t, p)); + logger.debug(`Active Subscription: ${topic}`); + } + + // 2. Start BSM Broadcast loop (1Hz) + const pubTopic = `vzimp/1/GeoRelevance/${etx.clientType}/${etx.clientSubtype}/Public/j2735_gr/BSM`; + + this.broadcastInterval = setInterval(() => { + try { + const lat = this.config.identity.attributes.location.lat; + const lon = this.config.identity.attributes.location.lon; + + const bsmJer = this.bsmGen.get({ + lat, + lon, + speed: this.speedUnits, + device_id: this.sessionId?.substring(0, 8) + }); + + // Encode via WASM Codec + const bin = this.encodeCodec.encodeEtx(bsmJer, { lat, lon }); + etx.publish(pubTopic, Buffer.from(bin)); + + logger.debug(`>>> Sent BSM (Lat: ${lat}, Lon: ${lon}, Speed Units: ${this.speedUnits})`); + } catch (e: any) { + logger.error(`Broadcast Error: ${e.message}`); + } + }, 1000); + } + + private onMessageReceived(topic: string, payload: Buffer): void { + try { + const decoded = this.decodeCodec.decodeEtx(new Uint8Array(payload)) as string; + const msgType = topic.split('/').slice(-2, -1)[0]; + logger.info(`<<< INBOUND [${msgType}]: ${decoded}`); + } catch (e: any) { + logger.error(`Codec Error on topic ${topic}: ${e.message}`); + } + } + + private shutdown(reason: string): void { + logger.info(`${reason}. Cleaning up vehicle session...`); + if (this.broadcastInterval) clearInterval(this.broadcastInterval); + this.client.disconnect(); + this.rl.close(); + process.exit(0); + } +} + + +/** + * Helper function to parse speed argument. + */ +function parseSpeedArg() { + const speedArgs = {'speed': {type: 'string' as const, default: '30.0'}}; + const { values } = parseArgs({ options: speedArgs, strict: false}); + const speedMph = parseFloat(values.speed as string); + if (isNaN(speedMph) || speedMph < 0) { + logger.error(`Invalid speed value: "${values.speed}". Please provide a positive number.`); + return undefined + } + return speedMph; +} + +/** --- Bootstrap Logic --- */ +async function main() { + try { + const args = getGeoAwareArgs(); + const speedMph = parseSpeedArg(); + if (!speedMph){ + process.exit(1); + } + + const devicePath = resolve(process.cwd(), args.deviceFile as string); + const artifact = JSON.parse(readFileSync(devicePath, 'utf-8')); + const config = loadConfig(artifact.frozen_config, args); + + logger.setLevel(config.logLevel); + + // Initialize dual codecs (RX/TX) and mTLS client + const [rxCodec, txCodec, client] = await Promise.all([ + createCodec(), + createCodec(), + createEtxClient(config, artifact.registration) + ]); + + logger.debug(`Setting speed: ${speedMph} mph`); + + const vehicle = new VehicleClient(client, config, rxCodec, txCodec, speedMph); + vehicle.start(); + + } catch (err: any) { + logger.error(`Vehicle Execution Failed: ${err.message}`); + process.exit(1); + } +} + +main(); \ No newline at end of file diff --git a/etx/examples/node/src/utils/client.ts b/etx/examples/node/src/utils/client.ts new file mode 100644 index 0000000..3d74deb --- /dev/null +++ b/etx/examples/node/src/utils/client.ts @@ -0,0 +1,171 @@ +// SPDX-FileCopyrightText: 2025 Verizon +// SPDX-License-Identifier: Apache-2.0 + +import { MQTTClient, type MQTTMessageCallback } from './mqtt.js'; +import { + type ACLRule, + type RegistrationResponse, + getAclRules, + getConnectionDetails +} from './registration.js'; +import type { AppConfig } from './config.js'; +import { getThingSpaceToken } from './oauth.js'; +import { logger } from './logger.js'; + +/** + * Direction of MQTT data flow for ACL validation. + */ +export enum DataDirection { + PUB = "pub", + SUB = "sub" +} + +/** + * High-level ETX Client that adds ACL validation on top of the base MQTTClient. + * Cross-references every publish/subscribe attempt against the ETX assigned rules. + */ +export class ETXClient extends MQTTClient { + private aclRules: ACLRule[]; + private pubTopicCache: Set = new Set(); + private subTopicCache: Set = new Set(); + + public vendorId?: string | undefined; + public clientType?: string | undefined; + public clientSubtype?: string | undefined; + + constructor( + url: string, + clientId: string, + certificate: any, // Matches Certificate interface from client.ts + aclRules: ACLRule[], + connectTimeout: number = 3000 + ) { + super(url, clientId, certificate, connectTimeout); + this.aclRules = aclRules; + + // Parse identity metadata from the first ACL rule name + try { + const profileString = aclRules[0]?.name.split(":").pop() || ""; + const parts = profileString.split("."); + this.vendorId = parts[parts.length - 1]; + this.clientSubtype = parts[parts.length - 2]; + this.clientType = parts[parts.length - 3]; + } catch (e) { + logger.warn("ETXClient: Could not parse identity metadata from ACL rule name."); + } + } + + /** + * Internal check to verify if a topic is permitted. + */ + private checkAcl(direction: DataDirection, topic: string): boolean { + for (const rule of this.aclRules) { + const patterns = direction === DataDirection.PUB ? rule.publish : rule.subscribe; + if (matchRules(patterns, topic)) { + return true; + } + } + return false; + } + + public override publish(topic: string, message: string | Buffer, qos: 0 | 1 | 2 = 0): void { + if (!this.pubTopicCache.has(topic)) { + if (!this.checkAcl(DataDirection.PUB, topic)) { + logger.error(`ETX ACL Violation: Publish denied for topic '${topic}'`); + return; + } + this.pubTopicCache.add(topic); + } + super.publish(topic, message, qos); + } + + public override subscribe(topic: string, callback: MQTTMessageCallback, qos: 0 | 1 | 2 = 0): void { + if (!this.subTopicCache.has(topic)) { + if (!this.checkAcl(DataDirection.SUB, topic)) { + logger.error(`ETX ACL Violation: Subscribe denied for topic '${topic}'`); + return; + } + this.subTopicCache.add(topic); + } + super.subscribe(topic, callback, qos); + } + + public getSubscriptionLimit(): number { + return this.aclRules[0]?.subscribeLimit || 0; + } +} + +/** + * Evaluates an input topic against a list of ETX-style patterns. + * Supports: *, **, ^ (deny), and | (pipe/OR). + */ +export function matchRules(rules: string[], inputTopic: string): boolean { + const topicParts = inputTopic.split("/"); + + for (const rule of rules) { + let matched = true; + let checkLength = true; + const ruleParts = rule.split("/"); + + let i = 0; + for (; i < ruleParts.length; i++) { + const currentRulePart = ruleParts[i]; + + if (i >= topicParts.length) { + matched = false; + break; + } + + // 1. Single-level wildcard (*) + if (currentRulePart === "*") continue; + + // 2. Multi-level wildcard (**) + if (currentRulePart === "**") { + checkLength = false; + matched = true; + break; + } + + // 3. Deny logic (^) and Pipe logic (|) + let isDeny = false; + let ruleToken = currentRulePart!; + if (ruleToken.startsWith("^")) { + isDeny = true; + ruleToken = ruleToken.substring(1); + } + + const options = ruleToken.split("|"); + const matchFound = options.includes(topicParts[i]!); + + if ((isDeny && matchFound) || (!isDeny && !matchFound)) { + matched = false; + break; + } + } + + if (checkLength && matched && i !== topicParts.length) { + matched = false; + } + + if (matched) return true; + } + + return false; +} + +/** + * Factory function to initialize an ETXClient. + */ +export async function createEtxClient(conf: AppConfig, regDetails: RegistrationResponse): Promise { + const tokenPair = await getThingSpaceToken(conf); + const connResp = await getConnectionDetails(conf, tokenPair, regDetails.deviceId); + const aclRules = await getAclRules(conf, tokenPair); + + return new ETXClient( + connResp.mqttUrl, + regDetails.deviceId, + regDetails.certificate, + aclRules, + 10000 // 10s timeout for cloud handshake + ); +} \ No newline at end of file diff --git a/etx/examples/node/src/utils/config.ts b/etx/examples/node/src/utils/config.ts new file mode 100644 index 0000000..4b3d203 --- /dev/null +++ b/etx/examples/node/src/utils/config.ts @@ -0,0 +1,129 @@ +// SPDX-FileCopyrightText: 2025 Verizon +// SPDX-License-Identifier: Apache-2.0 + +import { readFileSync, existsSync } from 'fs'; +import { resolve } from 'path'; + +// --- 1. Strict Data Structures (Interfaces) --- + +export interface Location { + lat: number; + lon: number; +} + +export interface Attributes { + clientType: string; + clientSubType: string; + vendorId: string; + location: Location; +} + +export interface Identity { + user: string; + password: string; + token: string; + attributes: Attributes; +} + +export interface Endpoints { + oauthUrl: string; + sessionUrl: string; + oauthTimeout: number; + registrationUrl: string; + registrationTimeout: number; +} + +export interface AppConfig { + logLevel: string; + certDir: string; + endpoints: Endpoints; + identity: Identity; +} + +/** + * Validates WGS84 Latitude and Longitude. + */ +function validateCoordinates(lat: number, lon: number): void { + if (lat < -90 || lat > 90) { + throw new Error(`Invalid config for latitude: ${lat}. Must be between -90 and 90.`); + } + if (lon < -180 || lon > 180) { + throw new Error(`Invalid config for longitude: ${lon}. Must be between -180 and 180.`); + } +} + +/** + * Loads JSON and merges CLI overrides. + * @param configSource Path to JSON file or a pre-parsed object. + * @param args Parsed CLI arguments from parser.ts. + */ +export function loadConfig(configSource: string | object, args?: any): AppConfig { + let data: any; + + // 1. Determine the raw data + if (typeof configSource === 'string') { + const path = resolve(process.cwd(), configSource); + if (!existsSync(path)) { + throw new Error(`Config file not found: ${path}`); + } + data = JSON.parse(readFileSync(path, 'utf-8')); + } else { + data = configSource; + } + + // 2. Map and Validate Structure + try { + const identRaw = data.identity; + const attrRaw = identRaw.attributes; + const locRaw = attrRaw.location; + + // Force structure validation through explicit assignment + const config: AppConfig = { + logLevel: data.logLevel ?? "DEBUG", + certDir: data.certDir ?? "./certs", + endpoints: { + oauthUrl: data.endpoints?.oauthUrl ?? "https://thingspace.verizon.com/api/ts/v1/oauth2/token", + sessionUrl: data.endpoints?.sessionUrl ?? "https://thingspace.verizon.com/api/m2m/v1/session/login", + oauthTimeout: data.endpoints?.oauthTimeout ?? 30000, + registrationUrl: data.endpoints?.registrationUrl ?? "https://imp.thingspace.verizon.com", + registrationTimeout: data.endpoints?.registrationTimeout ?? 45000 + }, + identity: { + user: identRaw.user, + password: identRaw.password, + token: identRaw.token, + attributes: { + clientType: attrRaw.clientType, + clientSubType: attrRaw.clientSubType, + vendorId: attrRaw.vendorId, + location: { + lat: Number(locRaw.lat), + lon: Number(locRaw.lon) + } + } + } + }; + + // 3. Apply CLI Overrides + if (args) { + if (args.logLevel) config.logLevel = (args.logLevel as string).toUpperCase(); + if (args.certDir) config.certDir = args.certDir; + if (args.lat) config.identity.attributes.location.lat = Number(args.lat); + if (args.lon) config.identity.attributes.location.lon = Number(args.lon); + } + + // 4. Final Coordinate Validation + validateCoordinates( + config.identity.attributes.location.lat, + config.identity.attributes.location.lon + ); + + return config; + + } catch (error: any) { + if (error instanceof TypeError || error instanceof ReferenceError) { + throw new Error(`Missing required configuration field or type mismatch. Check your config.json structure. Error: ${error.message}`); + } + throw error; // Re-throw coordinate or file errors + } +} \ No newline at end of file diff --git a/etx/examples/node/src/utils/logger.ts b/etx/examples/node/src/utils/logger.ts new file mode 100644 index 0000000..aee2cd7 --- /dev/null +++ b/etx/examples/node/src/utils/logger.ts @@ -0,0 +1,63 @@ +// SPDX-FileCopyrightText: 2025 Verizon +// SPDX-License-Identifier: Apache-2.0 + +/** + * ANSI Escape Codes for Terminal Colors + */ +const Colors = { + DEBUG: "\x1b[34m", // Blue + INFO: "\x1b[32m", // Green + WARN: "\x1b[33m", // Yellow + ERROR: "\x1b[31m", // Red + RESET: "\x1b[0m", // Clears formatting + DIM: "\x1b[2m" // Faded text for timestamps +}; + +/** + * Safe LogLevel Enum + * Enums provide compile-time safety and prevent "undefined" lookup errors. + */ +export enum LogLevel { + DEBUG = 0, + INFO = 1, + WARN = 2, + ERROR = 3 +} + +// Internal state: default to INFO +let currentLevel: LogLevel = LogLevel.INFO; + +/** + * Core logging logic. + * Filters based on the LogLevel enum. + */ +function log(label: keyof typeof LogLevel, color: string, msg: any) { + // Enum values are numbers, so we can compare directly + if (LogLevel[label] < currentLevel) return; + + const time = new Date().toISOString().replace('T', ' ').split('.')[0]; + const message = msg instanceof Error ? msg.stack : msg; + + console.log(`${Colors.DIM}${time}${Colors.RESET} [${color}${label}${Colors.RESET}]: ${message}`); +} + +/** + * Exported logger object. + */ +export const logger = { + /** + * Updates the minimum log level. + * Maps string input (from config.json) to the LogLevel enum safely. + */ + setLevel(levelStr: string) { + const key = levelStr.toUpperCase() as keyof typeof LogLevel; + if (LogLevel[key] !== undefined) { + currentLevel = LogLevel[key]; + } + }, + + debug: (msg: any) => log('DEBUG', Colors.DEBUG, msg), + info: (msg: any) => log('INFO', Colors.INFO, msg), + warn: (msg: any) => log('WARN', Colors.WARN, msg), + error: (msg: any) => log('ERROR', Colors.ERROR, msg) +}; \ No newline at end of file diff --git a/etx/examples/node/src/utils/message.ts b/etx/examples/node/src/utils/message.ts new file mode 100644 index 0000000..9fd9ab6 --- /dev/null +++ b/etx/examples/node/src/utils/message.ts @@ -0,0 +1,185 @@ +// SPDX-FileCopyrightText: 2025 Verizon +// SPDX-License-Identifier: Apache-2.0 + +/** + * Base interface for all V2X message templates. + */ +export abstract class MessageGenerator { + /** + * Returns a JER-encoded JSON string. + * @param kwargs Optional overrides for message fields. + */ + abstract get(kwargs?: Record): string; +} + +/** + * Generator for J2735 Basic Safety Messages (BSM). + * Tracks state for msgCnt (0-127). + */ +export class BSMGenerator extends MessageGenerator { + public msgCnt: number = -1; + + /** + * Generates a JER-encoded BSM JSON string. + * * Available kwargs: + * - device_id (string): 4-byte hex string (default: "0A0B0C0D") + * - lat (number): Latitude in decimal degrees + * - lon (number): Longitude in decimal degrees + * - elev (number): Elevation in decimeters (default: 300) + * - speed (number): Speed in units of 0.02 m/s (default: 150) + * - heading (number): Heading in units of 0.0125 deg (default: 9000) + * - angle (number): Steering wheel angle (default: 0) + * - width (number): Vehicle width in cm (default: 180) + * - length (number): Vehicle length in cm (default: 420) + */ + get(kwargs: Record = {}): string { + // Increment and wrap msgCnt (0-127) + this.msgCnt = (this.msgCnt + 1) % 128; + + const deviceId = kwargs.device_id ?? "0A0B0C0D"; + const lat = kwargs.lat ?? 38.9123456; + const lon = kwargs.lon ?? -77.1234567; + const elev = kwargs.elev ?? 300; + const speed = kwargs.speed ?? 150; + const heading = kwargs.heading ?? 9000; + const angle = kwargs.angle ?? 0; + const width = kwargs.width ?? 180; + const length = kwargs.length ?? 420; + + const bsmDict = { + messageId: 20, + value: { + coreData: { + msgCnt: this.msgCnt, + id: deviceId, + secMark: 12345, + lat: Math.round(lat * 10000000), + long: Math.round(lon * 10000000), + elev: elev, + accuracy: { semiMajor: 50, semiMinor: 50, orientation: 0 }, + transmission: "forwardGears", + speed: speed, + heading: heading, + angle: angle, + accelSet: { long: 0, lat: 0, vert: -127, yaw: 0 }, + brakes: { + wheelBrakes: "00", + traction: "on", + abs: "unavailable", + scs: "unavailable", + brakeBoost: "unavailable", + auxBrakes: "unavailable" + }, + size: { + width: width, + length: length + } + } + } + }; + + return JSON.stringify(bsmDict); + } +} + +/** + * Generator for J2735 Traveler Information Messages (TIM). + * Matches specific schema with regions, path nodes, and padding fields. + */ +export class TIMGenerator { + private msgCnt: number = 0; + private defaultItis: number; + + constructor(defaultItis: number = 3343) { + this.defaultItis = defaultItis; + } + + /** + * Generates a JER-encoded TIM JSON string. + * @param kwargs Configuration object for the message + * @returns A stringified JSON object following the J2735 TIM schema + */ + public get(kwargs: Record = {}): string { + // Increment message count (0-127) + this.msgCnt = (this.msgCnt + 1) % 128; + + const J2735_SCALE = 10000000; + + // Coordinates for the RoadSign position + const lat = Math.round((kwargs.lat ?? 34.0551196) * J2735_SCALE); + const lon = Math.round((kwargs.lon ?? -84.2760493) * J2735_SCALE); + + // Minute of the year (0-527040) + // Date.now() is in ms, divide by 60000 to get minutes + const timestamp = Math.floor((Date.now() / 60000) % 527040); + + // ITIS codes: Defaults to Speeding (3343) and Vehicle (13583) + const itisList: number[] = kwargs.itis_codes ?? [this.defaultItis, 13583]; + const contentItems = itisList.map(code => ({ + item: { itis: code } + })); + + // Use provided path nodes or default box + const pathNodes = kwargs.path ?? [ + { lat: 34.2069324, lon: -84.1985514 }, + { lat: 34.2015808, lon: -84.1976939 } + ]; + + const nodesJson = pathNodes.map((node: { lat: number; lon: number }) => { + // Ensure scaling: if absolute value is small, scale it. + const nLat = Math.abs(node.lat) < 1000 ? Math.round(node.lat * J2735_SCALE) : node.lat; + const nLon = (node.lon < 0 && node.lon > -180) ? Math.round(node.lon * J2735_SCALE) : node.lon; + + return { + delta: { + "node-LatLon": { lon: nLon, lat: nLat } + } + }; + }); + + const timDict = { + messageId: 31, + value: { + msgCnt: this.msgCnt, + timeStamp: timestamp, + packetID: kwargs.packet_id ?? "340850DE403C715CE9", + urlB: "null", + dataFrames: [{ + doNotUse1: 0, + frameType: "advisory", + msgId: { + roadSignID: { + position: { lat: lat, long: lon }, + viewAngle: "FFFF", + mutcdCode: "warning" + } + }, + startYear: 2026, // Current Year + startTime: timestamp, + durationTime: kwargs.duration ?? 28800, + priority: kwargs.priority ?? 5, + doNotUse2: 0, + regions: [{ + description: { + path: { + offset: { + ll: { + nodes: nodesJson + } + } + } + } + }], + doNotUse3: 0, + doNotUse4: 0, + content: { + advisory: contentItems + }, + url: "null" + }] + } + }; + + return JSON.stringify(timDict); + } +} \ No newline at end of file diff --git a/etx/examples/node/src/utils/mqtt.ts b/etx/examples/node/src/utils/mqtt.ts new file mode 100644 index 0000000..cefcf37 --- /dev/null +++ b/etx/examples/node/src/utils/mqtt.ts @@ -0,0 +1,187 @@ +// SPDX-FileCopyrightText: 2026 Verizon +// SPDX-License-Identifier: Apache-2.0 + +import mqtt from 'mqtt'; +import type { Certificate } from './registration.js'; +import { logger } from './logger.js'; + +/** + * Type aliases for the callback events. + */ +export type MQTTMessageCallback = (topic: string, payload: Buffer) => void; +export type MQTTEventCallback = (client: MQTTClient) => void; + +interface MQTTConfig { + brokerAddress: string; + port: number; + clientId: string; + certificate: Certificate; + connectTimeout: number; +} + +/** + * A wrapper around the MQTT.js library that supports + * wildcard topic matching and subscription-time callbacks. + */ +export class MQTTClient { + private config: MQTTConfig; + private client: mqtt.MqttClient | null = null; + + /** * We store subscriptions in an array so we can iterate through + * them to find wildcard matches (which a Map cannot do). + */ + private subscriptions: Array<{ pattern: string, callback: MQTTMessageCallback }> = []; + + public isConnected: boolean = false; + + constructor( + url: string, + clientId: string, + certificate: Certificate, + connectTimeout: number = 3000 + ) { + const parsed = new URL(url); + if (!parsed.hostname || !parsed.port) { + throw new Error(`Invalid MQTT URL: ${url}. Port and Hostname are required.`); + } + + this.config = { + brokerAddress: parsed.hostname, + port: parseInt(parsed.port), + clientId: clientId, + certificate: certificate, + connectTimeout: connectTimeout + }; + } + + /** + * Internal helper to determine if an incoming topic matches a subscribed pattern. + * Supports '+' (single level) and '#' (multi-level) wildcards. + */ + private topicMatches(pattern: string, topic: string): boolean { + const patternParts = pattern.split('/'); + const topicParts = topic.split('/'); + + for (let i = 0; i < patternParts.length; i++) { + // '#' matches everything remaining + if (patternParts[i] === '#') return true; + + // '+' matches exactly one level, otherwise parts must be identical + if (patternParts[i] !== '+' && patternParts[i] !== topicParts[i]) { + return false; + } + } + // If no '#' was used, lengths must match exactly + return patternParts.length === topicParts.length; + } + + /** + * Establishes mTLS connection to the broker. + */ + public connect( + onConnect?: MQTTEventCallback, + onDisconnect?: MQTTEventCallback + ): void { + const options: mqtt.IClientOptions = { + clientId: this.config.clientId, + port: this.config.port, + host: this.config.brokerAddress, + protocol: 'mqtts', + connectTimeout: this.config.connectTimeout, + ca: this.config.certificate.ca, + cert: this.config.certificate.cert, + key: this.config.certificate.key, + rejectUnauthorized: true, + // Reconnect logic can keep Node.js alive; set to a sensible value or 0 for fail-fast + reconnectPeriod: 5000, + }; + + this.client = mqtt.connect(options); + + this.client.on('connect', () => { + this.isConnected = true; + logger.info(`MQTT Client ${this.config.clientId}: Connection successful.`); + if (onConnect) onConnect(this); + }); + + this.client.on('close', () => { + if (this.isConnected) { + this.isConnected = false; + logger.warn(`MQTT Client ${this.config.clientId}: Disconnected from broker.`); + if (onDisconnect) onDisconnect(this); + } + }); + + this.client.on('error', (err: Error) => { + logger.error(`MQTT Client Error: ${err.message}`); + }); + + /** + * The central message router. + * Iterates through stored subscription patterns to find the correct callback. + */ + this.client.on('message', (topic: string, payload: Buffer) => { + for (const sub of this.subscriptions) { + if (this.topicMatches(sub.pattern, topic)) { + sub.callback(topic, payload); + } + } + }); + } + + /** + * Publishes a message to a specific topic. + */ + public publish(topic: string, message: string | Buffer, qos: 0 | 1 | 2 = 0): void { + if (!this.client) return; + this.client.publish(topic, message, { qos }, (err?: Error) => { + if (err) logger.error(`Publish failed on ${topic}: ${err.message}`); + }); + } + + /** + * Subscribes to a topic pattern and associates a callback. + * Use this for both literal topics and those with wildcards (+/#). + */ + public subscribe(topic: string, callback: MQTTMessageCallback, qos: 0 | 1 | 2 = 0): void { + if (!this.client) return; + + this.client.subscribe(topic, { qos }, (err) => { + if (err) { + logger.error(`Subscription failed for ${topic}: ${err.message}`); + } else { + // Add to our internal routing list + this.subscriptions.push({ pattern: topic, callback }); + logger.debug(`Subscribed to ${topic}`); + } + }); + } + + /** + * Unsubscribes from a topic and removes associated callbacks. + */ + public unsubscribe(topic: string): void { + if (!this.client) return; + this.client.unsubscribe(topic, (err) => { + if (!err) { + this.subscriptions = this.subscriptions.filter(s => s.pattern !== topic); + } + }); + } + + /** + * Forcefully closes the MQTT session. + * Passing 'true' to end() destroys the socket and clears reconnect timers, + * allowing the Node.js process to exit cleanly. + */ + public disconnect(): void { + if (this.client) { + // Clear internal state + this.subscriptions = []; + // Force immediate shutdown + this.client.end(true); + this.isConnected = false; + logger.info(`MQTT Client ${this.config.clientId}: Session closed.`); + } + } +} \ No newline at end of file diff --git a/etx/examples/node/src/utils/oauth.ts b/etx/examples/node/src/utils/oauth.ts new file mode 100644 index 0000000..bc19005 --- /dev/null +++ b/etx/examples/node/src/utils/oauth.ts @@ -0,0 +1,83 @@ +// SPDX-FileCopyrightText: 2025 Verizon +// SPDX-License-Identifier: Apache-2.0 +import type { AppConfig } from './config.js'; +import { logger } from './logger.js'; + +/** + * Data container for the two-tier authentication tokens required by Verizon. + */ +export interface TokenPair { + accessToken: string; + sessionToken: string; +} + +/** + * Orchestrates the two-step authentication flow for Verizon ThingSpace. + * * 1. OAuth2 Client Credentials exchange for a Bearer Token. + * 2. Session Login for an M2M Session Token. + */ +export async function getThingSpaceToken(config: AppConfig): Promise { + + // --- STEP 1: OBTAIN OAUTH2 ACCESS TOKEN --- + logger.debug("Requesting OAuth2 access token..."); + + const accessHeaders = { + "Content-Type": "application/x-www-form-urlencoded", + "Authorization": `Basic ${config.identity.token}` + }; + + const accessBody = new URLSearchParams({ + "grant_type": "client_credentials" + }); + + const accessResponse = await fetch(config.endpoints.oauthUrl, { + method: 'POST', + headers: accessHeaders, + body: accessBody, + // Timeout signal (Node fetch uses AbortController) + signal: AbortSignal.timeout(config.endpoints.oauthTimeout) + }); + + if (!accessResponse.ok) { + const errText = await accessResponse.text(); + throw new Error(`OAuth2 failed (${accessResponse.status}): ${errText}`); + } + + const accessJson = await accessResponse.json() as { access_token: string }; + const accessToken = accessJson.access_token; + + // --- STEP 2: OBTAIN M2M SESSION TOKEN --- + logger.debug("Requesting M2M session token..."); + + const sessionHeaders = { + "Content-Type": "application/json", + "Authorization": `Bearer ${accessToken}` + }; + + const sessionPayload = { + "username": config.identity.user, + "password": config.identity.password + }; + + const sessionResponse = await fetch(config.endpoints.sessionUrl, { + method: 'POST', + headers: sessionHeaders, + body: JSON.stringify(sessionPayload), + signal: AbortSignal.timeout(config.endpoints.oauthTimeout) + }); + + if (!sessionResponse.ok) { + const errText = await sessionResponse.text(); + throw new Error(`Session login failed (${sessionResponse.status}): ${errText}`); + } + + const sessionJson = await sessionResponse.json() as { sessionToken: string }; + const sessionToken = sessionJson.sessionToken; + + logger.info("Successfully authenticated with ThingSpace."); + + return { + accessToken: accessToken, + sessionToken: sessionToken + }; +} \ No newline at end of file diff --git a/etx/examples/node/src/utils/parser.ts b/etx/examples/node/src/utils/parser.ts new file mode 100644 index 0000000..978ee31 --- /dev/null +++ b/etx/examples/node/src/utils/parser.ts @@ -0,0 +1,97 @@ +// SPDX-FileCopyrightText: 2025 Verizon +// SPDX-License-Identifier: Apache-2.0 + +import { parseArgs } from 'node:util'; +import { LogLevel } from './logger.js'; + +/** + * Automatically derive valid names from the Enum. + * This filters out the numeric keys (0, 1, 2...) that TypeScript enums + * generate internally, leaving only ["DEBUG", "INFO", "WARN", "ERROR"]. + */ +const LOG_LEVELS = Object.keys(LogLevel).filter(key => isNaN(Number(key))); + +/** + * Parser for 0_registration_example.ts. + */ +export function getRegistrationArgs() { + const options = { + config: { + type: 'string' as const, + short: 'c', + default: 'config.json', + }, + 'cert-dir': { + type: 'string' as const, + }, + 'log-level': { + type: 'string' as const, + } + }; + + const { values } = parseArgs({ options, strict: false }); + + // Now validation uses the derived list + if (values['log-level'] && !LOG_LEVELS.includes((values['log-level'] as string).toUpperCase())) { + console.error(`Invalid log-level. Choose from: ${LOG_LEVELS.join(', ')}`); + process.exit(1); + } + + return { + config: values.config, + certDir: values['cert-dir'], + logLevel: values['log-level'] + }; +} + +/** + * Parser for operational examples. + * Requires the identity file produced by registration. + */ +export function getOperationalArgs() { + const options = { + 'device-file': { + type: 'string' as const, + short: 'd', + }, + 'log-level': { + type: 'string' as const, + default: 'DEBUG', + } + }; + + const { values } = parseArgs({ options, strict: false }); + + if (!values['device-file']) { + console.error("Missing required argument: --device-file"); + process.exit(1); + } + + return { + deviceFile: values['device-file'], + logLevel: values['log-level'] + }; +} + +/** + * Parser for geo-aware examples. + * Extends the operational parser with lat/lon overrides. + */ +export function getGeoAwareArgs() { + + const baseArgs = getOperationalArgs(); + + // We re-parse to pick up the additional lat/lon flags + const options = { + lat: { type: 'string' as const }, + lon: { type: 'string' as const }, + }; + + const { values } = parseArgs({ options, strict: false }); + + return { + ...baseArgs, + lat: values.lat, + lon: values.lon + }; +} \ No newline at end of file diff --git a/etx/examples/node/src/utils/registration.ts b/etx/examples/node/src/utils/registration.ts new file mode 100644 index 0000000..5dfc100 --- /dev/null +++ b/etx/examples/node/src/utils/registration.ts @@ -0,0 +1,248 @@ +// SPDX-FileCopyrightText: 2025 Verizon +// SPDX-License-Identifier: Apache-2.0 + +import type { AppConfig } from './config.js'; +import type { TokenPair } from './oauth.js'; +import { logger } from './logger.js'; + +/** --- Data Structures --- */ + +/** + * Holds the cryptographic artifacts for device identity. + * Converted from the API's raw strings into a usable object. + */ +export interface Certificate { + expirationTime: Date; // UTC timestamp of certificate expiry + ca: string; // Root Certificate Authority (PEM) + cert: string; // Device Certificate (PEM) + key: string; // Private Key (PEM) +} + +/** * Response container for the device registration handshake. + */ +export interface RegistrationResponse { + deviceId: string; + certificate: Certificate; +} + +/** * Response container for the assigned MQTT connectivity details. + */ +export interface ConnectionResponse { + mqttUrl: string; +} + +/** + * Defines the MQTT publish and subscribe permissions for a client. + */ +export interface ACLRule { + name: string; // Profile name (e.g., rule:namespace.type.subtype.id) + subscribeLimit: number; // Max active subscriptions + publishRateLimit: number; // Max messages per second + publish: string[]; // Authorized topics for sending + subscribe: string[]; // Authorized topics for receiving +} + +/** --- API Utilities --- */ + +/** + * Helper to build URLs correctly, ensuring no double-slashes between base and path. + * Uses the native URL constructor for robust path joining. + */ +function joinUrl(base: string, path: string): string { + return new URL(path, base.endsWith('/') ? base : base + '/').toString(); +} + +/** + * Orchestrates device registration with the ETX Enrollment Authority. + * * Sends the device's identity attributes (VendorID, ClientType) to Verizon + * to obtain a unique DeviceID and short-lived mTLS certificates. + * * @param config - The application configuration + * @param tokens - Valid Access and Session tokens from ThingSpace + * @returns RegistrationResponse containing the ID and PEM strings + */ +export async function getRegistrationDetails(config: AppConfig, tokens: TokenPair): Promise { + const commonHeaders = { + "Accept": "application/json", + "Content-Type": "application/json", + "Authorization": `Bearer ${tokens.accessToken}`, + "SessionToken": tokens.sessionToken, + }; + + const regUrl = joinUrl(config.endpoints.registrationUrl, "/api/v2/clients/registration"); + + const payload = { + VendorID: config.identity.attributes.vendorId, + ClientType: config.identity.attributes.clientType, + ClientSubtype: config.identity.attributes.clientSubType, + }; + + const response = await fetch(regUrl, { + method: 'POST', + headers: commonHeaders, + body: JSON.stringify(payload), + signal: AbortSignal.timeout(config.endpoints.registrationTimeout) + }); + + if (!response.ok) throw new Error(`Registration failed: ${response.statusText}`); + + // Map PascalCase API keys to camelCase TypeScript interface + const data = await response.json() as { + DeviceID: string; + Certificate: { + ExpirationTime: string; + "ca.pem": string; + "cert.pem": string; + "key.pem": string; + }; + }; + + return { + deviceId: data.DeviceID, + certificate: { + expirationTime: new Date(data.Certificate.ExpirationTime), + ca: data.Certificate["ca.pem"], + cert: data.Certificate["cert.pem"], + key: data.Certificate["key.pem"] + } + }; +} + +/** + * Retrieves the assigned MQTT broker URL for a registered device. + * * Uses the device's current location (Lat/Lon) to route it to the + * geographically closest Verizon regional message broker. + * * @param config - Configuration containing Geolocation data + * @param tokens - Valid ThingSpace tokens + * @param deviceId - The unique ID received during registration + * @returns ConnectionResponse containing the MQTT URL + */ +export async function getConnectionDetails(config: AppConfig, tokens: TokenPair, deviceId: string): Promise { + const commonHeaders = { + "Accept": "application/json", + "Content-Type": "application/json", + "Authorization": `Bearer ${tokens.accessToken}`, + "SessionToken": tokens.sessionToken, + "VendorID": config.identity.attributes.vendorId, + }; + + const connUrl = joinUrl(config.endpoints.registrationUrl, "/api/v2/clients/connection"); + + const payload = { + DeviceID: deviceId, + NetworkType: "non-VZ", + Geolocation: { + Latitude: config.identity.attributes.location.lat, + Longitude: config.identity.attributes.location.lon, + }, + }; + + const response = await fetch(connUrl, { + method: 'POST', + headers: commonHeaders, + body: JSON.stringify(payload), + signal: AbortSignal.timeout(config.endpoints.registrationTimeout) + }); + + if (!response.ok) throw new Error(`Connection details failed: ${response.statusText}`); + + const data = await response.json() as { MqttURL: string }; + return { mqttUrl: data.MqttURL }; +} + +/** + * Fetches and processes the MQTT Access Control List (ACL) rules for a vendor. + * * Retrieves the vendor's policy and dynamically replaces placeholders + * (e.g., ${clientType}) with values from the current config. + * * @param config - The application configuration + * @param tokens - Valid ThingSpace tokens + * @returns Array of ACL rules with fully resolved topic strings + */ +export async function getAclRules(config: AppConfig, tokens: TokenPair): Promise { + /** Internal helper to swap template variables in topic strings */ + const fillPlaceholders = (text: string) => text + .replace("${clientType}", config.identity.attributes.clientType) + .replace("${clientSubtype}", config.identity.attributes.clientSubType); + + const commonHeaders = { + "Accept": "application/json", + "Content-Type": "application/json", + "Authorization": `Bearer ${tokens.accessToken}`, + "SessionToken": tokens.sessionToken, + }; + + const params = new URLSearchParams({ VendorID: config.identity.attributes.vendorId }); + const aclUrl = `${joinUrl(config.endpoints.registrationUrl, "/api/v1/device-roles/vendor")}?${params}`; + + const response = await fetch(aclUrl, { + method: 'GET', + headers: commonHeaders, + signal: AbortSignal.timeout(config.endpoints.registrationTimeout) + }); + + if (!response.ok) throw new Error(`ACL fetch failed: ${response.statusText}`); + + // Explicitly cast the array of objects from the API + const data = await response.json() as Array<{ + name: string; + subscribeLimit: number; + publishRateLimit: number; + publish: string[]; + subscribe: string[]; + }>; + + // Map and transform each rule + const processedRules: ACLRule[] = data.map(rule => ({ + name: fillPlaceholders(rule.name), + subscribeLimit: rule.subscribeLimit, + publishRateLimit: rule.publishRateLimit, + publish: rule.publish.map(fillPlaceholders), + subscribe: rule.subscribe.map(fillPlaceholders) + })); + + // Manually append the global ClientInfo topic if rules exist + if (processedRules.length > 0 && processedRules[0]) { + processedRules[0].subscribe.push("vzimp/1/ClientInfo"); + } + + return processedRules; +} + +/** + * Format the ACL rules into a clean, human-readable string for logging. + */ +export function formatAclRules(rules: ACLRule[]): string { + if (!rules.length) return "No ACL rules available."; + + let output = "\n" + "-".repeat(40) + "\nAUTHORIZED MQTT TOPICS (ACLs)\n" + "-".repeat(40); + rules.forEach((rule, i) => { + output += `\n[${i + 1}] Profile: ${rule.name}`; + output += `\n - Subscribe Limit : ${rule.subscribeLimit}`; + output += `\n - Publish Rate Limit : ${rule.publishRateLimit}`; + output += `\n - Allowed to Publish:\n > ${rule.publish.join('\n > ')}`; + output += `\n - Allowed to Subscribe:\n > ${rule.subscribe.join('\n > ')}\n`; + }); + output += "-".repeat(40); + return output; +} + +/** + * Removes the device registration from the Verizon ThingSpace system. + * Should be called during cleanup to revoke device credentials. + */ +export async function deregister(config: AppConfig, tokens: TokenPair, deviceId: string): Promise { + const regUrl = joinUrl(config.endpoints.registrationUrl, "/api/v2/clients/registration"); + const params = new URLSearchParams({ DeviceIDs: deviceId }); + + const response = await fetch(`${regUrl}?${params}`, { + method: 'DELETE', + headers: { + "Content-Type": "application/x-www-form-urlencoded", + "VendorID": config.identity.attributes.vendorId, + "Authorization": `Bearer ${tokens.accessToken}`, + "SessionToken": tokens.sessionToken, + }, + signal: AbortSignal.timeout(config.endpoints.registrationTimeout) + }); + + if (!response.ok) throw new Error(`Deregistration failed: ${response.statusText}`); +} \ No newline at end of file diff --git a/etx/examples/node/tsconfig.json b/etx/examples/node/tsconfig.json new file mode 100644 index 0000000..ec631ce --- /dev/null +++ b/etx/examples/node/tsconfig.json @@ -0,0 +1,44 @@ +{ + // Visit https://aka.ms/tsconfig to read more about this file + "compilerOptions": { + // File Layout + // "rootDir": "./src", + "outDir": "./dist", + + // Environment Settings + // See also https://aka.ms/tsconfig/module + "module": "NodeNext", + "target": "ESNext", + "moduleResolution": "NodeNext", + // For nodejs: + "lib": ["esnext"], + "types": ["node"], + // and npm install -D @types/node + + // Other Outputs + "sourceMap": true, + "declaration": true, + "declarationMap": true, + + // Stricter Typechecking Options + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + + // Style Options + // "noImplicitReturns": true, + // "noImplicitOverride": true, + // "noUnusedLocals": true, + // "noUnusedParameters": true, + // "noFallthroughCasesInSwitch": true, + // "noPropertyAccessFromIndexSignature": true, + + // Recommended Options + "strict": true, + "jsx": "react-jsx", + "verbatimModuleSyntax": true, + "isolatedModules": true, + "noUncheckedSideEffectImports": true, + "moduleDetection": "force", + "skipLibCheck": true, + } +} diff --git a/etx/examples/python/README.md b/etx/examples/python/README.md index 31a0c06..4270925 100644 --- a/etx/examples/python/README.md +++ b/etx/examples/python/README.md @@ -10,32 +10,30 @@ This version of the client sample has been tested against **Python 3.9+**. It ut ### Prerequisite - Setup -The fastest way to get started is to download the packages from release. The latest release can be [found here]((https://github.com/5GRealityLab/etx-starter-kit/releases/latest)). +The fastest way to get started is to download the packages from release. The latest release can be [found here](https://github.com/5GRealityLab/etx-starter-kit/releases/latest). -The relevant Python files are: - - - Sample code **etx-python-sample-x.x.x-py3-none-any.zip**. - - Binding package **j2735codec-x.whl`**. +The file to download will look like: `python-etx-sample-x.x.x.zip`, where x.x.x is the version fo the project. 1. **Install Dependencies**: **Install With Pip** ```bash - curl -L -O https://github.com/5GRealityLab/etx-starter-kit/releases/latest/download/j2735codec-x.x.x-py3-none-any.whl - curl -L -O https://github.com/5GRealityLab/etx-starter-kit/releases/latest/download/etx-python-sample-x.x.x.zip - unzip etx-python-sample-x.x.x.zip - pip install j2735codec-x.x.x-py3-none-any.whl + curl -L -O https://github.com/5GRealityLab/etx-starter-kit/releases/latest/download/python-etx-sample-x.x.x.zip + unzip etx-python-sample-x.x.x.zip python-etx-sample + cd python-etx-sample + pip install ./j2735codec/j2735codec-*.whl pip install . + + # Ready to Run! ``` **Install with UV** ```bash - curl -L -O https://github.com/5GRealityLab/etx-starter-kit/releases/latest/download/j2735codec-x.x.x-py3-none-any.whl - curl -L -O https://github.com/5GRealityLab/etx-starter-kit/releases/latest/download/etx-python-sample-x.x.x.zip - unzip etx-python-sample-x.x.x.zip - uv sync --find-links . + curl -L -O https://github.com/5GRealityLab/etx-starter-kit/releases/latest/download/python-etx-sample-x.x.x.zip + unzip etx-python-sample-x.x.x.zip python-etx-sample + uv sync --find-links ./j2735codec/ ``` 2. **Environment Configuration**: Create a `config.json` file to start using the examples. The [`config.json.example`](./config.json.example) file provides a good starting point. @@ -71,18 +69,11 @@ The relevant Python files are: ### Note -- If executing examples using ***uv***, simply add ***uv run*** to the beginning of any python commands. - -*Example* -```bash -uv run python -m examples.0_registration_example -``` - - These arguments are supported by all the following examples. | Arg | Required | Default | Description | | :--- | :--- | :--- | :--- | -| logLevel | False | DEBUG | Controls the verbosity of the console output (e.g., `DEBUG`, `INFO`, `WARN`, `ERROR`). | +| --log-level | False | DEBUG | Controls the verbosity of the console output (e.g., `DEBUG`, `INFO`, `WARN`, `ERROR`). | ### 0. Registration Example @@ -93,11 +84,10 @@ The registration example is a precursor to performing any other operations on ET #### How to Run ```bash -python -m examples.0_registration_example --arg0 value -``` -*Example:* -```bash -python -m examples.0_registration_example --config config.json +python -m examples.0_registration_example --config config.json --cert-dir ./cert + +# For uv users: +uv run python -m examples.0_registration_example --config config.json --cert-dir ./cert ``` **Output**: This generates a JSON "Identity Artifact" in the `certs/` folder. This file contains everything needed to "re-hydrate" your identity in the following examples. @@ -106,8 +96,8 @@ python -m examples.0_registration_example --config config.json | Arg | Required | Default | Description | | :--- | :--- | :--- | :--- | -| certDir| False | ./cert/ | The local directory where security certificates and keys are generated after registration completes. | -| config | False | config.json | The configuration file to use for registration. | +| --cert-dir| False | ./cert/ | The local directory where security certificates and keys are generated after registration completes. | +| --config | False | config.json | The configuration file to use for registration. | --- @@ -118,19 +108,18 @@ The deregistration example removes the registered device from ETX. Every vendor #### How to Run The command format to run this example (from the project root): -``` -python -m etx.examples.1_deregistration_example --device-file -``` -*Example:* ```bash -python -m examples.1_deregistration_example --device-file ./cert/latest.json +python -m etx.examples.1_deregistration_example --device-files ./certs/20260119_0101_f355703d.json + +# For uv users: +uv run python -m etx.examples.1_deregistration_example --device-files ./certs/20260119_0101_f355703d.json ``` #### Supported Arguments | Arg | Required | Default | Description | | :--- | :--- | :--- | :--- | -| device-file | False | config.json | The configuration file to use for registration. | +| --device-file | False | config.json | The configuration file to use for registration. | --- @@ -144,17 +133,19 @@ A diagnostic tool to verify bidirectional private communication. #### How to Run ```bash -python -m examples.2_loopback_example --device-file --count -``` -*Example:* -```bash -python -m examples.2_loopback_example --device-file ./cert/latest.json --count 10 +python -m examples.2_loopback_example --device-file ./certs/20260119_0101_f355703d.json --count 5 + +# For uv users +uv run python -m examples.2_loopback_example --device-file ./certs/20260119_0101_f355703d.json --count 5 ``` +#### Supported Arguments + | Arg | Required | Default | Description | | :--- | :--- | :--- | :--- | -| device-file | True | - | The device file to use for ETX connection. | -| count | False | 5 | The number of loopback messages to send. | +| --device-file | True | - | The device file to use for ETX connection. | +| --count | False | 5 | The number of loopback messages to send. | + --- @@ -166,22 +157,22 @@ Demonstrates a "Virtual Speed Trap" application. 3. **Targeted Advisory**: If a vehicle exceeds the `--limit`, it sends a **TIM (Traveler Information Message)** warning directly to that specific vehicle's private topic. #### How to Run + ```bash -python -m examples.3_speedmon_example --device-file --limit -``` -*Example:* -```bash -python -m examples.3_speedmon_example --device-file ./certs/config.json --limit 25.0 +python -m examples.3_speedmon_example --device-file ./certs/20260119_0101_f355703d.json --limit 25 --lat 40.23 --lon -74.42 + +# For uv users +uv run python -m examples.3_speedmon_example --device-file ./certs/20260119_0101_f355703d.json --limit 25 --lat 40.23 --lon -74.42 ``` #### Supported Arguments | Arg | Required | Default | Description | | :--- | :--- | :--- | :--- | -| device-file | True | - | The device file to use for ETX connection. | -| lat | False | - | The default value is defined in the registration config file. | -| lon | False | - | The default value is defined in the registraiton config file. | -| limit | False | 25 | The speed limit in mph to send out warnings. | +| --device-file | True | - | The device file to use for ETX connection. | +| --lat | False | - | The default value is defined in the registration config file. | +| --lon | False | - | The default value is defined in the registraiton config file. | +| --limit | False | 25 | The speed limit in mph to send out warnings. | --- @@ -194,13 +185,14 @@ Simulates a mobile entity (On-Board Unit). It demonstrates the "Public Broadcast #### How to Run ```bash -python -m examples.4_vehicle_example --device-file --speed -``` -*Example:* -```bash -python -m examples.4_vehicle_example --device-file ./cert/config.json --speed 50 +python -m examples.4_vehicle_example --device-file ./certs/20260119_0101_f355703d.json --speed 25 --lat 40.23 --lon -74.42 + +# For uv users +uv run python -m examples.4_vehicle_example --device-file ./certs/20260119_0101_f355703d.json --speed 25 --lat 40.23 --lon -74.42 ``` +**Note**: You can try running both the speed monitor and vehicle example together to see when TIM messages are sent to warn the vehicle of speed limit violations. + #### Supported Arguments | Arg | Required | Default | Description | @@ -221,8 +213,8 @@ cd etx-starter-kit make install-py cd etx/examples/python uv run python -m examples.0_registration_example -# OR -# python -m examples.0_registration_example + +# Run examples above ``` --- diff --git a/etx/examples/python/src/examples/2_loopback_example.py b/etx/examples/python/src/examples/2_loopback_example.py index 7bbcbbc..afa65ab 100644 --- a/etx/examples/python/src/examples/2_loopback_example.py +++ b/etx/examples/python/src/examples/2_loopback_example.py @@ -19,7 +19,7 @@ from j2735codec import Codec, GeoRoutedHeader from examples.utils.registration import RegistrationResponse -from etx.examples.python.src.examples.utils.message import BSMGenerator, MessageGenerator +from examples.utils.message import BSMGenerator, MessageGenerator from examples.utils.client import ETXClient, create_etx_client from examples.utils.parser import get_geoaware_parser from examples.utils.config import Location, load_config diff --git a/j2735codec/bindings/node/src/codec.ts b/j2735codec/bindings/node/src/codec.ts index d970837..f05e5ce 100644 --- a/j2735codec/bindings/node/src/codec.ts +++ b/j2735codec/bindings/node/src/codec.ts @@ -23,11 +23,11 @@ export interface GeoRoutedHeader { } /** - * Factory function to initialize the V2X Codec WebAssembly module. - * * @returns A promise resolving to an initialized V2XCodec instance. + * Factory function to initialize the Codec WebAssembly module. + * * @returns A promise resolving to an initialized Codec instance. * @throws {Error} If the WASM file cannot be read or instantiation fails. */ -export async function createV2XCodec(): Promise { +export async function createCodec(): Promise { const wasmPath = join(__dirname, "generated", "j2735codec.wasm"); let wasmBuffer: Uint8Array; @@ -63,14 +63,14 @@ export async function createV2XCodec(): Promise { // Cast to unknown first to avoid strict WebAssemblyInstantiatedSource overlap issues const { instance } = (result as unknown) as WebAssembly.WebAssemblyInstantiatedSource; - return new V2XCodec(instance); + return new Codec(instance); } /** * High-level interface for the V2X ASN.1 Codec. * Handles memory management and pointer orchestration between JS and C. */ -export class V2XCodec { +export class Codec { /** The raw exports from the WebAssembly instance. */ private exports: WebAssembly.Exports; diff --git a/j2735codec/bindings/node/src/index.ts b/j2735codec/bindings/node/src/index.ts index 0f1637e..add4644 100644 --- a/j2735codec/bindings/node/src/index.ts +++ b/j2735codec/bindings/node/src/index.ts @@ -1,3 +1,7 @@ +/** + * SPDX-FileCopyrightText: 2026 Verizon + * SPDX-License-Identifier: Apache-2.0 + */ export * from "./generated/encodings.js"; export * from "./generated/pdu.js"; export * from "./codec.js"; \ No newline at end of file diff --git a/j2735codec/bindings/node/tests/codec.test.ts b/j2735codec/bindings/node/tests/codec.test.ts index a1de5f9..2d15ed2 100644 --- a/j2735codec/bindings/node/tests/codec.test.ts +++ b/j2735codec/bindings/node/tests/codec.test.ts @@ -1,16 +1,20 @@ +/** + * SPDX-FileCopyrightText: 2026 Verizon + * SPDX-License-Identifier: Apache-2.0 + */ import { describe, it, expect, beforeAll } from 'vitest'; import { existsSync, readdirSync, readFileSync } from 'node:fs'; import { join } from 'node:path'; import { - V2XCodec, + Codec, GeoRoutedHeader, - createV2XCodec, + createCodec, EncodingRules, PDUTypes, } from 'j2735codec'; describe('V2X Codec Comprehensive Coverage', () => { - let codec: V2XCodec; + let codec: Codec; const sampleDir = existsSync("./samples") ? "./samples" @@ -21,7 +25,7 @@ describe('V2X Codec Comprehensive Coverage', () => { throw new Error(`❌ Sample directory missing: ${sampleDir}`); } // Initialize the WASM codec - codec = await createV2XCodec() + codec = await createCodec() }); const messageFiles = readdirSync(sampleDir).filter(f => f.endsWith('.json')); diff --git a/package-lock.json b/package-lock.json index a66bcf8..498417f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,8 @@ "name": "etx-starter-kit", "version": "0.2.0", "workspaces": [ - "j2735codec/bindings/node" + "j2735codec/bindings/node", + "etx/examples/node" ], "devDependencies": { "rimraf": "^6.1.2", @@ -16,6 +17,58 @@ "vitest": "^4.0.17" } }, + "etx/examples/node": { + "name": "examples", + "version": "0.2.0", + "license": "Apache-2.0", + "dependencies": { + "j2735codec": "^0.2.0", + "mqtt": "^5.14.1", + "ngeohash": "^0.6.3" + }, + "devDependencies": { + "@types/ngeohash": "^0.6.8", + "@types/node": "^25.0.9", + "ts-node": "^1.7.1", + "typescript": "^5.9.3" + } + }, + "etx/examples/node/node_modules/ts-node": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-1.7.1.tgz", + "integrity": "sha512-2b6YmKQ0052pEP5Y+KnBce0NkyjuQRBTLKd5XV0O/+WHLbj3CJ5rUrhB2Co1a5IaBiaC2DhynS/v4UfWtHy+2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "arrify": "^1.0.0", + "chalk": "^1.1.1", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "pinkie": "^2.0.4", + "source-map-support": "^0.4.0", + "tsconfig": "^5.0.2", + "v8flags": "^2.0.11", + "xtend": "^4.0.0", + "yn": "^1.2.0" + }, + "bin": { + "ts-node": "dist/bin.js" + } + }, + "etx/examples/node/node_modules/yn": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-1.3.0.tgz", + "integrity": "sha512-cUr+6jz1CH+E9wIGgFW5lyMMOHLbCe/UCOVqV/TTnf5XMe0NBC3TS7pR9ZpDsb84iCWKBd6ETPRBqQjssDKsIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "j2735codec/bindings/node": { "name": "j2735codec", "version": "0.2.0", @@ -34,6 +87,15 @@ "node": ">=22.0.0" } }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@bufbuild/protobuf": { "version": "2.10.2", "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.10.2.tgz", @@ -912,16 +974,40 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/ngeohash": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@types/ngeohash/-/ngeohash-0.6.8.tgz", + "integrity": "sha512-A90x3HMwE1yXbWCnd0ztHzv8rAQPjwTzX2diYI/6OrWm/3oairDaehw5WPWJFgZ+8+J/OuF99IbipmMa2le6tQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "25.0.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.9.tgz", "integrity": "sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~7.16.0" } }, + "node_modules/@types/readable-stream": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.23.tgz", + "integrity": "sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -1033,6 +1119,18 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", @@ -1059,6 +1157,23 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -1069,6 +1184,80 @@ "node": ">=12" } }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bl": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/bl/-/bl-6.1.6.tgz", + "integrity": "sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg==", + "license": "MIT", + "dependencies": { + "@types/readable-stream": "^4.0.0", + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^4.2.0" + } + }, + "node_modules/broker-factory": { + "version": "3.1.13", + "resolved": "https://registry.npmjs.org/broker-factory/-/broker-factory-3.1.13.tgz", + "integrity": "sha512-H2VALe31mEtO/SRcNp4cUU5BAm1biwhc/JaF77AigUuni/1YT0FLCJfbUxwIEs9y6Kssjk2fmXgf+Y9ALvmKlw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "fast-unique-numbers": "^9.0.26", + "tslib": "^2.8.1", + "worker-factory": "^7.0.48" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, "node_modules/chai": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", @@ -1079,6 +1268,56 @@ "node": ">=18" } }, + "node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1099,6 +1338,41 @@ "dev": true, "license": "MIT" }, + "node_modules/commist": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/commist/-/commist-3.2.0.tgz", + "integrity": "sha512-4PIMoPniho+LqXmpS5d3NuGYncG6XWlkBSVGiWycL22dd42OYdUGil2CWuzklaJoNxyxUSpO4MKIBU94viWNAw==", + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/cpx2": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/cpx2/-/cpx2-8.0.0.tgz", @@ -1160,7 +1434,6 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -1195,6 +1468,16 @@ "dev": true, "license": "MIT" }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-module-lexer": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", @@ -1244,6 +1527,16 @@ "@esbuild/win32-x64": "0.27.2" } }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -1254,6 +1547,28 @@ "@types/estree": "^1.0.0" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/examples": { + "resolved": "etx/examples/node", + "link": true + }, "node_modules/expect-type": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", @@ -1264,6 +1579,19 @@ "node": ">=12.0.0" } }, + "node_modules/fast-unique-numbers": { + "version": "9.0.26", + "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.26.tgz", + "integrity": "sha512-3Mtq8p1zQinjGyWfKeuBunbuFoixG72AUkk4VvzbX4ykCW9Q4FzRaNyIlfQhUjnKw2ARVP+/CKnoyr6wfHftig==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18.2.0" + } + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -1389,6 +1717,29 @@ "dev": true, "license": "ISC" }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -1402,6 +1753,32 @@ "node": ">= 0.4" } }, + "node_modules/help-me": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", + "license": "MIT" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/ignore": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", @@ -1412,6 +1789,28 @@ "node": ">= 4" } }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", @@ -1438,6 +1837,13 @@ "node": ">=8" } }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1465,6 +1871,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/jsonfile": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", @@ -1498,6 +1914,13 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, "node_modules/minimatch": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", @@ -1518,7 +1941,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1534,11 +1956,72 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mqtt": { + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.14.1.tgz", + "integrity": "sha512-NxkPxE70Uq3Ph7goefQa7ggSsVzHrayCD0OyxlJgITN/EbzlZN+JEPmaAZdxP1LsIT5FamDyILoQTF72W7Nnbw==", + "license": "MIT", + "dependencies": { + "@types/readable-stream": "^4.0.21", + "@types/ws": "^8.18.1", + "commist": "^3.2.0", + "concat-stream": "^2.0.0", + "debug": "^4.4.1", + "help-me": "^5.0.0", + "lru-cache": "^10.4.3", + "minimist": "^1.2.8", + "mqtt-packet": "^9.0.2", + "number-allocator": "^1.0.14", + "readable-stream": "^4.7.0", + "rfdc": "^1.4.1", + "socks": "^2.8.6", + "split2": "^4.2.0", + "worker-timers": "^8.0.23", + "ws": "^8.18.3" + }, + "bin": { + "mqtt": "build/bin/mqtt.js", + "mqtt_pub": "build/bin/pub.js", + "mqtt_sub": "build/bin/sub.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/mqtt-packet": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-9.0.2.tgz", + "integrity": "sha512-MvIY0B8/qjq7bKxdN1eD+nrljoeaai+qjLJgfRn3TiMuz0pamsIWY2bFODPZMSNmabsLANXsLl4EMoWvlaTZWA==", + "license": "MIT", + "dependencies": { + "bl": "^6.0.8", + "debug": "^4.3.4", + "process-nextick-args": "^2.0.1" + } + }, + "node_modules/mqtt/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/nanoid": { @@ -1560,6 +2043,35 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/ngeohash": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/ngeohash/-/ngeohash-0.6.3.tgz", + "integrity": "sha512-kltF0cOxgx1AbmVzKxYZaoB0aj7mOxZeHaerEtQV0YaqnkXNq26WWqMmJ6lTqShYxVRWZ/mwvvTrNeOwdslWiw==", + "license": "MIT", + "engines": { + "node": ">=v0.2.0" + } + }, + "node_modules/number-allocator": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz", + "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.1", + "js-sdsl": "4.3.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/obug": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", @@ -1591,6 +2103,19 @@ "dev": true, "license": "BlueOak-1.0.0" }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -1652,6 +2177,16 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -1681,6 +2216,37 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -1702,6 +2268,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, "node_modules/rimraf": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", @@ -1789,7 +2361,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -1862,6 +2433,40 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -1872,6 +2477,25 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "^0.5.6" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -1886,6 +2510,15 @@ "dev": true, "license": "MIT" }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -1990,6 +2623,29 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/subarg": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", @@ -2000,6 +2656,16 @@ "minimist": "^1.1.0" } }, + "node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -2057,6 +2723,31 @@ "node": ">=14.0.0" } }, + "node_modules/tsconfig": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-5.0.3.tgz", + "integrity": "sha512-Cq65A3kVp6BbsUgg9DRHafaGmbMb9EhAc7fjWvudNWKjkbWrt43FnrtZt6awshH1R0ocfF2Z0uxock3lVqEgOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.3.0", + "parse-json": "^2.2.0", + "strip-bom": "^2.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -2075,7 +2766,6 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "dev": true, "license": "MIT" }, "node_modules/universalify": { @@ -2088,6 +2778,37 @@ "node": ">= 10.0.0" } }, + "node_modules/user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha512-aggiKfEEubv3UwRNqTzLInZpAOmKzwdHqEBmW/hBA/mt99eg+b4VrX6i+IRLxU8+WJYfa33rGwRseg4eElUgsQ==", + "dev": true, + "license": "MIT", + "bin": { + "user-home": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha512-SKfhk/LlaXzvtowJabLZwD4K6SGRYeoxA7KJeISlUMAB/NT4CBkZjMq3WceX2Ckm4llwqYVo8TICgsDYCBU2tA==", + "dev": true, + "dependencies": { + "user-home": "^1.1.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/vite": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", @@ -2274,6 +2995,53 @@ "node": ">=8" } }, + "node_modules/worker-factory": { + "version": "7.0.48", + "resolved": "https://registry.npmjs.org/worker-factory/-/worker-factory-7.0.48.tgz", + "integrity": "sha512-CGmBy3tJvpBPjUvb0t4PrpKubUsfkI1Ohg0/GGFU2RvA9j/tiVYwKU8O7yu7gH06YtzbeJLzdUR29lmZKn5pag==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "fast-unique-numbers": "^9.0.26", + "tslib": "^2.8.1" + } + }, + "node_modules/worker-timers": { + "version": "8.0.29", + "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-8.0.29.tgz", + "integrity": "sha512-9jk0MWHhWAZ2xlJPXr45oe5UF/opdpfZrY0HtyPizWuJ+ce1M3IYk/4IIdGct3kn9Ncfs+tkZt3w1tU6KW2Fsg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "tslib": "^2.8.1", + "worker-timers-broker": "^8.0.15", + "worker-timers-worker": "^9.0.13" + } + }, + "node_modules/worker-timers-broker": { + "version": "8.0.15", + "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-8.0.15.tgz", + "integrity": "sha512-Te+EiVUMzG5TtHdmaBZvBrZSFNauym6ImDaCAnzQUxvjnw+oGjMT2idmAOgDy30vOZMLejd0bcsc90Axu6XPWA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "broker-factory": "^3.1.13", + "fast-unique-numbers": "^9.0.26", + "tslib": "^2.8.1", + "worker-timers-worker": "^9.0.13" + } + }, + "node_modules/worker-timers-worker": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-9.0.13.tgz", + "integrity": "sha512-qjn18szGb1kjcmh2traAdki1eiIS5ikFo+L90nfMOvSRpuDw1hAcR1nzkP2+Hkdqz5thIRnfuWx7QSpsEUsA6Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "tslib": "^2.8.1", + "worker-factory": "^7.0.48" + } + }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -2371,6 +3139,37 @@ "engines": { "node": ">=8" } + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } } } } diff --git a/package.json b/package.json index 85d26b8..37efd51 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "private": true, "description": "The official onboarding resource for Verizon ETX, providing starter samples and J2735 codec bindings", "workspaces": [ - "j2735codec/bindings/node" + "j2735codec/bindings/node", + "etx/examples/node" ], "scripts": { "test": "npm run test --workspaces", From d07090e14e8dcf731bf04c26a5547665dbbad616 Mon Sep 17 00:00:00 2001 From: Sean Hsu Date: Mon, 19 Jan 2026 14:51:27 -0500 Subject: [PATCH 18/21] fix: clean room test for python --- Makefile | 27 ++++++++++++++++--- etx/examples/python/pyproject.toml | 1 - j2735codec/bindings/python/pyproject.toml | 5 +++- .../bindings/python/tests/test_codec.py | 25 ++++++++++++++--- uv.lock | 10 +++---- 5 files changed, 53 insertions(+), 15 deletions(-) diff --git a/Makefile b/Makefile index 39e551f..8978f7b 100644 --- a/Makefile +++ b/Makefile @@ -124,10 +124,27 @@ install-py: uninstall-py clean-py wasm echo "$(BOLD)πŸ“¦ Phase 3: Installing $$WHEEL_PATH...$(RESET)"; \ if [ -n "$(UV)" ]; then $(UV) pip install $$WHEEL_PATH; \ else $(PYTHON) -m pip install $$WHEEL_PATH; fi - @echo "$(BOLD)πŸ§ͺ Phase 4: Integration Test (Isolated from Source)...$(RESET)" - @cd $(BINDING_PY)/tests && (if [ -n "$(UV)" ]; then $(UV) run python -m pytest . -s; \ - else $(PYTHON) -m pytest . -s; fi) - @echo "$(GREEN)$(BOLD)βœ… Success: Python Wheel verified.$(RESET)" + @echo "$(BOLD)πŸ§ͺ Phase 4: Integration Test (Clean-Room)...$(RESET)" + @TEMP_DIR=$$(mktemp -d); \ + echo "Temp Test Directory: $$TEMP_DIR"; \ + cp -r $(BINDING_PY)/tests $$TEMP_DIR/tests; \ + mkdir -p $$TEMP_DIR/tests/samples; \ + cp -r $(PROJECT_ROOT)/j2735codec/core/$(J2735_REV)/samples/jer/* $$TEMP_DIR/tests/samples/; \ + cd $$TEMP_DIR; \ + echo "Contents of temp directory:"; \ + ls -R; \ + if [ -n "$(UV)" ]; then \ + $(UV) init; \ + $(UV) venv; \ + WHEEL_PATH=$$(realpath $(PROJECT_ROOT)/$(BINDING_PY)/dist/*.whl | head -n1); \ + $(UV) pip install --upgrade pip pytest psutil $$WHEEL_PATH; \ + $(UV) run python -m pytest tests -s; \ + else \ + $(PYTHON) -m pip install --upgrade pip pytest; \ + $(PYTHON) -m pytest tests -s; \ + fi; \ + rm -rf $$TEMP_DIR; \ + echo "$(GREEN)$(BOLD)βœ… Success: Python Wheel verified in isolation.$(RESET)" clean-py: rm -rf $(PY_DIST_DIR) $(BINDING_PY)/*.egg-info @@ -151,6 +168,7 @@ clean-js: @echo "🧹 Cleaning Node artifacts..." @rm -rf $(JS_DIST_DIR) @find $(BINDING_JS) -name "*.tgz" -delete + @find . -type d -name "node_modules" -exec rm -rf {} + install-js: clean-js build-js @echo "$(BOLD)πŸ§ͺ Phase 1: Local Source Test...$(RESET)" @@ -167,6 +185,7 @@ install-js: clean-js build-js $(NPM) init -y > /dev/null && \ echo "πŸ“¦ Installing tarball..." && \ $(NPM) install $$FULL_TARBALL_PATH > /dev/null && \ + $(NPM) install vitest --no-save > /dev/null && \ cp -r $(PROJECT_ROOT)/$(BINDING_JS)/tests ./tests && \ mkdir -p samples && \ cp -r $(PROJECT_ROOT)/j2735codec/core/$(J2735_REV)/samples/jer/* ./samples/ && \ diff --git a/etx/examples/python/pyproject.toml b/etx/examples/python/pyproject.toml index 3fa28dd..e580724 100644 --- a/etx/examples/python/pyproject.toml +++ b/etx/examples/python/pyproject.toml @@ -11,7 +11,6 @@ requires-python = ">=3.9" dependencies = [ "j2735codec", "paho-mqtt>=2.1.0", - "protobuf>=6.33.4", "python-geohash>=0.8.5", "requests>=2.32.5", ] diff --git a/j2735codec/bindings/python/pyproject.toml b/j2735codec/bindings/python/pyproject.toml index 3449349..8653a8e 100644 --- a/j2735codec/bindings/python/pyproject.toml +++ b/j2735codec/bindings/python/pyproject.toml @@ -10,6 +10,7 @@ authors = [ requires-python = ">=3.9" dependencies = [ "wasmtime>=25.0.0", + "protobuf>=6.33.4", ] [build-system] @@ -18,12 +19,14 @@ build-backend = "hatchling.build" [dependency-groups] dev = [ - "protobuf>=6.33.4", "psutil>=7.2.1", "pytest>=8.3.5", "ruff>=0.14.11", ] +[tool.hatch.build] +ignore-vcs=true + [tool.hatch.build.targets.wheel] packages = ["src/j2735codec"] diff --git a/j2735codec/bindings/python/tests/test_codec.py b/j2735codec/bindings/python/tests/test_codec.py index c97c441..6e9e95d 100644 --- a/j2735codec/bindings/python/tests/test_codec.py +++ b/j2735codec/bindings/python/tests/test_codec.py @@ -10,12 +10,29 @@ from j2735codec import EncodingRules, PDUTypes, Codec, GeoRoutedHeader def get_sample_dir(): - """Finds the core samples directory relative to this test file.""" + """Finds the core samples directory for tests. + + Tries these locations in order: + 1. ./samples relative to current working directory (clean-room test) + 2. core/j2735_202409/samples/jer relative to project root (source tree) + """ + # 1. Check if samples exist relative to tests/ (clean-room / packaged test) + cwd_samples = Path(__file__).parent / "samples" + if cwd_samples.exists(): + return cwd_samples.resolve() + + # 2. Check relative to project root (source tree / monorepo) current_file = Path(__file__).resolve() - # Path navigation based on your monorepo structure + # Adjust 'parents[3]' if your file depth changes project_root = current_file.parents[3] - sample_path = project_root / "core" / "j2735_202409" / "samples" / "jer" - return sample_path + repo_samples = project_root / "core" / "j2735_202409" / "samples" / "jer" + + if repo_samples.exists(): + return repo_samples.resolve() + + raise FileNotFoundError( + "Samples directory not found in either packaged samples folder or source tree." + ) def get_sample_files(): sample_dir = get_sample_dir() diff --git a/uv.lock b/uv.lock index b712948..bf8f5e8 100644 --- a/uv.lock +++ b/uv.lock @@ -153,7 +153,6 @@ source = { editable = "etx/examples/python" } dependencies = [ { name = "j2735codec" }, { name = "paho-mqtt" }, - { name = "protobuf" }, { name = "python-geohash" }, { name = "requests" }, ] @@ -169,7 +168,6 @@ dev = [ requires-dist = [ { name = "j2735codec", editable = "j2735codec/bindings/python" }, { name = "paho-mqtt", specifier = ">=2.1.0" }, - { name = "protobuf", specifier = ">=6.33.4" }, { name = "python-geohash", specifier = ">=0.8.5" }, { name = "requests", specifier = ">=2.32.5" }, ] @@ -230,12 +228,12 @@ name = "j2735codec" version = "0.2.0" source = { editable = "j2735codec/bindings/python" } dependencies = [ + { name = "protobuf" }, { name = "wasmtime" }, ] [package.dev-dependencies] dev = [ - { name = "protobuf" }, { name = "psutil" }, { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "pytest", version = "9.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, @@ -243,11 +241,13 @@ dev = [ ] [package.metadata] -requires-dist = [{ name = "wasmtime", specifier = ">=25.0.0" }] +requires-dist = [ + { name = "protobuf", specifier = ">=6.33.4" }, + { name = "wasmtime", specifier = ">=25.0.0" }, +] [package.metadata.requires-dev] dev = [ - { name = "protobuf", specifier = ">=6.33.4" }, { name = "psutil", specifier = ">=7.2.1" }, { name = "pytest", specifier = ">=8.3.5" }, { name = "ruff", specifier = ">=0.14.11" }, From c3e107e2dba7edd66621f69eeb779605fae826a6 Mon Sep 17 00:00:00 2001 From: Sean Hsu Date: Mon, 19 Jan 2026 16:24:15 -0500 Subject: [PATCH 19/21] fix: improve Linux process management and CI stability - Replace blocking `input()` calls with non-blocking signal handlers (SIGINT/SIGTERM). - Remove `readline` dependency in Node.js examples to prevent headless hangs. - Ensure clean mTLS disconnection and resource cleanup in both Python and Node.js. - Add `process.stdin.pause()` and `unref()` timers to prevent zombie processes in Node.js. - Standardize J2735 speed unit conversions across all example clients. --- CONTRIBUTING.md | 4 -- etx/examples/node/README.md | 2 + etx/examples/node/src/2_loopback_example.ts | 33 ++++++++---- etx/examples/node/src/3_speedmon_example.ts | 50 +++++++++++-------- etx/examples/node/src/4_vehicle_example.ts | 42 ++++++++++++---- etx/examples/python/README.md | 4 +- .../python/src/examples/2_loopback_example.py | 33 +++++++----- .../python/src/examples/3_speedmon_example.py | 35 +++++++++---- .../python/src/examples/4_vehicle_example.py | 25 ++++++++-- 9 files changed, 158 insertions(+), 70 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2a0a8f5..7cbba51 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,7 +1,3 @@ -# Contributing to J2735 Codec - -Thank you for helping improve the J2735 Codec. To maintain code quality and history, please follow these guidelines. - ## 🌿 Branching Strategy We follow a **Feature Branch** workflow. All development must occur on branches and be merged into `main` via Pull Request. diff --git a/etx/examples/node/README.md b/etx/examples/node/README.md index 40c4eba..a4fb969 100644 --- a/etx/examples/node/README.md +++ b/etx/examples/node/README.md @@ -57,6 +57,8 @@ The file to download will look like: `node-etx-sample-x.x.x.zip`, where x.x.x is } ``` +**Note: Press ctrl-c to exit out of any examples below.** + #### Supported Arguments The following command line arguments are supported by all examples in the next section. diff --git a/etx/examples/node/src/2_loopback_example.ts b/etx/examples/node/src/2_loopback_example.ts index d9983a2..4cc8c81 100644 --- a/etx/examples/node/src/2_loopback_example.ts +++ b/etx/examples/node/src/2_loopback_example.ts @@ -3,7 +3,6 @@ import { readFileSync } from 'node:fs'; import { resolve } from 'node:path'; -import readline from 'node:readline'; import { logger } from './utils/logger.js'; import { getGeoAwareArgs } from './utils/parser.js'; import { loadConfig } from './utils/config.js'; @@ -22,7 +21,7 @@ class LoopbackClient { private sent = 0; private readonly msgCount = 5; // Total messages to exchange before exit private interval: NodeJS.Timeout | null = null; - private rl: readline.Interface; + private isShuttingDown = false; constructor( private client: MQTTClient, @@ -30,9 +29,8 @@ class LoopbackClient { private bsmGen: BSMGenerator, private location: any ) { - // Setup the "Panic Button" for manual exit (Press Enter to quit) - this.rl = readline.createInterface({ input: process.stdin, terminal: false }); - this.rl.on('line', () => this.shutdown("Manual exit triggered")); + process.on('SIGINT', () => this.shutdown("SIGINT (Ctrl+C)")); + process.on('SIGTERM', () => this.shutdown("SIGTERM (System Kill)")) } /** @@ -130,14 +128,31 @@ class LoopbackClient { * Cleanly closes connections and exits the process. */ private shutdown(reason: string): void { + if (this.isShuttingDown) return; + this.isShuttingDown = true; + logger.info(`${reason}. Cleaning up...`); - if (this.interval) clearInterval(this.interval); + // 1. Stop the publishing interval immediately + if (this.interval) { + clearInterval(this.interval); + this.interval = null; + } + + // 2. Disconnect the MQTT client (this releases the network socket handle) this.client.disconnect(); - this.rl.close(); - // Force process termination - setTimeout(() => process.exit(0), 500); + /** + * 3. Graceful termination safety net + * We use unref() so this timer doesn't hang the process if everything else + * closes perfectly, but it acts as a heartbeat to force exit if needed. + */ + const exitTimer = setTimeout(() => { + logger.info("Exiting."); + process.exit(0); + }, 500); + + exitTimer.unref(); } } diff --git a/etx/examples/node/src/3_speedmon_example.ts b/etx/examples/node/src/3_speedmon_example.ts index 5025034..191351d 100644 --- a/etx/examples/node/src/3_speedmon_example.ts +++ b/etx/examples/node/src/3_speedmon_example.ts @@ -3,7 +3,6 @@ import { readFileSync } from 'node:fs'; import { resolve } from 'node:path'; -import readline from 'node:readline'; import nGhash from 'ngeohash'; import { logger } from './utils/logger.js'; @@ -28,7 +27,7 @@ class SpeedMonitorClient { private timGen: TIMGenerator; private decodeCodec: Codec; private encodeCodec: Codec; - private rl: readline.Interface; + private isShuttingDown = false; constructor( private client: ETXClient, @@ -44,9 +43,8 @@ class SpeedMonitorClient { this.decodeCodec = rxCodec; this.encodeCodec = txCodec; - // Panic button for manual exit - this.rl = readline.createInterface({ input: process.stdin, terminal: false }); - this.rl.on('line', () => this.shutdown("Manual exit triggered")); + process.on('SIGINT', () => this.shutdown("SIGINT (Ctrl+C)")); + process.on('SIGTERM', () => this.shutdown("SIGTERM (System Kill)")) } /** @@ -58,7 +56,7 @@ class SpeedMonitorClient { this.onConnect(etx); }); - console.log("\n>>> SPEED MONITOR ACTIVE. Press [ENTER] to stop. <<<\n"); + logger.info("SPEED MONITOR ACTIVE. Press Ctrl+C to stop."); } /** @@ -89,31 +87,21 @@ class SpeedMonitorClient { */ private onBsmReceived(topic: string, payload: Buffer): void { try { - // 1. Decode ETX Binary -> J2735 JER (JSON String) - const decodedJson = this.decodeCodec.decodeEtx(new Uint8Array(payload)) as string; + // Decode ETX Binary -> J2735 JER + const raw = this.decodeCodec.decodeEtx(new Uint8Array(payload)); + const decodedJson = typeof raw === 'string' ? raw : new TextDecoder().decode(raw); const bsm = JSON.parse(decodedJson); - console.log(bsm); - - // Access J2735 path: value -> coreData const coreData = bsm.value.coreData; const speed = coreData.speed || 0; - - // 2. Extract sender's SessionID from the last segment of the topic const parts = topic.split("/"); const senderSession = parts[parts.length - 1] || "unknown"; - - // 3. Check for violation const actualMph = (speed * BSM_SPEED_UNIT) / MPH_TO_MS; if (speed > this.j2735Limit) { logger.warn(`VIOLATION: Vehicle ${senderSession.substring(0, 8)} at ${actualMph.toFixed(2)} mph`); - - // J2735 Lats/Lons are degrees * 10^7 const vLat = coreData.lat / 10000000; const vLon = coreData.long / 10000000; - - // 4. Issue a targeted warning this.sendWarning(senderSession, vLat, vLon); } else { logger.debug(`Vehicle ${senderSession.substring(0, 8)} at ${actualMph.toFixed(2)} mph, under limit`); @@ -144,11 +132,31 @@ class SpeedMonitorClient { } } + /** + * Cleanly closes connections and exits the process. + */ private shutdown(reason: string): void { + if (this.isShuttingDown) return; + this.isShuttingDown = true; + logger.info(`${reason}. Cleaning up...`); + + // 1. Release the MQTT client connection this.client.disconnect(); - this.rl.close(); - process.exit(0); + + // 2. Headless exit: Ensure no stdin handles are active + if (process.stdin.isTTY) { + process.stdin.pause(); + } + + // 3. Graceful termination timer + const exitTimer = setTimeout(() => { + logger.info("Exiting."); + process.exit(0); + }, 500); + + // unref() allows the process to exit sooner if the event loop is empty + exitTimer.unref(); } } diff --git a/etx/examples/node/src/4_vehicle_example.ts b/etx/examples/node/src/4_vehicle_example.ts index a09e4b2..6355d9b 100644 --- a/etx/examples/node/src/4_vehicle_example.ts +++ b/etx/examples/node/src/4_vehicle_example.ts @@ -3,7 +3,6 @@ import { readFileSync } from 'node:fs'; import { resolve } from 'node:path'; -import readline from 'node:readline'; import { logger } from './utils/logger.js'; import { getGeoAwareArgs } from './utils/parser.js'; @@ -29,9 +28,9 @@ class VehicleClient { private decodeCodec: Codec; private encodeCodec: Codec; private broadcastInterval: NodeJS.Timeout | null = null; - private rl: readline.Interface; private sessionId: string | null = null; private speedUnits: number; + private isShuttingDown = false; // V2X Topic Schema for inbound safety streams private readonly SUB_TOPICS = [ @@ -55,8 +54,8 @@ class VehicleClient { // Convert MPH to J2735 integer units this.speedUnits = Math.floor((speedMph * MPH_TO_MS) / BSM_SPEED_UNIT); - this.rl = readline.createInterface({ input: process.stdin, terminal: false }); - this.rl.on('line', () => this.shutdown("User Exit")); + process.on('SIGINT', () => this.shutdown("SIGINT (Ctrl+C)")); + process.on('SIGTERM', () => this.shutdown("SIGTERM (System Kill)")); } public start(): void { @@ -65,7 +64,7 @@ class VehicleClient { this.onConnect(etx); }); - console.log("\n>>> VEHICLE ACTIVE. Press [ENTER] to stop. <<<\n"); + logger.info("VEHICLE ACTIVE. Press Ctrl+C to stop."); } private onConnect(etx: any): void { @@ -116,7 +115,10 @@ class VehicleClient { private onMessageReceived(topic: string, payload: Buffer): void { try { - const decoded = this.decodeCodec.decodeEtx(new Uint8Array(payload)) as string; + // Normalize WASM result to string + const raw = this.decodeCodec.decodeEtx(new Uint8Array(payload)); + const decoded = typeof raw === 'string' ? raw : new TextDecoder().decode(raw); + const msgType = topic.split('/').slice(-2, -1)[0]; logger.info(`<<< INBOUND [${msgType}]: ${decoded}`); } catch (e: any) { @@ -125,11 +127,33 @@ class VehicleClient { } private shutdown(reason: string): void { + if (this.isShuttingDown) return; + this.isShuttingDown = true; + logger.info(`${reason}. Cleaning up vehicle session...`); - if (this.broadcastInterval) clearInterval(this.broadcastInterval); + + // 1. Stop the 1Hz heartbeat + if (this.broadcastInterval) { + clearInterval(this.broadcastInterval); + this.broadcastInterval = null; + } + + // 2. Disconnect MQTT (closes the TCP/TLS socket) this.client.disconnect(); - this.rl.close(); - process.exit(0); + + // 3. Ensure stdin doesn't keep the event loop alive on Linux + if (process.stdin.isTTY) { + process.stdin.pause(); + } + + // 4. Graceful exit with safety timeout + const exitTimer = setTimeout(() => { + logger.info("Exiting."); + process.exit(0); + }, 500); + + // unref() allows the process to exit sooner if the loop is empty + exitTimer.unref(); } } diff --git a/etx/examples/python/README.md b/etx/examples/python/README.md index 4270925..d822780 100644 --- a/etx/examples/python/README.md +++ b/etx/examples/python/README.md @@ -67,8 +67,9 @@ The file to download will look like: `python-etx-sample-x.x.x.zip`, where x.x.x ``` --- -### Note +### Notes +- Press ctrl-c to exit out of any examples early. - These arguments are supported by all the following examples. | Arg | Required | Default | Description | @@ -212,6 +213,7 @@ git clone https://github.com/5GRealityLab/etx-starter-kit.git cd etx-starter-kit make install-py cd etx/examples/python +pip install . uv run python -m examples.0_registration_example # Run examples above diff --git a/etx/examples/python/src/examples/2_loopback_example.py b/etx/examples/python/src/examples/2_loopback_example.py index afa65ab..3576d4e 100644 --- a/etx/examples/python/src/examples/2_loopback_example.py +++ b/etx/examples/python/src/examples/2_loopback_example.py @@ -13,11 +13,10 @@ import json import threading import time +import signal from pathlib import Path from logging import Logger -from j2735codec import Codec, GeoRoutedHeader - from examples.utils.registration import RegistrationResponse from examples.utils.message import BSMGenerator, MessageGenerator from examples.utils.client import ETXClient, create_etx_client @@ -25,6 +24,8 @@ from examples.utils.config import Location, load_config from examples.utils.logger import setup_logging +from j2735codec import Codec, GeoRoutedHeader + # ETX System topic used to retrieve the unique Session ID for the current connection CLIENT_INFO_TOPIC = "vzimp/1/ClientInfo" @@ -68,30 +69,36 @@ def __init__( def run(self): """ - Primary execution entry point. Connects to ETX and blocks - until all messages are received or the user terminates the script. + Primary execution entry point. """ + # 1. Handle Linux Signals (SIGINT/SIGTERM) + signal.signal(signal.SIGINT, self._handle_signal) + signal.signal(signal.SIGTERM, self._handle_signal) + try: self._logger.info("Connecting to ETX Platform...") - # Set up the connection and define behavior for unexpected disconnects self._client.connect( [self._on_connect], - [lambda c: self._logger.info("Connection closed to the ETX broker.")] + [lambda c: self._logger.info("Connection closed.")] ) - # Start a background listener so the user can hit Enter to quit at any time - input_thread = threading.Thread(target=self._wait_for_user, daemon=True) - input_thread.start() - - self._logger.info("Publishing %d messages. Press [ENTER] to exit early.", self._count) + self._logger.info("Running loopback. Press Ctrl+C to exit early.") - # This blocks the main thread until self._exit_event.set() is called - self._exit_event.wait() + # 2. Block with a small timeout in a loop + # This allows the main thread to stay responsive to signals + while not self._exit_event.is_set(): + self._exit_event.wait(timeout=0.5) + self._logger.info("Finalizing session and shutting down...") finally: if self._client: self._client.disconnect() + def _handle_signal(self, signum, frame): + """Standard Linux signal handler to trigger a clean exit.""" + self._logger.info(f"Signal {signum} received. Shutting down...") + self._exit_event.set() + def _wait_for_user(self): """ Private method: Runs in a background thread to allow manual exit. diff --git a/etx/examples/python/src/examples/3_speedmon_example.py b/etx/examples/python/src/examples/3_speedmon_example.py index e7629cd..e13804d 100644 --- a/etx/examples/python/src/examples/3_speedmon_example.py +++ b/etx/examples/python/src/examples/3_speedmon_example.py @@ -11,13 +11,11 @@ 5. Targets the speeding vehicle specifically by publishing to its "Private" topic. """ import json +import signal import logging import threading from pathlib import Path -import geohash -from j2735codec import Codec, GeoRoutedHeader - from examples.utils.registration import RegistrationResponse from examples.utils.message import TIMGenerator from examples.utils.client import ETXClient, create_etx_client @@ -25,6 +23,9 @@ from examples.utils.config import load_config from examples.utils.logger import setup_logging +import geohash +from j2735codec import Codec, GeoRoutedHeader + # SAE J2735 Standard: Speed is transmitted in units of 0.02 m/s BSM_SPEED_UNIT = 0.02 MPH_TO_MS = 0.44704 @@ -64,10 +65,18 @@ def __init__(self, etx_client: ETXClient, config, limit_mph: float, logger: logg self._tim_gen = TIMGenerator() self._exit_event = threading.Event() + # Add Signal Listeners for Linux + signal.signal(signal.SIGINT, self._handle_signal) + signal.signal(signal.SIGTERM, self._handle_signal) + def run(self): """ - Establishes connection and begins monitoring. - Blocks the main thread to allow the MQTT callbacks to handle incoming BSMs. + Establishes the ETX connection and enters the monitoring loop. + + This method blocks the main thread to keep the process alive while + background MQTT threads handle message ingestion and processing. + It is signal-safe and will exit gracefully upon receiving SIGINT + (Ctrl+C) or SIGTERM. """ try: self._logger.info("Initializing Regional Speed Monitor...") @@ -76,14 +85,22 @@ def run(self): [lambda c: self._logger.info("Regional Monitor disconnected.")] ) - print("\n>>> SPEED MONITOR ACTIVE. Press [ENTER] to stop. <<<\n") - # Blocks here; callbacks run in the background - input() - self._exit_event.set() + self._logger.info("SPEED MONITOR ACTIVE. Press Ctrl+C to stop.") + + # Use a timed loop instead of input() to keep the main thread responsive + while not self._exit_event.is_set(): + self._exit_event.wait(timeout=0.5) + + self._logger.info("Finalizing session and shutting down...") finally: if self._client: self._client.disconnect() + def _handle_signal(self, signum, frame): + """Triggers a clean exit on SIGINT or SIGTERM.""" + self._logger.info(f"Signal {signum} received. Requesting shutdown...") + self._exit_event.set() + def _on_connect(self, client: ETXClient): """ Private Callback: Triggered on connection. diff --git a/etx/examples/python/src/examples/4_vehicle_example.py b/etx/examples/python/src/examples/4_vehicle_example.py index d841a2d..f2c9c9f 100644 --- a/etx/examples/python/src/examples/4_vehicle_example.py +++ b/etx/examples/python/src/examples/4_vehicle_example.py @@ -12,6 +12,7 @@ """ import json +import signal import logging import threading import time @@ -81,10 +82,22 @@ def __init__( self._pub_thread = None self.session_id = None + # Linux Signal Handling for clean-room/CI exits + signal.signal(signal.SIGINT, self._handle_signal) + signal.signal(signal.SIGTERM, self._handle_signal) + + def _handle_signal(self, signum, frame): + """Triggers a clean exit on SIGINT or SIGTERM.""" + self._logger.info(f"Signal {signum} received. Initiating vehicle shutdown...") + self._exit_event.set() + def run(self): """ Main entry point. Starts the MQTT client and the broadcast thread. - Blocks the main thread until the user requests an exit via [ENTER]. + + This method blocks the main thread to prevent the process from exiting, + ensuring background broadcasting continues. It remains responsive to + Linux system signals (SIGINT/SIGTERM) for graceful shutdown. """ try: self._logger.info("Initializing Vehicle OBU...") @@ -93,9 +106,13 @@ def run(self): [self._on_disconnect] ) - self._logger.info("VEHICLE ACTIVE. Press [ENTER] to stop.") - input() - self._exit_event.set() + self._logger.info("VEHICLE ACTIVE. Press Ctrl+C to stop.") + + # Use a timed wait loop instead of input() + while not self._exit_event.is_set(): + self._exit_event.wait(timeout=0.5) + + self._logger.info("Shutting down Vehicle OBU...") finally: if self._client: self._client.disconnect() From 0b036268f0c61fc5b935d0b77dfa117e19328979 Mon Sep 17 00:00:00 2001 From: Sean Hsu Date: Tue, 3 Feb 2026 12:56:22 -0500 Subject: [PATCH 20/21] fix: configuration and cli arguments for examples - Rename arguments for registration example from reg_folder to certDir. - Change registration configuration key from deviceId to device_id. - Update JSON encoding/decoding to use snake case keys for device configurations. --- etx/examples/node/src/0_registration_example.ts | 2 +- etx/examples/node/src/1_deregistration_example.ts | 5 ++++- etx/examples/python/src/examples/utils/config.py | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/etx/examples/node/src/0_registration_example.ts b/etx/examples/node/src/0_registration_example.ts index 9cd5e5c..677ccd4 100644 --- a/etx/examples/node/src/0_registration_example.ts +++ b/etx/examples/node/src/0_registration_example.ts @@ -63,7 +63,7 @@ async function main() { // 7. Prepare the "Frozen Bundle" (Identity Artifact) const frozenBundle = { registration: { - deviceId: regResp.deviceId, + device_id: regResp.deviceId, certificate: { // Convert Date back to string for JSON persistence expiration_time: regResp.certificate.expirationTime.toISOString(), diff --git a/etx/examples/node/src/1_deregistration_example.ts b/etx/examples/node/src/1_deregistration_example.ts index cd1cd0b..370cac3 100644 --- a/etx/examples/node/src/1_deregistration_example.ts +++ b/etx/examples/node/src/1_deregistration_example.ts @@ -34,7 +34,10 @@ async function main() { logger.setLevel(config.logLevel); // Extract device ID from the registration block - deviceId = artifact.registration.deviceId; + deviceId = artifact.registration.device_id; + if (!deviceId) { + throw new Error("Device ID is undefined.") + } } catch (error: any) { console.error(`CRITICAL: Failed to load device artifact: ${error.message}`); diff --git a/etx/examples/python/src/examples/utils/config.py b/etx/examples/python/src/examples/utils/config.py index 8f244e5..2c62ff9 100644 --- a/etx/examples/python/src/examples/utils/config.py +++ b/etx/examples/python/src/examples/utils/config.py @@ -122,7 +122,7 @@ def load_config(config_source: Union[str, Path], args: Optional[argparse.Namespa config.logLevel = args.loglevel.upper() if getattr(args, 'certDir', None): - config.certDir = args.reg_folder + config.certDir = args.certDir if getattr(args, "lat", None): config.identity.attributes.location.lat = args.lat From 5f3275d963c8bdcc27184f7890c3b2b3cec009ea Mon Sep 17 00:00:00 2001 From: Sean Hsu Date: Tue, 3 Feb 2026 13:01:34 -0500 Subject: [PATCH 21/21] refactor: build hierarchy for codec - Separate codec build Makefile and README instructions into the j2735codec folder. - Update CI build process to reflet new structure. --- .github/workflows/ci-release.yml | 5 +- Makefile | 230 +------------------------------ README.md | 208 +++------------------------- j2735codec/Makefile | 217 +++++++++++++++++++++++++++++ j2735codec/README.md | 159 +++++++++++++++++++++ 5 files changed, 402 insertions(+), 417 deletions(-) create mode 100644 j2735codec/Makefile create mode 100644 j2735codec/README.md diff --git a/.github/workflows/ci-release.yml b/.github/workflows/ci-release.yml index 7cf4ca6..b4de86e 100644 --- a/.github/workflows/ci-release.yml +++ b/.github/workflows/ci-release.yml @@ -41,10 +41,11 @@ jobs: - name: Compile run: | source emsdk/emsdk_env.sh + cd j2735codec make wasm # Create __init__.py files - touch j2735codec/bindings/python/src/j2735codec/generated/__init__.py - touch j2735codec/bindings/python/src/j2735codec/protobuf/__init__.py + touch bindings/python/src/j2735codec/generated/__init__.py + touch bindings/python/src/j2735codec/protobuf/__init__.py - name: Upload Python Artifacts uses: actions/upload-artifact@v4 diff --git a/Makefile b/Makefile index 8978f7b..1e9d654 100644 --- a/Makefile +++ b/Makefile @@ -1,228 +1,8 @@ -# SPDX-FileCopyrightText: 2025 Verizon -# SPDX-License-Identifier: Apache-2.0 - -# --- Colors and Styles --- -ifeq ($(shell tput colors 2>/dev/null), 256) - RED := $(shell tput setaf 1) - YELLOW := $(shell tput setaf 3) - GREEN := $(shell tput setaf 2) - BOLD := $(shell tput bold) - RESET := $(shell tput sgr0) -else - RED := "" - YELLOW := "" - GREEN := "" - BOLD := "" - RESET := "" -endif - -# --- Detection --- -PYTHON_CMD := $(shell which python3 || which python) -ifeq ($(PYTHON_CMD),) - PYTHON_INSTALLED := false -else - PYTHON_INSTALLED := true - PYTHON := $(PYTHON_CMD) - IS_VENV := $(shell $(PYTHON) -c 'import sys; print("true" if sys.prefix != sys.base_prefix else "false")') -endif - -NPM := $(shell which npm) -CMAKE := $(shell which cmake) -UV := $(shell which uv) - -# --- Variables --- -PROJECT_ROOT := $(shell pwd) -BUILD_DIR_NATIVE = j2735codec/build_native -BUILD_DIR_WASM = j2735codec/build_wasm - -DIST_DIR = j2735codec/dist - -BINDING_PY = j2735codec/bindings/python -PY_DIST_DIR = $(BINDING_PY)/dist - -BINDING_JS = j2735codec/bindings/node -JS_DIST_DIR = $(BINDING_JS)/dist - -J2735_REV ?= j2735_202409 -THREADS ?= $(shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4) - -SAMPLE_PY = etx/examples/python - -SAMPLE_JS = etx/examples/node - -VERSION ?= $(shell cat VERSION 2>/dev/null || echo "0.1.0") - -# --- Targets --- - -.PHONY: all setup native wasm purge help \ - setup-py build-py install-py test-py clean-py uninstall-py \ - setup-js build-js install-js test-js clean-js sync-version - -help: - @echo "$(BOLD)ETX Starter Kit Management:$(RESET)" - @echo " $(BOLD)make setup$(RESET) - Sync all dependencies (Frozen/Locked)" - @echo " $(BOLD)make install-py$(RESET) - Full Python lifecycle (Build -> Test Wheel)" - @echo " $(BOLD)make install-js$(RESET) - Full Node.js lifecycle (Build -> Test Tarball)" - @echo " $(BOLD)make native$(RESET) - Build native C library" - @echo " $(BOLD)make wasm$(RESET) - Build WASM & Generate Enums" - @echo " $(BOLD)make purge$(RESET) - Hard reset of all artifacts and lockfiles" - -all: sync-version setup native wasm build-py build-js - -setup: setup-py setup-js - -# --- Environment Guard --- - -check-env: -ifeq ($(PYTHON_INSTALLED), false) - @echo "$(RED)$(BOLD)❌ ERROR: Python not found!$(RESET)"; exit 1 -endif -ifeq ($(NPM),) - @echo "$(RED)$(BOLD)❌ ERROR: npm not found!$(RESET)"; exit 1 -endif - -# --- Python Workflow --- - -setup-py: check-env - @echo "πŸ› οΈ Syncing Python dependencies (Frozen)..." -ifdef UV - $(UV) sync --all-packages --frozen --quiet -else - $(PYTHON) -m pip install --upgrade pip build pytest psutil - $(PYTHON) -m pip install -e $(BINDING_PY) -endif - -uninstall-py: - @echo "πŸ—‘οΈ Uninstalling j2735codec package..." - @if [ -d ".venv" ]; then \ - if [ -n "$(UV)" ]; then $(UV) pip uninstall j2735codec 2>/dev/null || true; \ - else $(PYTHON) -m pip uninstall -y j2735codec 2>/dev/null || true; fi \ - fi - -build-py: wasm setup-py - @echo "πŸ“¦ Packaging Python Wheel..." -ifdef UV - $(UV) build --package j2735codec --wheel --out-dir $(PY_DIST_DIR) -else - $(PYTHON) -m build $(BINDING_PY) --outdir $(PY_DIST_DIR) -endif - -test-py: setup-py - @echo "πŸ§ͺ Running pytest..." -ifdef UV - $(UV) run python -m pytest $(BINDING_PY)/tests -s -else - $(PYTHON) -m pytest $(BINDING_PY)/tests -s -endif - -install-py: uninstall-py clean-py wasm - @echo "$(BOLD)πŸ§ͺ Phase 1: Testing Local Source...$(RESET)" - @$(MAKE) test-py - @echo "$(BOLD)πŸ”¨ Phase 2: Building Wheel...$(RESET)" - @$(MAKE) build-py - @WHEEL_PATH=$$(ls $(PY_DIST_DIR)/*.whl | head -n 1); \ - echo "$(BOLD)πŸ“¦ Phase 3: Installing $$WHEEL_PATH...$(RESET)"; \ - if [ -n "$(UV)" ]; then $(UV) pip install $$WHEEL_PATH; \ - else $(PYTHON) -m pip install $$WHEEL_PATH; fi - @echo "$(BOLD)πŸ§ͺ Phase 4: Integration Test (Clean-Room)...$(RESET)" - @TEMP_DIR=$$(mktemp -d); \ - echo "Temp Test Directory: $$TEMP_DIR"; \ - cp -r $(BINDING_PY)/tests $$TEMP_DIR/tests; \ - mkdir -p $$TEMP_DIR/tests/samples; \ - cp -r $(PROJECT_ROOT)/j2735codec/core/$(J2735_REV)/samples/jer/* $$TEMP_DIR/tests/samples/; \ - cd $$TEMP_DIR; \ - echo "Contents of temp directory:"; \ - ls -R; \ - if [ -n "$(UV)" ]; then \ - $(UV) init; \ - $(UV) venv; \ - WHEEL_PATH=$$(realpath $(PROJECT_ROOT)/$(BINDING_PY)/dist/*.whl | head -n1); \ - $(UV) pip install --upgrade pip pytest psutil $$WHEEL_PATH; \ - $(UV) run python -m pytest tests -s; \ - else \ - $(PYTHON) -m pip install --upgrade pip pytest; \ - $(PYTHON) -m pytest tests -s; \ - fi; \ - rm -rf $$TEMP_DIR; \ - echo "$(GREEN)$(BOLD)βœ… Success: Python Wheel verified in isolation.$(RESET)" - -clean-py: - rm -rf $(PY_DIST_DIR) $(BINDING_PY)/*.egg-info - find $(BINDING_PY) -type d -name "__pycache__" -exec rm -rf {} + - -# --- Node Workflow --- - -setup-js: check-env - @echo "πŸ“¦ Syncing Node.js workspaces (Frozen/ci)..." - @$(NPM) ci - -build-js: wasm setup-js - @echo "πŸ”¨ Building Node Bindings..." - @$(NPM) run build -w j2735codec - -test-js: setup-js - @echo "πŸ§ͺ Running Vitest..." - @$(NPM) test -w j2735codec - -clean-js: - @echo "🧹 Cleaning Node artifacts..." - @rm -rf $(JS_DIST_DIR) - @find $(BINDING_JS) -name "*.tgz" -delete - @find . -type d -name "node_modules" -exec rm -rf {} + - -install-js: clean-js build-js - @echo "$(BOLD)πŸ§ͺ Phase 1: Local Source Test...$(RESET)" - @$(MAKE) test-js - @echo "$(BOLD)πŸ”¨ Phase 2: Packaging Tarball...$(RESET)" - @cd $(BINDING_JS) && $(NPM) pack > /dev/null - @echo "$(BOLD)πŸ“¦ Phase 3: Isolated Integration Test...$(RESET)" - @TARBALL_PATH=$$(ls $(BINDING_JS)/*.tgz | head -n 1); \ - FULL_TARBALL_PATH=$$(pwd)/$$TARBALL_PATH; \ - TEMP_DIR=$$(mktemp -d); \ - echo "Temp Test Directory: $$TEMP_DIR"; \ - ( \ - cd $$TEMP_DIR && \ - $(NPM) init -y > /dev/null && \ - echo "πŸ“¦ Installing tarball..." && \ - $(NPM) install $$FULL_TARBALL_PATH > /dev/null && \ - $(NPM) install vitest --no-save > /dev/null && \ - cp -r $(PROJECT_ROOT)/$(BINDING_JS)/tests ./tests && \ - mkdir -p samples && \ - cp -r $(PROJECT_ROOT)/j2735codec/core/$(J2735_REV)/samples/jer/* ./samples/ && \ - echo "$(BOLD)πŸš€ Verifying tarball in isolation...$(RESET)" && \ - $(NPM) exec vitest run -- --environment node --dir ./tests \ - ) || (rm -rf $$TEMP_DIR && exit 1); \ - rm -rf $$TEMP_DIR; \ - echo "$(GREEN)$(BOLD)βœ… Success: Node Tarball verified.$(RESET)" - -# --- C++ / WASM Logic --- - -native: - $(CMAKE) -B $(BUILD_DIR_NATIVE) -S j2735codec -DBUILD_NATIVE_LIB=ON - $(CMAKE) --build $(BUILD_DIR_NATIVE) -j $(THREADS) - -wasm: - emcmake $(CMAKE) -B $(BUILD_DIR_WASM) -S j2735codec -DJ2735_REV=$(J2735_REV) - $(CMAKE) --build $(BUILD_DIR_WASM) -j $(THREADS) - -purge: uninstall-py clean-py clean-js - @echo "πŸ”₯ Hard purging all artifacts and lockfiles..." - # 1. Remove specific known directories - rm -rf $(BUILD_DIR_NATIVE) $(BUILD_DIR_WASM) node_modules $(DIST_DIR) - rm -rf $(BINDING_PY)/src/j2735codec/generated - rm -rf $(BINDING_JS)/src/generated - - # 2. Find and remove all .venv directories in the project - find . -type d -name ".venv" -exec rm -rf {} + - - # 3. Find and remove other common python artifacts - find . -type d -name "build" -not -path "*/emsdk/*" -exec rm -rf {} + - find . -type d -name "*.egg-info" -exec rm -rf {} + - find . -type d -name ".pytest_cache" -exec rm -rf {} + - - @echo "✨ Purged. Use 'make setup' to recreate environment." - -# --- Versioning Logic --- +BINDING_PY = j2735codec/bindings/python +BINDING_JS = j2735codec/bindings/node +SAMPLE_PY = etx/examples/python +SAMPLE_JS = etx/examples/node +VERSION ?= $(shell cat VERSION 2>/dev/null || echo "0.1.0") sync-version: @echo "πŸ”„ Syncing version $(VERSION) to manifests..." diff --git a/README.md b/README.md index 1efc709..7d0cdfe 100644 --- a/README.md +++ b/README.md @@ -17,15 +17,9 @@ Navigate to the ***[examples](etx/examples/)*** directory or select from the fol ## πŸš€ Key Features -* **Get Started Quicker:** Sample code and onboarding guides to help you build on ETX immediately. -* **Latest J2735 Standard:** Built from the [SAE J2735_202409 ASN.1 definitions](https://www.sae.org/standards/.j2735asn_202409-v2x-communications-message-set-dictionary-asn-file). -* **Codec Support:** Full support for encoding and decoding J2735 message into various formats for Python and Node. - -This project is composed of two components: - -- **ETX sample code** to help developers get started. -- **WASM binary & runtime bindings** for the J2735 codec to help accelerate your development on different languages. - +- **Get Started Quicker:** Sample code and onboarding guides to help you build on ETX immediately. +- **Latest J2735 Standard:** Built from the [SAE J2735_202409 ASN.1 definitions](https://www.sae.org/standards/.j2735asn_202409-v2x-communications-message-set-dictionary-asn-file). +- **Codec Support:** Full support for encoding and decoding J2735 message into various formats for Python and Node. ## πŸ“‚ Project Structure @@ -37,65 +31,36 @@ This project is composed of two components: β”‚ β”‚ β”œβ”€β”€ python/ # Python package (uv managed) β”‚ β”‚ └── node/ # Node.js package (npm workspace) β”‚ └── dist/ # Build artifacts (native & wasm) -β”œβ”€β”€ etx/ # ETX code samples and resources +β”œβ”€β”€ etx/ # ETX code examples and resources +| β”œβ”€β”€ docs # ETX related support documentation +| β”œβ”€β”€ examples # ETX code examples +| | β”œβ”€β”€ node # ETX node examples +| | └── python # ETX python examples +| β”œβ”€β”€ proto # ETX protobuf definitions β”œβ”€β”€ VERSION # Single source of truth for project versioning β”œβ”€β”€ Makefile # The central command hub └── LICENSE # Apache-2.0 ``` ---- - -## The J2735 Codec - -The J2735 codec is responsible for transforming V2X messages into a standardized form for consumption amongst various parties. This codec is based on [C/C++ codebase generated](j2735codec/core/) from [ASN.1 compiler](https://github.com/mouse07410/asn1c). - -In order to provide a better onboarding experience, the native codebase is transformed into WebAssembly (WASM) in the project to provide a safe, fast, and portable codec for Python, Node, and other modern runtimes. A very thin layer of wrapper code sits on top of the WebAssembly to help facilitate the interaction with the WebAssembly. This makes the encoding and decoding process between the different message format eaiser for the developers. These two components form the basis of the codec. - -**⚠️WARNING⚠️ : WebAssembly is not thread-safe; ensure there is no concurrent access to the codec library. Instead of sharing a single resource via threads or async tasks, always create separate, isolated instances.** - -**Note:** The original C/C++ code is also provided in the project. Compiling the source code into a [C static library is also supported](#πŸ› -advanced-building--management). - -### Supported Standards - -- [J2735_202409](https://www.sae.org/standards/j2735_202409-v2x-communications-message-set-dictionary) - -### πŸ”Œ Supported Bindings +## πŸ“œ Language Binding Installation -Currently, the following language bindings are officially supported and maintained: +The codec and language bindings can be found and installed directly from the release pages. These are provided from the quick start guides linked above. -| Language | Status | Runtime Dependency | Documentation | -| :--- | :--- | :--- | :--- | -| **Python** | βœ… Active | `wasmtime` | [View Python README](./j2735codec/bindings/python/README.md) | -| **Node.js** | βœ… Active | Native Support | [View Node README](./j2735codec/bindings/node/README.md) | +### Python -For specific installation steps and examples for Python or Node, please view the language's README. - - -### Language Binding Installation - -It is possible to just install the langauge bindings for encoding and decoding messages. - -1. Install the bindings using the link directly from the project release page ([View Latest Releases](https://github.com/5GRealityLab/etx-starter-kit/releases/latest)). - -2. Clone this repo and bulid it yourself. - -### 1. Release Install - -##### Python - -**Via UV**: +*UV*: ```bash uv add "https://github.com/5GRealityLab/etx-starter-kit/releases/download/v0.0.0-alpha/python-j2735codec-0.0.0-py3-none-any.whl" ``` -**Via Pip**: +*Pip*: ```bash pip install "https://github.com/5GRealityLab/etx-starter-kit/releases/download/v0.0.0-alpha/python-j2735codec-0.0.0-py3-none-any.whl" ``` -##### Node +### Node -**Via NPM** +*NPM* ```bash npm install "https://github.com/5GRealityLab/etx-starter-kit/releases/download/v0.0.0-alpha/node-j2735codec-0.2.0.tgz" @@ -103,145 +68,10 @@ npm install "https://github.com/5GRealityLab/etx-starter-kit/releases/download/v **Note**: The release links above are not valid. Please see release page for proper links to to use. You can also download the files from the release page and install locally as well. -### 2. Source Install - -#### πŸ›  Prerequisites - -- **Runtime & Package Managers** +**For more advance users and contributors**, it is possible to install these packages directly from the source tree as well. The instructions [can be found here](/j2735codec/README.md). - - For **Node.js**: `v22.16.0` (LTS) or higher. - - NPM is needed for the builds to work. - - - For **Python**: `v3.9` or higher. - - [UV](https://docs.astral.sh/uv/) or Pip should be installed for builds to work. - - -- **Emscripten SDK (emsdk)** - - Required to compile the C++ source into WebAssembly. - - **Tested Version:** 4.0.10 - - **Note:** It is recommended to use the version listed above to ensure consistent WASM memory exports. - - ```bash - # Clone and install the Emscripten toolchain - git clone https://github.com/emscripten-core/emsdk.git - cd emsdk - ./emsdk install 4.0.10 - ./emsdk activate 4.0.10 - - # Activate environment variables (must be run in every new terminal session) - source ./emsdk_env.sh - ``` - -- **CMake (3.23+)** - - - Used to manage the C++ build process. - - macOS: `brew install cmake` - - Linux: `sudo apt install cmake` - - Windows: Download from [cmake.org](https://cmake.org) - -#### Instructions - -The first step is to clone this repository first. All of the following commands should be executed from the project root. - -```bash -git clone https://github.com/5GRealityLab/etx-starter-kit.git -cd etx-starter-kit -``` - -The following commands will perform a full installation outlined below: - -***Setup β†’ Build β†’ Test Code β†’ Pack Artifacts β†’ Verify Package Installation*** - -**Python** -```bash -make install-py -``` - -**Node.js** -```bash -make install-js -``` - -If anything goes wrong a "hard reset" can be performed using the following command.Use this for a completely fresh start. - -```bash -make purge -``` - ---- - -### πŸ›  Advanced Building & Management - -The `make install-x` command is really all you need to get started. It essentially operates all the following commands in a sequence. If you want more control over the build and install process, the following commands are available as well. -The central [Makefile](/Makefile) at the root of the repository orchestrates all of the commands. - -**Note:** There are interdependencies across the following commands. For example, if you run build, setup and wasm compilation will be run as well. - -#### WebAssembly Compilation -Compile codec C/C++ source into WebAssembly binary: -```bash -make wasm -``` - -**Note:** Ensure you have sourced your `emsdk_env.sh` before running this command. - -#### Build Native C Library -Compile codec C/C++ source into a static C library (**sample code is not provided for native C libraries**): -```bash -make native -``` - -#### Environment Setup -Sync all dependencies (Python packages and Node modules): -```bash -make setup-py # python -make setup-js # node -make setup # both -``` - -#### Build Bindings -```bash -make build-py # python -make build-js # node -``` - -#### Run Bindings Test -```bash -make test-py # python -make test-js # node -``` - -#### Uninstall Bindings - -Uninstall the codec bindings from your local environment. - -```bash -make uninstall-py # python -make uninstall-js # node -``` - -### Cleanup - -Removes language-specific build artifacts (`dist` and any output folders). - -```bash -make clean-py # python -make clean-js # node -``` - -### Purge - -The purge command will perform a hard reset on the repository. Removing all distributions, binaries, installation, package manager, etc. - -```bash -make purge -``` - ---- - -### Version Management (For Contributors Only) +## Version Management (For Contributors Only) To propagate a version change from the root `VERSION` file to all sub-manifests: @@ -251,7 +81,5 @@ To propagate a version change from the root `VERSION` file to all sub-manifests: make sync-version ``` ---- - ## βš–οΈ License Licensed under the Apache License 2.0. See [LICENSE](LICENSE) and [NOTICE](NOTICE) for details. \ No newline at end of file diff --git a/j2735codec/Makefile b/j2735codec/Makefile new file mode 100644 index 0000000..4dacdc4 --- /dev/null +++ b/j2735codec/Makefile @@ -0,0 +1,217 @@ +# SPDX-FileCopyrightText: 2025 Verizon +# SPDX-License-Identifier: Apache-2.0 + +# --- Colors and Styles --- +ifeq ($(shell tput colors 2>/dev/null), 256) + RED := $(shell tput setaf 1) + YELLOW := $(shell tput setaf 3) + GREEN := $(shell tput setaf 2) + BOLD := $(shell tput bold) + RESET := $(shell tput sgr0) +else + RED := "" + YELLOW := "" + GREEN := "" + BOLD := "" + RESET := "" +endif + +# --- Detection --- +PYTHON_CMD := $(shell which python3 || which python) +ifeq ($(PYTHON_CMD),) + PYTHON_INSTALLED := false +else + PYTHON_INSTALLED := true + PYTHON := $(PYTHON_CMD) + IS_VENV := $(shell $(PYTHON) -c 'import sys; print("true" if sys.prefix != sys.base_prefix else "false")') +endif + +NPM := $(shell which npm) +CMAKE := $(shell which cmake) +UV := $(shell which uv) + +# --- Variables --- +PROJECT_ROOT := $(shell pwd) +BUILD_DIR_NATIVE = build_native +BUILD_DIR_WASM = build_wasm + +DIST_DIR = dist + +BINDING_PY = bindings/python +BINDING_JS = bindings/node + +PY_DIST_DIR = $(BINDING_PY)/dist +JS_DIST_DIR = $(BINDING_JS)/dist + +J2735_REV ?= j2735_202409 +THREADS ?= $(shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4) + +# --- Targets --- + +.PHONY: all setup native wasm purge help \ + setup-py build-py install-py test-py clean-py uninstall-py \ + setup-js build-js install-js test-js clean-js + +help: + @echo "$(BOLD)ETX Starter Kit Management:$(RESET)" + @echo " $(BOLD)make setup$(RESET) - Sync all dependencies (Frozen/Locked)" + @echo " $(BOLD)make install-py$(RESET) - Full Python lifecycle (Build -> Test Wheel)" + @echo " $(BOLD)make install-js$(RESET) - Full Node.js lifecycle (Build -> Test Tarball)" + @echo " $(BOLD)make native$(RESET) - Build native C library" + @echo " $(BOLD)make wasm$(RESET) - Build WASM & Generate Enums" + @echo " $(BOLD)make purge$(RESET) - Hard reset of all artifacts and lockfiles" + +all: setup native wasm build-py build-js + +setup: setup-py setup-js + +# --- Environment Guard --- + +check-env: +ifeq ($(PYTHON_INSTALLED), false) + @echo "$(RED)$(BOLD)❌ ERROR: Python not found!$(RESET)"; exit 1 +endif +ifeq ($(NPM),) + @echo "$(RED)$(BOLD)❌ ERROR: npm not found!$(RESET)"; exit 1 +endif + +# --- Python Workflow --- + +setup-py: check-env + @echo "πŸ› οΈ Syncing Python dependencies (Frozen)..." +ifdef UV + $(UV) sync --all-packages --frozen --quiet +else + $(PYTHON) -m pip install --upgrade pip build pytest psutil + $(PYTHON) -m pip install -e $(BINDING_PY) +endif + +uninstall-py: + @echo "πŸ—‘οΈ Uninstalling j2735codec package..." + @if [ -d ".venv" ]; then \ + if [ -n "$(UV)" ]; then $(UV) pip uninstall j2735codec 2>/dev/null || true; \ + else $(PYTHON) -m pip uninstall -y j2735codec 2>/dev/null || true; fi \ + fi + +build-py: wasm setup-py + @echo "πŸ“¦ Packaging Python Wheel..." +ifdef UV + $(UV) build --package j2735codec --wheel --out-dir $(PY_DIST_DIR) +else + $(PYTHON) -m build $(BINDING_PY) --outdir $(PY_DIST_DIR) +endif + +test-py: setup-py + @echo "πŸ§ͺ Running pytest..." +ifdef UV + $(UV) run python -m pytest $(BINDING_PY)/tests -s +else + $(PYTHON) -m pytest $(BINDING_PY)/tests -s +endif + +install-py: uninstall-py clean-py wasm + @echo "$(BOLD)πŸ§ͺ Phase 1: Testing Local Source...$(RESET)" + @$(MAKE) test-py + @echo "$(BOLD)πŸ”¨ Phase 2: Building Wheel...$(RESET)" + @$(MAKE) build-py + @WHEEL_PATH=$$(ls $(PY_DIST_DIR)/*.whl | head -n 1); \ + echo "$(BOLD)πŸ“¦ Phase 3: Installing $$WHEEL_PATH...$(RESET)"; \ + if [ -n "$(UV)" ]; then $(UV) pip install $$WHEEL_PATH; \ + else $(PYTHON) -m pip install $$WHEEL_PATH; fi + @echo "$(BOLD)πŸ§ͺ Phase 4: Integration Test (Clean-Room)...$(RESET)" + @TEMP_DIR=$$(mktemp -d); \ + echo "Temp Test Directory: $$TEMP_DIR"; \ + cp -r $(BINDING_PY)/tests $$TEMP_DIR/tests; \ + mkdir -p $$TEMP_DIR/tests/samples; \ + cp -r $(PROJECT_ROOT)/core/$(J2735_REV)/samples/jer/* $$TEMP_DIR/tests/samples/; \ + cd $$TEMP_DIR; \ + echo "Contents of temp directory:"; \ + ls -R; \ + if [ -n "$(UV)" ]; then \ + $(UV) init; \ + $(UV) venv; \ + WHEEL_PATH=$$(realpath $(PROJECT_ROOT)/$(BINDING_PY)/dist/*.whl | head -n1); \ + $(UV) pip install --upgrade pip pytest psutil $$WHEEL_PATH; \ + $(UV) run python -m pytest tests -s; \ + else \ + $(PYTHON) -m pip install --upgrade pip pytest; \ + $(PYTHON) -m pytest tests -s; \ + fi; \ + rm -rf $$TEMP_DIR; \ + echo "$(GREEN)$(BOLD)βœ… Success: Python Wheel verified in isolation.$(RESET)" + +clean-py: + rm -rf $(PY_DIST_DIR) $(BINDING_PY)/*.egg-info + find $(BINDING_PY) -type d -name "__pycache__" -exec rm -rf {} + + +# --- Node Workflow --- + +setup-js: check-env + @echo "πŸ“¦ Syncing Node.js workspaces (Frozen/ci)..." + @$(NPM) ci + +build-js: wasm setup-js + @echo "πŸ”¨ Building Node Bindings..." + @$(NPM) run build -w j2735codec + +test-js: setup-js + @echo "πŸ§ͺ Running Vitest..." + @$(NPM) test -w j2735codec + +clean-js: + @echo "🧹 Cleaning Node artifacts..." + @rm -rf $(JS_DIST_DIR) + @find $(BINDING_JS) -name "*.tgz" -delete + @find . -type d -name "node_modules" -exec rm -rf {} + + +install-js: clean-js build-js + @echo "$(BOLD)πŸ§ͺ Phase 1: Local Source Test...$(RESET)" + @$(MAKE) test-js + @echo "$(BOLD)πŸ”¨ Phase 2: Packaging Tarball...$(RESET)" + @cd $(BINDING_JS) && $(NPM) pack > /dev/null + @echo "$(BOLD)πŸ“¦ Phase 3: Isolated Integration Test...$(RESET)" + @TARBALL_PATH=$$(ls $(BINDING_JS)/*.tgz | head -n 1); \ + FULL_TARBALL_PATH=$$(pwd)/$$TARBALL_PATH; \ + TEMP_DIR=$$(mktemp -d); \ + echo "Temp Test Directory: $$TEMP_DIR"; \ + ( \ + cd $$TEMP_DIR && \ + $(NPM) init -y > /dev/null && \ + echo "πŸ“¦ Installing tarball..." && \ + $(NPM) install $$FULL_TARBALL_PATH > /dev/null && \ + $(NPM) install vitest --no-save > /dev/null && \ + cp -r $(PROJECT_ROOT)/$(BINDING_JS)/tests ./tests && \ + mkdir -p samples && \ + cp -r $(PROJECT_ROOT)/core/$(J2735_REV)/samples/jer/* ./samples/ && \ + echo "$(BOLD)πŸš€ Verifying tarball in isolation...$(RESET)" && \ + $(NPM) exec vitest run -- --environment node --dir ./tests \ + ) || (rm -rf $$TEMP_DIR && exit 1); \ + rm -rf $$TEMP_DIR; \ + echo "$(GREEN)$(BOLD)βœ… Success: Node Tarball verified.$(RESET)" + +# --- C++ / WASM Logic --- + +native: + $(CMAKE) -B $(BUILD_DIR_NATIVE) -DBUILD_NATIVE_LIB=ON + $(CMAKE) --build $(BUILD_DIR_NATIVE) -j $(THREADS) + +wasm: + emcmake $(CMAKE) -B $(BUILD_DIR_WASM) -DJ2735_REV=$(J2735_REV) + $(CMAKE) --build $(BUILD_DIR_WASM) -j $(THREADS) + +purge: uninstall-py clean-py clean-js + @echo "πŸ”₯ Hard purging all artifacts and lockfiles..." + # 1. Remove specific known directories + rm -rf $(BUILD_DIR_NATIVE) $(BUILD_DIR_WASM) node_modules $(DIST_DIR) + rm -rf $(BINDING_PY)/src/generated + rm -rf $(BINDING_JS)/src/generated + + # 2. Find and remove all .venv directories in the project + find . -type d -name ".venv" -exec rm -rf {} + + + # 3. Find and remove other common python artifacts + find . -type d -name "build" -not -path "*/emsdk/*" -exec rm -rf {} + + find . -type d -name "*.egg-info" -exec rm -rf {} + + find . -type d -name ".pytest_cache" -exec rm -rf {} + + + @echo "✨ Purged. Use 'make setup' to recreate environment." diff --git a/j2735codec/README.md b/j2735codec/README.md new file mode 100644 index 0000000..a81fa77 --- /dev/null +++ b/j2735codec/README.md @@ -0,0 +1,159 @@ + +# The J2735 Codec + +The J2735 codec is responsible for transforming V2X messages into a standardized form for consumption amongst various parties. This codec is based on [C/C++ codebase generated](core/) from [ASN.1 compiler](https://github.com/mouse07410/asn1c). + +In order to provide a better onboarding experience, the native codebase is transformed into WebAssembly (WASM) in the project to provide a safe, fast, and portable codec for Python, Node, and other modern runtimes. A very thin layer of wrapper code sits on top of the WebAssembly to help facilitate the interaction with the WebAssembly. This makes the encoding and decoding process between the different message format eaiser for the developers. These two components form the basis of the codec. + +**⚠️WARNING⚠️ : WebAssembly is not thread-safe; ensure there is no concurrent access to the codec library. Instead of sharing a single resource via threads or async tasks, always create separate, isolated instances.** + +**Note:** The original C/C++ code is also provided in the project. Compiling the source code into a [C static library is also supported](#πŸ› -advanced-building--management). + +## Supported Standards + +- [J2735_202409](https://www.sae.org/standards/j2735_202409-v2x-communications-message-set-dictionary) + +## πŸ”Œ Supported Bindings + +Currently, the following language bindings are officially supported and maintained: + +| Language | Status | Runtime Dependency | Documentation | +| :--- | :--- | :--- | :--- | +| **Python** | βœ… Active | `wasmtime` | [View Python README](./bindings/python/README.md) | +| **Node.js** | βœ… Active | Native Support | [View Node README](./bindings/node/README.md) | + +For specific installation steps and examples for Python or Node, please view the language's README. + + +## Source Installation + +### πŸ›  Prerequisites + +**Runtime & Package Managers** + +- For **Node.js**: `v22.16.0` (LTS) or higher. + - NPM is needed for the builds to work. + +- For **Python**: `v3.9` or higher. + - [UV](https://docs.astral.sh/uv/) or Pip should be installed for builds to work. + + +**Emscripten SDK (emsdk)** + + - Required to compile the C++ source into WebAssembly. + - **Tested Version:** 4.0.10 + - **Note:** It is recommended to use the version listed above to ensure consistent WASM memory exports. + + ```bash + # Clone and install the Emscripten toolchain + git clone https://github.com/emscripten-core/emsdk.git + cd emsdk + ./emsdk install 4.0.10 + ./emsdk activate 4.0.10 + + # Activate environment variables (must be run in every new terminal session) + source ./emsdk_env.sh + ``` + +**CMake (3.23+)** + + - Used to manage the C++ build process. + - macOS: `brew install cmake` + - Linux: `sudo apt install cmake` + - Windows: Download from [cmake.org](https://cmake.org) + +### Instructions + +The first step is to clone this repository first. All of the following commands should be executed from the project root. + +```bash +git clone https://github.com/5GRealityLab/etx-starter-kit.git +cd etx-starter-kit +``` + +The following commands will perform a full installation outlined below: + +***Setup β†’ Build β†’ Test Code β†’ Pack Artifacts β†’ Verify Package Installation*** + +**Python** +```bash +make install-py +``` + +**Node.js** +```bash +make install-js +``` + +If anything goes wrong a "hard reset" can be performed using the following command.Use this for a completely fresh start. + +```bash +make purge +``` + +## πŸ›  Advanced Building & Management + +The `make install-x` command is really all you need to get started. It essentially operates all the following commands in a sequence. If you want more control over the build and install process, the following commands are available as well. +The central [Makefile](/Makefile) at the root of the repository orchestrates all of the commands. + +**Note:** There are interdependencies across the following commands. For example, if you run build, setup and wasm compilation will be run as well. + +### WebAssembly Compilation +Compile codec C/C++ source into WebAssembly binary: +```bash +make wasm +``` + +**Note:** Ensure you have sourced your `emsdk_env.sh` before running this command. + +### Build Native C Library +Compile codec C/C++ source into a static C library (**sample code is not provided for native C libraries**): +```bash +make native +``` + +### Environment Setup +Sync all dependencies (Python packages and Node modules): +```bash +make setup-py # python +make setup-js # node +make setup # both +``` + +### Build Bindings +```bash +make build-py # python +make build-js # node +``` + +### Run Bindings Test +```bash +make test-py # python +make test-js # node +``` + +### Uninstall Bindings + +Uninstall the codec bindings from your local environment. + +```bash +make uninstall-py # python +make uninstall-js # node +``` + +## Cleanup + +Removes language-specific build artifacts (`dist` and any output folders). + +```bash +make clean-py # python +make clean-js # node +``` + +### Purge + +The purge command will perform a hard reset on the repository. Removing all distributions, binaries, installation, package manager, etc. + +```bash +make purge +```