# Rockauto Scraper (`parseforge/rockauto-scraper`) Actor

Scrape auto parts from RockAuto catalog. Get prices, availability, part numbers, brands, fitment notes, and warehouse data. Search by year, make, model, and part category for any vehicle.

- **URL**: https://apify.com/parseforge/rockauto-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** E-commerce, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

![ParseForge Banner](https://github.com/ParseForge/apify-assets/blob/ad35ccc13ddd068b9d6cba33f323962e39aed5b2/banner.jpg?raw=true)

## 🚗 RockAuto Parts Scraper

Get detailed auto parts data from RockAuto.com, including prices, availability, fitment info, and specifications. This tool is ideal for mechanics, fleet managers, or parts aggregators who need RockAuto catalog data without any coding. Use direct URLs or filter by vehicle to build a parts database, track inventory, or compare costs across categories.

> **The RockAuto Parts Scraper gathers comprehensive data, such as brand, prices, fitment details, and warehouse info, filtered by vehicle type and part category.**

### ✨ What Does It Do

- 📝 **Brand & Part Number** - Organize inventory or match with supplier catalogs using manufacturer and part codes
- 💰 **Price & Core Charge** - Capture USD retail and core charge prices to compare costs across models
- ✅ **Availability & Stock Status** - Monitor inventory to gauge supply chain health
- 🏭 **Warehouse Details** - Access warehouse locations and part numbers for distribution and fulfillment
- 📋 **Fitment Notes** - Retrieve fitment specifications to ensure compatibility with customer vehicles
- 🔗 **Vehicle Context** - Log make, model, year, engine type, and part category across vehicle lineups

### 🔧 Input

- **Start URLs** - Paste RockAuto catalog URLs to collect parts from those specific categories, or leave empty to use vehicle filters.
- **Vehicle Year** - The model year of the vehicle (e.g., 2020). Required when not using Start URLs.
- **Vehicle Make** - The manufacturer name (e.g., TOYOTA, HONDA, FORD). Case-insensitive.
- **Vehicle Model** - The vehicle model name (e.g., CAMRY, CIVIC, F-150). Case-insensitive.
- **Part Category** - Optional filter to a specific part category group (e.g., Brake & Wheel Hub, Engine, Suspension). Leave empty to collect all categories.
- **Include All Engine Variants** - When true, collects parts for all engine options. When false (default), only the first option is used.
- **Max Concurrency** - Number of parallel requests (1-20, default 5). Lower this if you encounter rate limiting.
- **Max Items** - Maximum number of parts to collect. Free users: up to 100. Paid users: up to 1,000,000.

Example input:
```json
{
  "startUrls": ["https://www.rockauto.com/en/catalog/toyota,2020,camry,2.5l+l4,3445372,brake+%26+wheel+hub,brake+pad,1684"],
  "maxItems": 10
}
````

### 📊 Output

Each part record includes up to 24 data fields. Download as JSON, CSV, or Excel.

| 📝 Brand | 🔢 Part Number | 🏷️ Part Key |
|---|---|---|
| 💰 Price | 💵 Core Price | 💱 Currency |
| ✅ In Stock | 📦 Availability | 🔧 Condition |
| 📋 Sort Group | 📊 Sort Group Text | 📌 Footnote |
| 🛠️ Fitment Notes | 🚗 Make | 📅 Year |
| 🏎️ Model | ⚙️ Engine | 🔐 Carcode |
| 🏷️ Part Category | 🛒 Part Type | 🆔 Part Type ID |
| 🔗 Info URL | 📍 Catalog URL | 🏭 Warehouse |
| 🎯 Warehouse Part Number | ⏱️ Scraped At | - |

### 💎 Why Choose the RockAuto Parts Scraper?

| Feature | Our Actor |
|---|---|
| Direct URL input for fast catalog scraping | ✔️ |
| Vehicle filtering by year, make, model | ✔️ |
| Multi-engine variant support | ✔️ |
| Core charge and price capture | ✔️ |
| Warehouse and fulfillment tracking | ✔️ |
| Fitment notes and compatibility data | ✔️ |
| Part categories and type filtering | ✔️ |
| Free tier: 100 results per run | ✔️ |
| Paid tier: up to 1,000,000 results per run | ✔️ |
| JSON, CSV, and Excel export | ✔️ |
| No coding required | ✔️ |
| Adjustable concurrency to handle rate limiting | ✔️ |

### 📋 How to Use

No technical skills needed. Just follow these steps:

1. **Sign Up**: [Create a free account with $5 credit](https://console.apify.com/sign-up?fpr=vmoqkp)
2. **Find the Tool**: Search for "RockAuto Parts Scraper" in the Apify Store and set your input
3. **Run It**: Click Start and see your results

That's all. No coding or setup required. Export your data in CSV, Excel, or JSON format.

### 🎯 Business Use Cases

- 📊 **Parts Aggregators** - Gather price and availability data to build comprehensive comparison databases
- 💼 **Repair Shop Managers** - Track RockAuto inventory for common parts to plan purchases before demand spikes
- 📈 **Market Researchers** - Analyze parts prices and trends by vehicle type to spot cost gaps and supply shortages

### ❓ FAQ

**🔍 How does this actor work?**
The tool navigates RockAuto's catalog using direct URLs or vehicle filters. Paste a catalog URL or use filters (year, make, model) to find parts.

**📊 How accurate is the data?**
Data is collected in real time from RockAuto.com. Prices and availability are current at scraping time. Fitment notes are extracted from listing HTML.

**📅 Can I schedule this actor to run regularly?**
Use the Apify scheduler to run this tool daily, weekly, or monthly. Integrate with tools like Zapier to send results to your spreadsheet or database automatically.

**⚖️ Is it legal to scrape RockAuto?**
The data is public information from RockAuto.com. Ensure compliance with RockAuto's Terms of Service and local laws regarding data collection and use.

**🛡️ Will RockAuto block me?**
RockAuto has standard protections. To avoid blocking, the tool includes concurrency limits and respectful pacing. If rate-limited, lower the "Max Concurrency" setting.

**⚡ How long does a run take?**
Collecting 100 parts typically takes 2-5 minutes. Larger runs depend on item count, network speed, and RockAuto's response. Paid users can collect up to 1,000,000 items in one run.

**⚠️ Are there any limits?**
Free users can collect up to 100 results per run. Paid users can collect up to 1,000,000 results per run.

### 🔗 Integrate RockAuto Parts Scraper with any app

- [Make](https://docs.apify.com/platform/integrations/make) - Automate workflows
- [Zapier](https://docs.apify.com/platform/integrations/zapier) - Connect 5000+ apps
- [GitHub](https://docs.apify.com/platform/integrations/github) - Version control integration
- [Slack](https://docs.apify.com/platform/integrations/slack) - Get notifications
- [Airbyte](https://docs.apify.com/platform/integrations/airbyte) - Data pipelines
- [Google Drive](https://docs.apify.com/platform/integrations/drive) - Export to spreadsheets

### 💡 More ParseForge Actors

- [Mac App Store Scraper](https://apify.com/parseforge/mac-app-store-scraper) - Collect app prices, ratings, and reviews
- [Carvana Scraper](https://apify.com/parseforge/carvana-scraper) - Extract used car inventory and price data
- [USAJobs Scraper](https://apify.com/parseforge/usajobs-scraper) - Scrape federal job listings and requirements
- [Drive.com.au News Scraper](https://apify.com/parseforge/drive-com-au-news-scraper) - Monitor automotive news and reviews
- [Avvo Attorney Profile Scraper](https://apify.com/parseforge/avvo-attorney-scraper) - Extract attorney profiles and ratings

Browse our complete collection of [data extraction tools](https://apify.com/parseforge) for more.

### 🚀 Ready to Start?

[Create a free account with $5 credit](https://console.apify.com/sign-up?fpr=vmoqkp) and collect your first 100 results for free. No coding, no setup.

### 🆘 Need Help?

- Check the FAQ section above for common questions
- Visit the [Apify support page](https://docs.apify.com) for documentation and tutorials
- Contact us to request a new scraper, propose a custom project, or report an issue at [Tally contact form](https://tally.so/r/BzdKgA)

### ⚠️ Disclaimer

> This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by RockAuto or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.

# Actor input Schema

## `startUrls` (type: `array`):

List of RockAuto catalog URLs to scrape (year/make/model/category level). If provided, vehicle filters below are ignored.

## `maxItems` (type: `integer`):

Free users: Limited to 100. Paid users: Optional, max 1,000,000.

## `year` (type: `integer`):

Vehicle model year (e.g. 2020). Required when not using Start URLs.

## `make` (type: `string`):

Vehicle manufacturer (e.g. TOYOTA, HONDA, FORD). Case-insensitive.

## `model` (type: `string`):

Vehicle model name (e.g. CAMRY, CIVIC, F-150). Case-insensitive.

## `partCategory` (type: `string`):

Filter to a specific part category group (e.g. 'Brake & Wheel Hub', 'Engine', 'Suspension'). Leave empty to scrape all categories.

## `includeAllEngines` (type: `boolean`):

When true, scrapes parts for all engine variants of the vehicle. When false (default), only uses the first engine variant found.

## `maxConcurrency` (type: `integer`):

Maximum number of parallel requests. Lower this if you get rate-limited.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.rockauto.com/en/catalog/toyota,2020,camry,2.5l+l4,3445372,brake+%26+wheel+hub,brake+pad,1684"
  ],
  "maxItems": 10,
  "includeAllEngines": false,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset with all scraped items

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        "https://www.rockauto.com/en/catalog/toyota,2020,camry,2.5l+l4,3445372,brake+%26+wheel+hub,brake+pad,1684"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/rockauto-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": ["https://www.rockauto.com/en/catalog/toyota,2020,camry,2.5l+l4,3445372,brake+%26+wheel+hub,brake+pad,1684"],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/rockauto-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    "https://www.rockauto.com/en/catalog/toyota,2020,camry,2.5l+l4,3445372,brake+%26+wheel+hub,brake+pad,1684"
  ],
  "maxItems": 10
}' |
apify call parseforge/rockauto-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=parseforge/rockauto-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Rockauto Scraper",
        "description": "Scrape auto parts from RockAuto catalog. Get prices, availability, part numbers, brands, fitment notes, and warehouse data. Search by year, make, model, and part category for any vehicle.",
        "version": "1.0",
        "x-build-id": "TNb0e8ABEKqLn75YQ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/parseforge~rockauto-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-parseforge-rockauto-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/parseforge~rockauto-scraper/runs": {
            "post": {
                "operationId": "runs-sync-parseforge-rockauto-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/parseforge~rockauto-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-parseforge-rockauto-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "List of RockAuto catalog URLs to scrape (year/make/model/category level). If provided, vehicle filters below are ignored.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Free users: Limited to 100. Paid users: Optional, max 1,000,000."
                    },
                    "year": {
                        "title": "Vehicle Year",
                        "minimum": 1900,
                        "maximum": 2030,
                        "type": "integer",
                        "description": "Vehicle model year (e.g. 2020). Required when not using Start URLs."
                    },
                    "make": {
                        "title": "Vehicle Make",
                        "type": "string",
                        "description": "Vehicle manufacturer (e.g. TOYOTA, HONDA, FORD). Case-insensitive."
                    },
                    "model": {
                        "title": "Vehicle Model",
                        "type": "string",
                        "description": "Vehicle model name (e.g. CAMRY, CIVIC, F-150). Case-insensitive."
                    },
                    "partCategory": {
                        "title": "Part Category",
                        "type": "string",
                        "description": "Filter to a specific part category group (e.g. 'Brake & Wheel Hub', 'Engine', 'Suspension'). Leave empty to scrape all categories."
                    },
                    "includeAllEngines": {
                        "title": "Include All Engine Variants",
                        "type": "boolean",
                        "description": "When true, scrapes parts for all engine variants of the vehicle. When false (default), only uses the first engine variant found.",
                        "default": false
                    },
                    "maxConcurrency": {
                        "title": "Max Concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum number of parallel requests. Lower this if you get rate-limited.",
                        "default": 5
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
