diff --git a/.github/workflows/ci-release.yml b/.github/workflows/ci-release.yml new file mode 100644 index 0000000..b4de86e --- /dev/null +++ b/.github/workflows/ci-release.yml @@ -0,0 +1,247 @@ +name: Core CI & Release + +on: + push: + branches: [main] + tags: ['v*'] + pull_request: + branches: [main] + +jobs: + verify-version: + name: Verify Version Match + if: startsWith(github.ref, 'refs/tags/v') + runs-on: ubuntu-latest + steps: + - 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' vs VERSION '$FILE_VERSION'" + exit 1 + fi + + build-core: + name: Build WASM Core + runs-on: ubuntu-latest + steps: + - 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: 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 + run: | + source emsdk/emsdk_env.sh + cd j2735codec + make wasm + # Create __init__.py files + 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 + with: + name: python-wasm-binaries + # Use the parent directory to ensure the j2735codec folder structure is preserved + path: j2735codec/bindings/python/src/j2735codec/ + include-hidden-files: true + + - name: Upload Node Artifacts + uses: actions/upload-artifact@v4 + with: + name: node-wasm-binaries + path: j2735codec/bindings/node/src/generated/ + + test-bindings: + name: Test ${{ matrix.binding }} + needs: build-core + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + binding: [python, node] + steps: + - 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/' || '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 --reinstall-package j2735codec + uv run pytest tests -s + else + npm install + npm run build -w j2735codec + npm test -w j2735codec + fi + + 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: + - uses: actions/checkout@v4 + + - name: Download Artifacts + uses: actions/download-artifact@v4 + with: + path: artifacts + + - name: Build & Stage Assets + run: | + STAGING="$GITHUB_WORKSPACE/dist_release" + 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/" + + pip install uv + 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 + 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/" + + # 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. 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/" + + # --- 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 + with: + name: "Release ${{ github.ref_name }}" + files: dist_release/* + generate_release_notes: true \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d8c8ff9 --- /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/ +*.tgz +*.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 +**/generated/* + +# --- Environment & Secrets --- +# Never commit ETX credentials or local environment configs +.env +.env.local +.env.*.local +logs/ +*.log +config.json +certs/ + +# ============================================================================= \ No newline at end of file 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/.python-version b/.python-version new file mode 100644 index 0000000..bd28b9c --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.9 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/Makefile b/Makefile new file mode 100644 index 0000000..1e9d654 --- /dev/null +++ b/Makefile @@ -0,0 +1,22 @@ +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..." + @# 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 + @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 + @perl -i -pe 's/^version\s*=\s*"[0-9.]*"/version = "$(VERSION)"/m' $(SAMPLE_PY)/pyproject.toml + + @echo "βœ… Version $(VERSION) synced across 6 manifests and CMake." \ No newline at end of file diff --git a/README.md b/README.md index 4c922ee..7d0cdfe 100644 --- a/README.md +++ b/README.md @@ -1 +1,85 @@ # 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. + +## πŸ›£οΈ 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). +- **Codec Support:** Full support for encoding and decoding J2735 message into various formats for 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) +β”œβ”€β”€ 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 +``` + +## πŸ“œ Language Binding Installation + +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. + +### Python + +*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" +``` + +*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 + +*NPM* + +```bash +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 for proper links to to use. You can also download the files from the release page and install locally as well. + +**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). + + +## 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/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/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/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..a4fb969 --- /dev/null +++ b/etx/examples/node/README.md @@ -0,0 +1,203 @@ +# 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 +} +``` + +**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. + +| 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..677ccd4 --- /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: { + device_id: 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..370cac3 --- /dev/null +++ b/etx/examples/node/src/1_deregistration_example.ts @@ -0,0 +1,71 @@ +// 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.device_id; + if (!deviceId) { + throw new Error("Device ID is undefined.") + } + + } 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..4cc8c81 --- /dev/null +++ b/etx/examples/node/src/2_loopback_example.ts @@ -0,0 +1,198 @@ +// SPDX-FileCopyrightText: 2026 Verizon +// SPDX-License-Identifier: Apache-2.0 + +import { readFileSync } from 'node:fs'; +import { resolve } from 'node:path'; +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 isShuttingDown = false; + + constructor( + private client: MQTTClient, + private codec: Codec, + private bsmGen: BSMGenerator, + private location: any + ) { + process.on('SIGINT', () => this.shutdown("SIGINT (Ctrl+C)")); + process.on('SIGTERM', () => this.shutdown("SIGTERM (System Kill)")) + } + + /** + * 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 { + if (this.isShuttingDown) return; + this.isShuttingDown = true; + + logger.info(`${reason}. Cleaning up...`); + + // 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(); + + /** + * 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(); + } +} + +/** + * 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..191351d --- /dev/null +++ b/etx/examples/node/src/3_speedmon_example.ts @@ -0,0 +1,220 @@ +// SPDX-FileCopyrightText: 2026 Verizon +// SPDX-License-Identifier: Apache-2.0 + +import { readFileSync } from 'node:fs'; +import { resolve } from 'node:path'; +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 isShuttingDown = false; + + 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; + + process.on('SIGINT', () => this.shutdown("SIGINT (Ctrl+C)")); + process.on('SIGTERM', () => this.shutdown("SIGTERM (System Kill)")) + } + + /** + * Establishes connection and begins monitoring. + */ + public start(): void { + logger.info("Initializing Regional Speed Monitor..."); + this.client.connect((etx) => { + this.onConnect(etx); + }); + + logger.info("SPEED MONITOR ACTIVE. Press Ctrl+C to stop."); + } + + /** + * 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 { + // 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); + + const coreData = bsm.value.coreData; + const speed = coreData.speed || 0; + const parts = topic.split("/"); + const senderSession = parts[parts.length - 1] || "unknown"; + 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`); + const vLat = coreData.lat / 10000000; + const vLon = coreData.long / 10000000; + 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}`); + } + } + + /** + * 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(); + + // 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(); + } +} + +/** + * 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..6355d9b --- /dev/null +++ b/etx/examples/node/src/4_vehicle_example.ts @@ -0,0 +1,208 @@ +// SPDX-FileCopyrightText: 2026 Verizon +// SPDX-License-Identifier: Apache-2.0 + +import { readFileSync } from 'node:fs'; +import { resolve } from 'node:path'; + +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 sessionId: string | null = null; + private speedUnits: number; + private isShuttingDown = false; + + // 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); + + process.on('SIGINT', () => this.shutdown("SIGINT (Ctrl+C)")); + process.on('SIGTERM', () => this.shutdown("SIGTERM (System Kill)")); + } + + public start(): void { + logger.info("Initializing Vehicle OBU..."); + this.client.connect((etx) => { + this.onConnect(etx); + }); + + logger.info("VEHICLE ACTIVE. Press Ctrl+C to stop."); + } + + 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 { + // 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) { + logger.error(`Codec Error on topic ${topic}: ${e.message}`); + } + } + + private shutdown(reason: string): void { + if (this.isShuttingDown) return; + this.isShuttingDown = true; + + logger.info(`${reason}. Cleaning up vehicle session...`); + + // 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(); + + // 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(); + } +} + + +/** + * 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 new file mode 100644 index 0000000..d822780 --- /dev/null +++ b/etx/examples/python/README.md @@ -0,0 +1,230 @@ +# 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 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/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/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. + + 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 +} +``` +--- + +### Notes + +- Press ctrl-c to exit out of any examples early. +- These arguments are supported by all the following examples. + +| 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 +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. + +#### 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 +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. | + +--- + +### 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 ./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. | + + +--- + +### 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 ./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. | + +--- + +### 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 ./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 | +| :--- | :--- | :--- | :--- | +| 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 +pip install . +uv run python -m examples.0_registration_example + +# 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/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..e580724 --- /dev/null +++ b/etx/examples/python/pyproject.toml @@ -0,0 +1,39 @@ +[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", + "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..3576d4e --- /dev/null +++ b/etx/examples/python/src/examples/2_loopback_example.py @@ -0,0 +1,245 @@ +# 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 +import signal +from pathlib import Path +from logging import Logger + +from examples.utils.registration import RegistrationResponse +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 +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" + +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. + """ + # 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...") + self._client.connect( + [self._on_connect], + [lambda c: self._logger.info("Connection closed.")] + ) + + self._logger.info("Running loopback. Press Ctrl+C to exit early.") + + # 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. + """ + 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..e13804d --- /dev/null +++ b/etx/examples/python/src/examples/3_speedmon_example.py @@ -0,0 +1,220 @@ +# 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 signal +import logging +import threading +from pathlib import Path + +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 + +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 + +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() + + # Add Signal Listeners for Linux + signal.signal(signal.SIGINT, self._handle_signal) + signal.signal(signal.SIGTERM, self._handle_signal) + + def run(self): + """ + 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...") + self._client.connect( + [self._on_connect], + [lambda c: self._logger.info("Regional Monitor disconnected.")] + ) + + 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. + 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..f2c9c9f --- /dev/null +++ b/etx/examples/python/src/examples/4_vehicle_example.py @@ -0,0 +1,243 @@ +# 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 signal +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 + + # 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. + + 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...") + self._client.connect( + [self._on_connect], + [self._on_disconnect] + ) + + 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() + + 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..2c62ff9 --- /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.certDir + + 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/CMakeLists.txt b/j2735codec/CMakeLists.txt new file mode 100644 index 0000000..f024e0f --- /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.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) + 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/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 +``` 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/.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 diff --git a/j2735codec/bindings/node/README.md b/j2735codec/bindings/node/README.md new file mode 100644 index 0000000..bd66e78 --- /dev/null +++ b/j2735codec/bindings/node/README.md @@ -0,0 +1,124 @@ +# J2735 Codec - Node.js Bindings + +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. + +## πŸ“₯ Installation + +### Runtime Requirements +* **Node.js**: `v22.16.0` (LTS) or higher. +* **Environment**: Supports both CommonJS and ES Modules. + +### 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 +``` + +--- + +## πŸš€ Quick Start + +The codec initialization is asynchronous to allow for non-blocking WebAssembly compilation. + +```typescript +import { createV2XCodec, EncodingRules, PDUTypes } from 'j2735codec'; + +async function main() { + // 1. Initialize the codec (loads and compiles WASM) + const codec = await createV2XCodec(); + + const jsonContent = JSON.stringify({ + messageFrame: { + messageId: 20, + value: { /* ... J2735 payload ... */ } + } + }); + + // 2. 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()); + + // 3. Transcode: Packed (UPER) -> JSON (JER) + const decodedJsonRaw = codec.transcode( + EncodingRules.UNALIGNED_BASIC_PER, + EncodingRules.JER, + PDUTypes.MessageFrame, + uperBytes + ); + + const decodedJson = new TextDecoder().decode(decodedJsonRaw); + console.log('Decoded JSON:', JSON.parse(decodedJson)); +} + +main().catch(console.error); +``` + +--- + +## πŸ›  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 Core +Ensure you have the [Prerequisites](/README.md) installed: + +- 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 +``` + +--- + +## πŸ“‚ 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. See the [LICENSE](/LICENSE) file for details. \ 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..4ef85d7 --- /dev/null +++ b/j2735codec/bindings/node/package.json @@ -0,0 +1,41 @@ +{ + "name": "j2735codec", + "version": "0.2.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": "mkdir -p dist/generated && cp -r src/generated/* dist/generated/", + "test": "vitest run" + }, + "keywords": [], + "author": "Sean Hsu", + "license": "Apache-2.0", + "type": "module", + "engines": { + "node": ">=22.0.0" + }, + "devDependencies": { + "@types/node": "^25.0.8", + "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", + "package.json" + ], + "dependencies": { + "@bufbuild/protobuf": "^2.10.2" + } +} diff --git a/j2735codec/bindings/node/src/codec.ts b/j2735codec/bindings/node/src/codec.ts new file mode 100644 index 0000000..f05e5ce --- /dev/null +++ b/j2735codec/bindings/node/src/codec.ts @@ -0,0 +1,226 @@ +/** + * 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'; +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 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 createCodec(): 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 Codec(instance); +} + +/** + * High-level interface for the V2X ASN.1 Codec. + * Handles memory management and pointer orchestration between JS and C. + */ +export class Codec { + /** 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 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. + * @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 transcodeJ2735( + 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..add4644 --- /dev/null +++ b/j2735codec/bindings/node/src/index.ts @@ -0,0 +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/src/protobuf/georoutedmsg.ts b/j2735codec/bindings/node/src/protobuf/georoutedmsg.ts new file mode 100644 index 0000000..2bf30cf --- /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.js"; + +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/node/tests/codec.test.ts b/j2735codec/bindings/node/tests/codec.test.ts new file mode 100644 index 0000000..2d15ed2 --- /dev/null +++ b/j2735codec/bindings/node/tests/codec.test.ts @@ -0,0 +1,128 @@ +/** + * 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 { + Codec, + GeoRoutedHeader, + createCodec, + EncodingRules, + PDUTypes, +} from 'j2735codec'; + +describe('V2X Codec Comprehensive Coverage', () => { + let codec: Codec; + + const sampleDir = existsSync("./samples") + ? "./samples" + : "../../core/j2735_202409/samples/jer"; + + beforeAll(async () => { + if (!existsSync(sampleDir)) { + throw new Error(`❌ Sample directory missing: ${sampleDir}`); + } + // Initialize the WASM codec + codec = await createCodec() + }); + + const messageFiles = readdirSync(sampleDir).filter(f => f.endsWith('.json')); + + /** + * Test 1: Standard Round-Trip (JER -> UPER -> JER) + */ + it.each(messageFiles)('should round-trip transcode: %s', (fileName) => { + const originalContent = readFileSync(join(sampleDir, fileName), "utf8"); + + const encoded = codec.transcodeJ2735( + EncodingRules.JER, + EncodingRules.UNALIGNED_BASIC_PER, + PDUTypes.MessageFrame, + originalContent + ); + + expect(encoded).toBeInstanceOf(Uint8Array); + expect(encoded.length).toBeGreaterThan(0); + + const decoded = codec.transcodeJ2735( + EncodingRules.UNALIGNED_BASIC_PER, + EncodingRules.JER, + PDUTypes.MessageFrame, + encoded + ); + + const decodedStr = new TextDecoder().decode(decoded); + const json = JSON.parse(decodedStr); + expect(json).toBeDefined(); + 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/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/j2735codec/bindings/python/README.md b/j2735codec/bindings/python/README.md new file mode 100644 index 0000000..bf2e7a7 --- /dev/null +++ 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.9` 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 diff --git a/j2735codec/bindings/python/pyproject.toml b/j2735codec/bindings/python/pyproject.toml new file mode 100644 index 0000000..8653a8e --- /dev/null +++ b/j2735codec/bindings/python/pyproject.toml @@ -0,0 +1,41 @@ +[project] +name = "j2735codec" +version = "0.2.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.9" +dependencies = [ + "wasmtime>=25.0.0", + "protobuf>=6.33.4", +] + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[dependency-groups] +dev = [ + "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"] + +# 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" +testpaths = ["tests"] diff --git a/j2735codec/bindings/python/src/j2735codec/__init__.py b/j2735codec/bindings/python/src/j2735codec/__init__.py new file mode 100644 index 0000000..2aa494d --- /dev/null +++ b/j2735codec/bindings/python/src/j2735codec/__init__.py @@ -0,0 +1,7 @@ +# 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", "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 new file mode 100644 index 0000000..a7a93a9 --- /dev/null +++ b/j2735codec/bindings/python/src/j2735codec/codec.py @@ -0,0 +1,239 @@ +# SPDX-FileCopyrightText: 2025 Verizon +# SPDX-License-Identifier: Apache-2.0 +""" +A Python module for V2X data transcoding using WebAssembly. + +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. +""" +import os +import struct +import logging +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 + +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 Codec: + """ + Represents a codec for transcoding data between encodings. + + 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. + + 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 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, + 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, + 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.") + + 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 + Codec.WASM_POINTER_SIZE]) + + # Unpack those bytes to get the integer address of the actual output buffer + pointer_format = " 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/src/j2735codec/py.typed b/j2735codec/bindings/python/src/j2735codec/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/j2735codec/bindings/python/tests/test_codec.py b/j2735codec/bindings/python/tests/test_codec.py new file mode 100644 index 0000000..6e9e95d --- /dev/null +++ b/j2735codec/bindings/python/tests/test_codec.py @@ -0,0 +1,139 @@ +# SPDX-FileCopyrightText: 2025 Verizon +# 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, Codec, GeoRoutedHeader + +def get_sample_dir(): + """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() + # Adjust 'parents[3]' if your file depth changes + project_root = current_file.parents[3] + 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() + if not sample_dir.exists(): + return [] + return list(sample_dir.rglob("*.json")) + +@pytest.fixture(scope="module") +def codec(): + return Codec() + +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. Check pathing.") + + json_content = sample_path.read_text(encoding="utf-8") + + # Encode: JER -> UPER + encoded_bin = codec.transcode_j2735( + EncodingRules.JER, + EncodingRules.UNALIGNED_BASIC_PER, + PDUTypes.MESSAGE_FRAME, + json_content, + ) + + assert isinstance(encoded_bin, (bytes, bytearray)) + assert len(encoded_bin) > 0 + + # Decode: UPER -> JER + decoded_jer = codec.transcode_j2735( + EncodingRules.UNALIGNED_BASIC_PER, + EncodingRules.JER, + PDUTypes.MESSAGE_FRAME, + encoded_bin, + ) + + 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 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/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 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/j2735_202409/samples/jer/bsm.json b/j2735codec/core/j2735_202409/samples/jer/bsm.json new file mode 100644 index 0000000..5b4bc44 --- /dev/null +++ b/j2735codec/core/j2735_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/j2735_202409/samples/jer/eva.json b/j2735codec/core/j2735_202409/samples/jer/eva.json new file mode 100644 index 0000000..55b9810 --- /dev/null +++ b/j2735codec/core/j2735_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/j2735_202409/samples/jer/map.json b/j2735codec/core/j2735_202409/samples/jer/map.json new file mode 100644 index 0000000..64db513 --- /dev/null +++ b/j2735codec/core/j2735_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/j2735_202409/samples/jer/psm.json b/j2735codec/core/j2735_202409/samples/jer/psm.json new file mode 100644 index 0000000..da0db74 --- /dev/null +++ b/j2735codec/core/j2735_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/j2735_202409/samples/jer/sdsm.json b/j2735codec/core/j2735_202409/samples/jer/sdsm.json new file mode 100644 index 0000000..121f22e --- /dev/null +++ b/j2735codec/core/j2735_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/j2735_202409/samples/jer/spat.json b/j2735codec/core/j2735_202409/samples/jer/spat.json new file mode 100644 index 0000000..2550262 --- /dev/null +++ b/j2735codec/core/j2735_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/j2735_202409/samples/jer/tim.json b/j2735codec/core/j2735_202409/samples/jer/tim.json new file mode 100644 index 0000000..9c80fba --- /dev/null +++ b/j2735codec/core/j2735_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 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 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..498417f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3175 @@ +{ + "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", + "etx/examples/node" + ], + "devDependencies": { + "rimraf": "^6.1.2", + "typescript": "^5.9.3", + "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", + "license": "Apache-2.0", + "dependencies": { + "@bufbuild/protobuf": "^2.10.2" + }, + "devDependencies": { + "@types/node": "^25.0.8", + "cpx2": "^8.0.0", + "rimraf": "^6.1.2", + "typescript": "^5.9.3", + "vitest": "^4.0.17" + }, + "engines": { + "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", + "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", + "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/@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", + "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/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==", + "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", + "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/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", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "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", + "engines": { + "node": ">=12" + }, + "funding": { + "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", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "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", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "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", + "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/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", + "integrity": "sha512-RxD9jrSVNSOmfcbiPlr3XnKbUKH9K1w2HCv0skczUKhsZTueiDBecxuaSAKQkYSLQaGVA4ZQJZlTj5hVNNEvKg==", + "dev": true, + "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/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": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "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==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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": "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" + }, + "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", + "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/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", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@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", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "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", + "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/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": "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", + "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/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": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", + "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "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": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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, + "dependencies": { + "find-index": "^0.1.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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/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", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "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", + "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", + "dev": true, + "license": "MIT", + "engines": { + "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", + "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", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "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", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "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/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", + "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", + "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/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", + "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/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": "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==", + "license": "MIT" + }, + "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/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", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "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": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "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", + "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/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", + "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": { + "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", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "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.4" + }, + "funding": { + "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", + "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/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.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "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/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", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "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", + "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": "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", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "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-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==", + "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/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "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", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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", + "engines": { + "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", + "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "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", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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", + "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==", + "license": "MIT" + }, + "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": ">= 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", + "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/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", + "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/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", + "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==", + "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/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": ">=8" + } + }, + "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": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "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 new file mode 100644 index 0000000..37efd51 --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "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": [ + "j2735codec/bindings/node", + "etx/examples/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" + }, + "devDependencies": { + "rimraf": "^6.1.2", + "typescript": "^5.9.3", + "vitest": "^4.0.17" + } +} diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..642ea62 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,19 @@ +[project] +name = "etx-starter-kit" +version = "0.2.0" +requires-python = ">=3.9" +dependencies = [] + +[tool.uv] +# Add any additional workspaces here in the future. +workspace = { members = [ + "j2735codec/bindings/python", + "etx/examples/python" ] } + +[tool.uv.sources] +# This explicitly tells UV where to find the 'j2735codec' package +j2735codec = { workspace = true } +examples = { workspace = true } + +[dependency-groups] +dev = [] diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..bf8f5e8 --- /dev/null +++ b/uv.lock @@ -0,0 +1,515 @@ +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", + "examples", + "j2735codec", +] + +[[package]] +name = "certifi" +version = "2026.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/b8/6d51fc1d52cbd52cd4ccedd5b5b2f0f6a11bbf6765c782298b0f3e808541/charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d", size = 209709, upload-time = "2025-10-14T04:40:11.385Z" }, + { url = "https://files.pythonhosted.org/packages/5c/af/1f9d7f7faafe2ddfb6f72a2e07a548a629c61ad510fe60f9630309908fef/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8", size = 148814, upload-time = "2025-10-14T04:40:13.135Z" }, + { url = "https://files.pythonhosted.org/packages/79/3d/f2e3ac2bbc056ca0c204298ea4e3d9db9b4afe437812638759db2c976b5f/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad", size = 144467, upload-time = "2025-10-14T04:40:14.728Z" }, + { url = "https://files.pythonhosted.org/packages/ec/85/1bf997003815e60d57de7bd972c57dc6950446a3e4ccac43bc3070721856/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8", size = 162280, upload-time = "2025-10-14T04:40:16.14Z" }, + { url = "https://files.pythonhosted.org/packages/3e/8e/6aa1952f56b192f54921c436b87f2aaf7c7a7c3d0d1a765547d64fd83c13/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d", size = 159454, upload-time = "2025-10-14T04:40:17.567Z" }, + { url = "https://files.pythonhosted.org/packages/36/3b/60cbd1f8e93aa25d1c669c649b7a655b0b5fb4c571858910ea9332678558/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313", size = 153609, upload-time = "2025-10-14T04:40:19.08Z" }, + { url = "https://files.pythonhosted.org/packages/64/91/6a13396948b8fd3c4b4fd5bc74d045f5637d78c9675585e8e9fbe5636554/charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e", size = 151849, upload-time = "2025-10-14T04:40:20.607Z" }, + { url = "https://files.pythonhosted.org/packages/b7/7a/59482e28b9981d105691e968c544cc0df3b7d6133152fb3dcdc8f135da7a/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93", size = 151586, upload-time = "2025-10-14T04:40:21.719Z" }, + { url = "https://files.pythonhosted.org/packages/92/59/f64ef6a1c4bdd2baf892b04cd78792ed8684fbc48d4c2afe467d96b4df57/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0", size = 145290, upload-time = "2025-10-14T04:40:23.069Z" }, + { url = "https://files.pythonhosted.org/packages/6b/63/3bf9f279ddfa641ffa1962b0db6a57a9c294361cc2f5fcac997049a00e9c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84", size = 163663, upload-time = "2025-10-14T04:40:24.17Z" }, + { url = "https://files.pythonhosted.org/packages/ed/09/c9e38fc8fa9e0849b172b581fd9803bdf6e694041127933934184e19f8c3/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e", size = 151964, upload-time = "2025-10-14T04:40:25.368Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d1/d28b747e512d0da79d8b6a1ac18b7ab2ecfd81b2944c4c710e166d8dd09c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db", size = 161064, upload-time = "2025-10-14T04:40:26.806Z" }, + { url = "https://files.pythonhosted.org/packages/bb/9a/31d62b611d901c3b9e5500c36aab0ff5eb442043fb3a1c254200d3d397d9/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6", size = 155015, upload-time = "2025-10-14T04:40:28.284Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f3/107e008fa2bff0c8b9319584174418e5e5285fef32f79d8ee6a430d0039c/charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f", size = 99792, upload-time = "2025-10-14T04:40:29.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/66/e396e8a408843337d7315bab30dbf106c38966f1819f123257f5520f8a96/charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d", size = 107198, upload-time = "2025-10-14T04:40:30.644Z" }, + { url = "https://files.pythonhosted.org/packages/b5/58/01b4f815bf0312704c267f2ccb6e5d42bcc7752340cd487bc9f8c3710597/charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69", size = 100262, upload-time = "2025-10-14T04:40:32.108Z" }, + { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" }, + { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" }, + { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" }, + { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" }, + { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" }, + { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" }, + { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" }, + { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" }, + { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" }, + { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" }, + { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" }, + { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" }, + { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" }, + { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" }, + { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" }, + { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" }, + { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, + { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, + { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, + { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, + { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, + { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, + { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, + { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, + { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, + { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" }, + { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" }, + { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" }, + { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" }, + { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" }, + { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" }, + { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" }, + { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" }, + { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" }, + { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" }, + { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" }, + { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" }, + { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" }, + { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" }, + { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" }, + { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" }, + { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" }, + { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, + { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, + { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, + { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, + { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, + { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, + { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, + { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, + { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, + { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, + { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, + { url = "https://files.pythonhosted.org/packages/46/7c/0c4760bccf082737ca7ab84a4c2034fcc06b1f21cf3032ea98bd6feb1725/charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9", size = 209609, upload-time = "2025-10-14T04:42:10.922Z" }, + { url = "https://files.pythonhosted.org/packages/bb/a4/69719daef2f3d7f1819de60c9a6be981b8eeead7542d5ec4440f3c80e111/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d", size = 149029, upload-time = "2025-10-14T04:42:12.38Z" }, + { url = "https://files.pythonhosted.org/packages/e6/21/8d4e1d6c1e6070d3672908b8e4533a71b5b53e71d16828cc24d0efec564c/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608", size = 144580, upload-time = "2025-10-14T04:42:13.549Z" }, + { url = "https://files.pythonhosted.org/packages/a7/0a/a616d001b3f25647a9068e0b9199f697ce507ec898cacb06a0d5a1617c99/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc", size = 162340, upload-time = "2025-10-14T04:42:14.892Z" }, + { url = "https://files.pythonhosted.org/packages/85/93/060b52deb249a5450460e0585c88a904a83aec474ab8e7aba787f45e79f2/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e", size = 159619, upload-time = "2025-10-14T04:42:16.676Z" }, + { url = "https://files.pythonhosted.org/packages/dd/21/0274deb1cc0632cd587a9a0ec6b4674d9108e461cb4cd40d457adaeb0564/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1", size = 153980, upload-time = "2025-10-14T04:42:17.917Z" }, + { url = "https://files.pythonhosted.org/packages/28/2b/e3d7d982858dccc11b31906976323d790dded2017a0572f093ff982d692f/charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3", size = 152174, upload-time = "2025-10-14T04:42:19.018Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ff/4a269f8e35f1e58b2df52c131a1fa019acb7ef3f8697b7d464b07e9b492d/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6", size = 151666, upload-time = "2025-10-14T04:42:20.171Z" }, + { url = "https://files.pythonhosted.org/packages/da/c9/ec39870f0b330d58486001dd8e532c6b9a905f5765f58a6f8204926b4a93/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88", size = 145550, upload-time = "2025-10-14T04:42:21.324Z" }, + { url = "https://files.pythonhosted.org/packages/75/8f/d186ab99e40e0ed9f82f033d6e49001701c81244d01905dd4a6924191a30/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1", size = 163721, upload-time = "2025-10-14T04:42:22.46Z" }, + { url = "https://files.pythonhosted.org/packages/96/b1/6047663b9744df26a7e479ac1e77af7134b1fcf9026243bb48ee2d18810f/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf", size = 152127, upload-time = "2025-10-14T04:42:23.712Z" }, + { url = "https://files.pythonhosted.org/packages/59/78/e5a6eac9179f24f704d1be67d08704c3c6ab9f00963963524be27c18ed87/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318", size = 161175, upload-time = "2025-10-14T04:42:24.87Z" }, + { url = "https://files.pythonhosted.org/packages/e5/43/0e626e42d54dd2f8dd6fc5e1c5ff00f05fbca17cb699bedead2cae69c62f/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c", size = 155375, upload-time = "2025-10-14T04:42:27.246Z" }, + { url = "https://files.pythonhosted.org/packages/e9/91/d9615bf2e06f35e4997616ff31248c3657ed649c5ab9d35ea12fce54e380/charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505", size = 99692, upload-time = "2025-10-14T04:42:28.425Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a9/6c040053909d9d1ef4fcab45fddec083aedc9052c10078339b47c8573ea8/charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966", size = 107192, upload-time = "2025-10-14T04:42:29.482Z" }, + { url = "https://files.pythonhosted.org/packages/f0/c6/4fa536b2c0cd3edfb7ccf8469fa0f363ea67b7213a842b90909ca33dd851/charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50", size = 100220, upload-time = "2025-10-14T04:42:30.632Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, +] + +[[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 = "examples" +version = "0.2.0" +source = { editable = "etx/examples/python" } +dependencies = [ + { name = "j2735codec" }, + { name = "paho-mqtt" }, + { name = "python-geohash" }, + { name = "requests" }, +] + +[package.dev-dependencies] +dev = [ + { 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 = "j2735codec", editable = "j2735codec/bindings/python" }, + { name = "paho-mqtt", specifier = ">=2.1.0" }, + { name = "python-geohash", specifier = ">=0.8.5" }, + { name = "requests", specifier = ">=2.32.5" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "pytest", specifier = ">=8.0.0" }, + { name = "ruff", specifier = ">=0.14.11" }, +] + +[[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 = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[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 = "protobuf" }, + { name = "wasmtime" }, +] + +[package.dev-dependencies] +dev = [ + { 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 = "protobuf", specifier = ">=6.33.4" }, + { name = "wasmtime", specifier = ">=25.0.0" }, +] + +[package.metadata.requires-dev] +dev = [ + { 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 = "paho-mqtt" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/39/15/0a6214e76d4d32e7f663b109cf71fb22561c2be0f701d67f93950cd40542/paho_mqtt-2.1.0.tar.gz", hash = "sha256:12d6e7511d4137555a3f6ea167ae846af2c7357b10bc6fa4f7c3968fc1723834", size = 148848, upload-time = "2024-04-29T19:52:55.591Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/cb/00451c3cf31790287768bb12c6bec834f5d292eaf3022afc88e14b8afc94/paho_mqtt-2.1.0-py3-none-any.whl", hash = "sha256:6db9ba9b34ed5bc6b6e3812718c7e06e2fd7444540df2455d2c51bd58808feee", size = 67219, upload-time = "2024-04-29T19:52:48.345Z" }, +] + +[[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 = "python-geohash" +version = "0.8.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/e2/1a3507af7c8f91f8a4975d651d4aeb6a846dfdf74713954186ade4205850/python-geohash-0.8.5.tar.gz", hash = "sha256:05a21fcf4eda1a5eddbd291890ade23fc5ddaa6bb98f2ee23d2d384ed14f086d", size = 17636, upload-time = "2014-08-13T07:09:57.318Z" } + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[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 = "urllib3" +version = "2.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, +] + +[[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" }, +]