# Ripley Product Search Scraper (`stealth_mode/ripley-product-search-scraper`) Actor

Scrape product listings from Ripley.cl search results with precision. Collect pricing, ratings, images, variants, discounts, and 30+ fields per product — perfect for price comparison, market research, and e-commerce data analytics.

- **URL**: https://apify.com/stealth\_mode/ripley-product-search-scraper.md
- **Developed by:** [Stealth mode](https://apify.com/stealth_mode) (community)
- **Categories:** Automation, Developer tools, E-commerce
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## Ripley.cl Product Scraper: Extract E-Commerce Search Results Data

---

### What Is Ripley.cl?

Ripley.cl is the Chilean e-commerce platform of Ripley, one of Latin America's largest retail groups. The platform hosts hundreds of thousands of products across electronics, fashion, home goods, sports, and more. For businesses tracking market trends, monitoring competitor pricing, or building product databases, manually collecting this data is inefficient — the **Ripley.cl Product Scraper** automates the process by extracting structured product data directly from search result pages.

---

### Overview

The **Ripley Product Search Scraper** crawls Ripley.cl search results and extracts detailed product information, transforming unstructured e-commerce listings into clean, machine-readable records. It is ideal for:

- **Price comparison platforms** aggregating Chilean retail data
- **Market researchers** analyzing product availability and pricing trends
- **E-commerce analysts** monitoring competitor assortments
- **Inventory managers** integrating external product catalogs
- **Developers** building Chilean retail datasets or price-tracking tools

The scraper handles pagination, multiple sellers, and dynamic pricing — delivering comprehensive product snapshots suitable for analytics, BI integration, or downstream processing.

---

### Input Format

The scraper accepts a straightforward JSON configuration:

```json
{
  "urls": [
    "https://simple.ripley.cl/search/lip?sort=relevance_desc&page=2"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 200
}
````

#### Input Parameters

| Parameter | Type | Description |
|---|---|---|
| `urls` | Array of strings | Links to Ripley.cl product search result pages. Include full URLs with query parameters (search terms, sorting, pagination). |
| `ignore_url_failures` | Boolean | If `true`, the scraper continues running even if some URLs fail to load. If `false`, a single failure stops the entire run. |
| `max_items_per_url` | Integer | Maximum products extracted per URL (e.g., `200`). Useful to limit data volume or cost. |

**Example URLs:**

- Search by keyword: `https://simple.ripley.cl/search/laptop?sort=relevance_desc&page=1`
- Search with filters: `https://simple.ripley.cl/search/shoes?price_from=50000&price_to=150000`
- Paginated results: `https://simple.ripley.cl/search/electronics?page=3`

> **Tip:** Use the `simple.ripley.cl` subdomain for reliable scraping. Include sorting and filtering parameters to define your dataset scope.

***

### Output Format

**Sample output**

```json
{
  "sku": "12687819",
  "parent_product_id": null,
  "code": "6be161e5-62d6-42c6-a127-4d5400180f47",
  "brand": "CATRICE",
  "description": "-",
  "primary_image": "https://rimage.ripley.cl/home.ripley/Attachment/MKP/7945/MPM10001128439/full_image-1.jpeg",
  "category_code": "R300702000000",
  "xcatentry_category": "D777",
  "product_type": "ItemBean",
  "name": "LIP JAM BRILLO DE LABIOS HIDRATANTE 10ML CATRICE",
  "images": [
    "https://rimage.ripley.cl/home.ripley/Attachment/MKP/7945/MPM10001128439/full_image-1.jpeg"
  ],
  "variants": [
    {
      "sku": "12687819",
      "primary_image": "https://rimage.ripley.cl/home.ripley/Attachment/MKP/7945/MPM10001128439/full_image-1.jpeg",
      "images": [
        "https://rimage.ripley.cl/home.ripley/Attachment/MKP/7945/MPM10001128439/full_image-1.jpeg"
      ],
      "has_ripley_points": false,
      "ripley_points": null
    }
  ],
  "colors": [],
  "sponsored": null,
  "rating_reviews": {
    "score": 0,
    "count": 0
  },
  "old_price": null,
  "price": "$6.990",
  "ripley_price": null,
  "price_number": 6990,
  "discount": 0,
  "discount_sale_price": null,
  "has_initial_price": false,
  "badges_top": [],
  "badges_middle": [],
  "badges_bottom": [
    {
      "tag": "cuatro_csi_ripley",
      "label": "4 cuotas sin interés",
      "font_color": "#000000",
      "background_color": "#efefef",
      "value": "4 cuotas sin interes",
      "type": "cuotas"
    }
  ],
  "position": 2,
  "shop": {
    "id": "7945",
    "seller_id": 7159,
    "mirakl_id": 10352,
    "legal_name": "Comercial Giacaman SpA",
    "shop_name": "BONIK"
  },
  "seller": "MARKETPLACE",
  "sponsored_type": null,
  "has_ripley_points": false,
  "ripley_points": null,
  "from_url": "https://simple.ripley.cl/search/lip?sort=relevance_desc&page=2"
}
```

Each product in the results returns a comprehensive record with 30+ fields:

#### Product Identification

| Field | Meaning |
|---|---|
| `SKU` | Stock keeping unit — unique product identifier |
| `Parent Product ID` | ID linking to the parent product (for variants) |
| `Code` | Internal Ripley product code |
| `Name` | Product display name shown on search results |
| `Description` | Short product description |

#### Classification & Categories

| Field | Meaning |
|---|---|
| `Brand` | Manufacturer or brand name |
| `Category Code` | Ripley's internal category classification |
| `Xcatentry Category` | Extended category taxonomy used in product routing |
| `Product Type` | Classification (e.g., electronics, apparel, home) |

#### Visual Assets

| Field | Meaning |
|---|---|
| `Primary Image` | Main product image URL (highest resolution) |
| `Images` | Array of all product image URLs |
| `Colors` | Available color variants (if applicable) |
| `Variants` | Size, color, or configuration options offered |

#### Pricing & Discounts

| Field | Meaning |
|---|---|
| `Price` | Current listed price in CLP (Chilean Pesos) |
| `Price Number` | Price as a numeric value (for calculations) |
| `Old Price` | Original price before discount |
| `Ripley Price` | Special Ripley member pricing (if available) |
| `Discount` | Discount percentage or amount |
| `Discount Sale Price` | Price after applied discount |
| `Has Initial Price` | Boolean flag indicating if an initial price exists |

#### Engagement & Social Proof

| Field | Meaning |
|---|---|
| `Rating Reviews` | Customer rating and review count (e.g., 4.5/5, 127 reviews) |
| `Has Ripley Points` | Whether the product awards Ripley Points (loyalty currency) |
| `Ripley Points` | Number of Ripley Points earned on purchase |

#### Promotions & Flags

| Field | Meaning |
|---|---|
| `Badges Top` | Badges displayed above product (e.g., "Free Shipping") |
| `Badges Middle` | Middle section badges (e.g., "Limited Offer") |
| `Badges Bottom` | Bottom badges (e.g., "Seller Rating") |
| `Sponsored` | Boolean — whether the listing is a sponsored ad |
| `Sponsored Type` | Type of sponsorship (if applicable) |

#### Seller & Logistics

| Field | Meaning |
|---|---|
| `Shop` | Ripley official shop or partner name |
| `Seller` | Third-party seller username (if applicable) |

#### Metadata

| Field | Meaning |
|---|---|
| `Position` | Product rank on the current search results page (1st, 2nd, etc.) |

***

### How to Use

1. **Identify search URLs** — Visit Ripley.cl, perform searches, and copy the result page URLs. You can include filters (price range, brand, rating) in the URL.

2. **Configure input** — Paste your URLs into the `urls` array. Set `max_items_per_url` to control the volume (e.g., 50 for light sampling, 200 for comprehensive data).

3. **Enable failure handling** — Set `ignore_url_failures: true` for bulk runs to prevent interruptions if a single URL fails.

4. **Execute the scraper** — Start the run and monitor progress in the actor log.

5. **Export results** — Download data as JSON, CSV, or Excel for analysis or integration.

**Best practices:**

- Use the `simple.ripley.cl` subdomain for more stable scraping
- Combine related searches in one run to maximize efficiency
- Include `max_items_per_url` limits to avoid timeouts on large result sets
- Test with one URL first before scaling to multiple pages

**Common troubleshooting:**

- If a URL times out, reduce `max_items_per_url` and retry
- If you receive empty results, verify the URL structure is correct (should contain `/search/` path)
- Use `ignore_url_failures: true` to skip problematic URLs in bulk runs

***

### Use Cases & Business Applications

- **Price monitoring:** Track product pricing across Ripley categories hourly or daily to detect trends
- **Competitor analysis:** Monitor competitor inventory, ratings, and promotional strategies
- **Market research:** Analyze product availability, brand distribution, and customer sentiment in the Chilean market
- **Product intelligence:** Build catalogs for price comparison sites or retail aggregators
- **Discount tracking:** Identify sales, promotions, and Ripley Points opportunities

The scraper's rich output enables advanced analytics: pricing elasticity studies, brand performance benchmarking, and seasonal trend analysis — all from a single data source.

***

### Conclusion

The **Ripley.cl Product Scraper** provides comprehensive e-commerce data extraction for anyone analyzing the Chilean retail landscape. With 30+ fields covering pricing, ratings, images, and seller information, it delivers the structured data needed for competitive intelligence, market research, and product analytics. Start today and unlock actionable insights from Ripley's extensive catalog.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the product search list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## `proxy` (type: `object`):

Select proxies to be used by your scraper.

## Actor input object example

```json
{
  "urls": [
    "https://simple.ripley.cl/search/lip?sort=relevance_desc&page=2"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "NL"
  }
}
```

# 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 = {
    "urls": [
        "https://simple.ripley.cl/search/lip?sort=relevance_desc&page=2"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "NL"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("stealth_mode/ripley-product-search-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 = {
    "urls": ["https://simple.ripley.cl/search/lip?sort=relevance_desc&page=2"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "NL",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("stealth_mode/ripley-product-search-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 '{
  "urls": [
    "https://simple.ripley.cl/search/lip?sort=relevance_desc&page=2"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "NL"
  }
}' |
apify call stealth_mode/ripley-product-search-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Ripley Product Search Scraper",
        "description": "Scrape product listings from Ripley.cl search results with precision. Collect pricing, ratings, images, variants, discounts, and 30+ fields per product — perfect for price comparison, market research, and e-commerce data analytics.",
        "version": "0.0",
        "x-build-id": "OaNMoTKhLugIyaKbW"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/stealth_mode~ripley-product-search-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-stealth_mode-ripley-product-search-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/stealth_mode~ripley-product-search-scraper/runs": {
            "post": {
                "operationId": "runs-sync-stealth_mode-ripley-product-search-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/stealth_mode~ripley-product-search-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-stealth_mode-ripley-product-search-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": {
                    "urls": {
                        "title": "URLs of the product search list urls to scrape",
                        "type": "array",
                        "description": "Add the URLs of the product search list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "ignore_url_failures": {
                        "title": "Continue running even if some URLs fail to be scraped",
                        "type": "boolean",
                        "description": "If true, the scraper will continue running even if some URLs fail to be scraped."
                    },
                    "max_items_per_url": {
                        "title": "Max items per URL",
                        "type": "integer",
                        "description": "The maximum number of items to scrape per URL."
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Select proxies to be used by your scraper."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
