> For the complete documentation index, see [llms.txt](https://docs.cuxial.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.cuxial.com/scripts/police-and-medical/cuxial-police/configuration.md).

# Configuration

How Cuxial Police stores its settings and what every section and option does.

Cuxial Police keeps its settings in the database and edits them from a tab of the tablet. This page explains how that works and what each option does.

## How settings work

| Where                                                 | What it is                                                        |
| ----------------------------------------------------- | ----------------------------------------------------------------- |
| `install/defaults/config.lua`                         | Factory values of the main settings                               |
| `install/defaults/police/`, `ems/`, `fib/`, `shared/` | Factory values of the data lists (permissions, radio, objects...) |
| Table `cuxial_police_settings`                        | The values the server really uses                                 |
| Settings tab of the tablet                            | Where you change them                                             |

On first start every section is copied from `install/defaults/` to the database. From then on the database is the only source: the files are read again only to restore a section.

{% hint style="warning" %}
Editing a file in `install/defaults/` does not change an installation that has already started once. Change the value in the settings tab. To bring a file edit into a running installation, restart the resource and use the factory values button of that section.
{% endhint %}

### The settings tab

The tab appears in the tablet for staff members: players with the `admin` permission of your framework. The player also needs a faction job, because only faction members can open the tablet.

| Action         | What it does                                                     |
| -------------- | ---------------------------------------------------------------- |
| Save           | Stores the section and applies it to the server and every player |
| Factory values | Restores the section to what `install/defaults/` holds           |
| Export         | Copies the customised sections to the clipboard as JSON          |
| Import         | Loads sections from that JSON                                    |

Most sections apply at once. These need a restart of the resource:

| Section                                                | Why                                                         |
| ------------------------------------------------------ | ----------------------------------------------------------- |
| `config.radio`, `data.radio`, `data.radioaudio`        | Frequencies and the audio effect are built once at start    |
| `data.keybinds`                                        | Keys are registered once at start                           |
| `fingerprint.closeKey`, `data.surrender` → `cancelKey` | They are keys                                               |
| `addons.fib.enabled`, `addons.fib.devices.items`       | The addon and its item exports are registered once at start |

{% hint style="info" %}
This page names each section by its id and gives the title you will see in the settings tab.
{% endhint %}

## Jobs and general

Sections `config.jobs` (Trabajos) and `config.general` (General).

| Option         | Type   | Default                                  | What it does                                                                                                                                            |
| -------------- | ------ | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `policeJobs`   | table  | `{ police = true }`                      | Jobs that belong to the police faction                                                                                                                  |
| `emsJobs`      | table  | `{ ambulance = true }`                   | Jobs that belong to the EMS faction                                                                                                                     |
| `factionJobs`  | table  | `police → 'police'`, `ambulance → 'ems'` | Job to faction map (`'police'`, `'ems'`). Filled in from the two lists above; federal jobs are added automatically. To remove a job, delete it here too |
| `bossLevel`    | number | `8`                                      | Grade from which a member counts as boss, besides the grades your framework already marks as boss                                                       |
| `cameraRadius` | number | `100.0`                                  | Radius in metres used to look for CCTV cameras around the officer                                                                                       |

## Tablet options and colours

Sections `config.appOptions` (Opciones de la MDT) and `config.theme` (Colores).

| Option                  | Type    | Default      | What it does                                                                           |
| ----------------------- | ------- | ------------ | -------------------------------------------------------------------------------------- |
| `appOptions.confiscate` | boolean | `true`       | Shows the seize option in the tablet and the quick menu. It only changes the interface |
| `theme.police`          | table   | configurable | Colours of the police tablet and HUD                                                   |
| `theme.ems`             | table   | configurable | Colours of the EMS tablet and HUD                                                      |
| `theme.fib`             | table   | configurable | Colours of the federal tablet and HUD                                                  |

Each theme has `accent` (required) and `light`, `dark` and `gradientTo` (optional). The three optional colours are derived from `accent` when they are left out. All of them are hex colours.

## Radio

Sections `config.radio` (Radio), `data.radio` (Canales de radio), `data.radioanims` (Animaciones de radio) and `data.radioaudio` (Audio de radio).

| Option                | Type    | Default               | What it does                                                                                |
| --------------------- | ------- | --------------------- | ------------------------------------------------------------------------------------------- |
| `radio.enabled`       | boolean | `true`                | `false`: players cannot join frequencies                                                    |
| `radio.defaultVolume` | number  | `1.0`                 | Radio volume a player starts with (0 to 1)                                                  |
| `radio.centralFreqs`  | table   | `DISPATCH`, `COMMAND` | Frequencies that work as command tier: they talk to every tactical frequency of the faction |

`data.radio` holds one list of frequencies per faction (`police`, `ems`, `fib`), grouped by category, and a `blips` table that gives a map sprite and colour to the members tuned to a frequency. The names in the default file are examples to replace.

`data.radioaudio` holds the audio effect. `proximityFxCutoff` (default `4.0`) is the distance under which a speaker is heard without the radio effect.

## Dispatch

Section `config.dispatch` (Central / avisos) and `data.gunshotwhitelist` (Disparos ignorados).

| Option                       | Type    | Default | What it does                                                                                   |
| ---------------------------- | ------- | ------- | ---------------------------------------------------------------------------------------------- |
| `dispatch.enabled`           | boolean | `true`  | `false`: gunshot alerts are not sent                                                           |
| `dispatch.ignoredJobs`       | table   | `{}`    | Jobs whose on-duty members do not trigger gunshot alerts. Accepts a list or a `job = true` map |
| `dispatch.sendAlertCooldown` | number  | `10`    | Seconds between two alerts sent by the same player through the client export                   |
| `dispatch.gunshotCooldown`   | number  | `5`     | Seconds between two gunshot alerts from the same player                                        |
| `dispatch.entornoCooldown`   | number  | `30`    | Seconds between two uses of `/entorno`                                                         |
| `dispatch.radioCodeCooldown` | number  | `3`     | Seconds between two radio codes from the same member                                           |

`data.gunshotwhitelist` is the list of weapon names that never trigger a gunshot alert.

## Fines and revenue

Sections `config.payment` (Cobros), `config.revenue` (Recaudación) and `data.paymentLocations` (Puntos de pago).

| Option                          | Type    | Default       | What it does                                                                                                                                |
| ------------------------------- | ------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `payment.enabled`               | boolean | `true`        | `false` turns the payment points and the payment commands off                                                                               |
| `payment.commands`              | boolean | `false`       | `true`: `/paymultas` and `/payfacturas` open the payment screen from anywhere. `false`: fines and bills are paid only at the payment points |
| `payment.payAccount`            | string  | `'bank'`      | Account charged first: `'bank'` or `'cash'`                                                                                                 |
| `payment.allowCashFallback`     | boolean | `true`        | Charges cash when the first account is short                                                                                                |
| `payment.bankFeePercent`        | number  | `0`           | Extra percentage added to the amount                                                                                                        |
| `revenue.enabled`               | boolean | `true`        | Sends what is paid to the faction account through `cuxial_banking`                                                                          |
| `revenue.police.societyName`    | string  | `'police'`    | Account that receives police fines                                                                                                          |
| `revenue.police.societyLabel`   | string  | configurable  | Concept shown in the account movement                                                                                                       |
| `revenue.ems.societyName`       | string  | `'ambulance'` | Account that receives medical bills                                                                                                         |
| `revenue.ems.societyLabel`      | string  | configurable  | Concept shown in the account movement                                                                                                       |
| `revenue.ems.commissionPercent` | number  | `30`          | Share of a medical bill paid to the doctor who issued it, if online                                                                         |
| `revenue.ems.commissionAccount` | string  | `'bank'`      | Account where the doctor receives the commission                                                                                            |

Each entry of `data.paymentLocations` is a point with `coords`, `heading`, `size`, `issuer` (`'police'` or `'ems'`), `label`, `icon` and `distance`. Two points ship by default, one for the police at Mission Row and one for EMS at Pillbox Hill; move them to your own buildings.

## Station points

Sections `config.stations` (Estaciones) and `config.stationNpc` (NPC de las estaciones). The list starts empty and is built in game with the editor of the settings tab.

| Field                         | Type    | What it does                                                         |
| ----------------------------- | ------- | -------------------------------------------------------------------- |
| `id`                          | string  | Unique identifier of the point                                       |
| `type`                        | string  | `'duty'`, `'stash'`, `'armory'`, `'mdt'` or `'event'`                |
| `label`                       | string  | Text of the interaction                                              |
| `coords`                      | vector  | Position, with optional heading                                      |
| `faction`                     | string  | `'police'`, `'ems'`, `'fib'` or `'any'`                              |
| `minGrade`                    | number  | Minimum grade                                                        |
| `onDuty`                      | boolean | Requires being on duty                                               |
| `distance`                    | number  | Interaction distance. `2.0` by default                               |
| `enabled`                     | boolean | `false` hides the point                                              |
| `slots`, `weight`, `personal` | stash   | Size of the stash; `personal = true` gives each member a private one |
| `items`                       | armory  | List of `{ name, price, count, grade }`                              |
| `event`, `server`             | event   | Event to trigger; `server = true` triggers it on the server          |
| `npc`                         | table   | Optional. Turns the point into an NPC (needs `cuxial_interactions`)  |

{% hint style="info" %}
Armouries need `ox_inventory`.
{% endhint %}

The `npc` table has `enabled`, `model`, `scenario`, `name`, `role`, `greeting` and `group`. Points with the same `group` share one NPC, with one button per point. Without `cuxial_interactions` the point stays a target zone.

`config.stationNpc` holds the defaults for those NPCs: `model`, `scenario`, `spawnDistance` (default `60.0`) and the lists of models and scenarios offered by the editor.

## Police tools

| Option                           | Section              | Default          | What it does                                                                   |
| -------------------------------- | -------------------- | ---------------- | ------------------------------------------------------------------------------ |
| `surrender.maxDistance`          | `config.surrender`   | `15.0`           | Maximum distance to ask a player to surrender                                  |
| `catear.cooldown`                | `config.catear`      | `5`              | Seconds between two pat-downs                                                  |
| `catear.maxDistance`             | `config.catear`      | `2.5`            | Maximum distance to pat down a player                                          |
| `ankle.tickMs`                   | `config.ankle`       | `3000`           | How often the position of an ankle monitor is sent, in milliseconds            |
| `ankle.placeDistance`            | `config.ankle`       | `3.0`            | Maximum distance to place a monitor                                            |
| `ankle.shockCooldownMs`          | `config.ankle`       | `5000`           | Minimum time between two shocks to the same wearer                             |
| `fingerprint.points`             | `config.fingerprint` | example          | Positions of the fingerprint scanners                                          |
| `fingerprint.interactDistance`   | `config.fingerprint` | `1.0`            | Distance to use a scanner                                                      |
| `fingerprint.broadcastRadius`    | `config.fingerprint` | `25.0`           | Radius in which the scan is shown to other players                             |
| `fingerprint.cooldown`           | `config.fingerprint` | `10000`          | Milliseconds between two scans                                                 |
| `fingerprint.closeKey`           | `config.fingerprint` | `'BACK'`         | Key that closes the scanner                                                    |
| `operations.allowedDurationsMin` | `config.operations`  | `{ 10, 20, 30 }` | Durations accepted for a map zone, in minutes. The tablet offers 10, 20 and 30 |
| `duty.pollIntervalMs`            | `config.duty`        | `2500`           | How often the positions of on-duty members are refreshed for distant blips     |
| `duty.moveThresholdM`            | `config.duty`        | `15.0`           | Metres a member must move before the position is sent again                    |
| `duty.orphanCleanupSec`          | `config.duty`        | `1800`           | Seconds after which a duty entry left open is closed                           |

The data lists of the police tools are edited as whole sections:

| Section                                              | Title in the tab                    | What it holds                                                                                       |
| ---------------------------------------------------- | ----------------------------------- | --------------------------------------------------------------------------------------------------- |
| `data.illegalitems`                                  | Objetos ilegales                    | Items a pat-down reports, as `{ name, label }`                                                      |
| `data.policeobjects`                                 | Objetos policiales                  | Catalogue of placeable props, by category                                                           |
| `data.traffic`                                       | Tráfico                             | Traffic control points: `maxPoints` (`24`), `radius`, `radiusMin`, `radiusMax`, colours and markers |
| `data.cuffs`                                         | Esposas                             | Cuff prop, animations and `maxDistance` (`1.5`)                                                     |
| `data.escort`                                        | Escoltar                            | Escort animation, attach offset and `maxDistance` (`1.5`)                                           |
| `data.lockpick`                                      | Ganzúa                              | Difficulty of the skill checks and `maxDistance` (`3.0`)                                            |
| `data.surrender`                                     | Rendición (datos)                   | Animations, `cancelKey` (`'X'`), `requestTimeoutMs`, `requestCooldownMs`                            |
| `data.cctv`                                          | Cámaras CCTV                        | Prop models treated as CCTV cameras                                                                 |
| `data.photo`                                         | Cámara (datos)                      | Camera prop, zoom, rotation and timings of the photo mode                                           |
| `data.vehicledata`                                   | Datos de vehículos                  | Names of vehicle classes and colours shown in the vehicle file                                      |
| `data.divisions`, `data.condecorates`, `data.badges` | Divisiones, Condecoraciones, Placas | Divisions, medals and badge templates of the police                                                 |

## Prison

Section `config.prison` (Prisión). It applies only when `rcore_prison` is not running.

| Option                 | Type    | Default | What it does                             |
| ---------------------- | ------- | ------- | ---------------------------------------- |
| `prison.monthSeconds`  | number  | `60`    | Real seconds one month of sentence lasts |
| `prison.jailCoords`    | vector4 | example | Where an inmate is placed                |
| `prison.releaseCoords` | vector4 | example | Where a released inmate appears          |

## EMS

Sections `config.medical` (Médico) and `config.appointments` (Citas y recepciones).

| Option                               | Type            | Default            | What it does                                                                    |
| ------------------------------------ | --------------- | ------------------ | ------------------------------------------------------------------------------- |
| `medical.reviveEvent`                | string \| false | `false`            | Client event triggered by medicines that revive. `false` uses the native revive |
| `medical.hospitalPhone`              | string          | example            | Number that sends the appointment SMS through `lb-phone`                        |
| `appointments.reminderMinutesBefore` | number          | `60`               | Minutes before the appointment when the reminder is sent                        |
| `appointments.defaultDurationMin`    | number          | `20`               | Default length of an appointment                                                |
| `appointments.noShowGraceMin`        | number          | `30`               | Minutes after the end of the slot before it is marked as no-show                |
| `appointments.noShowRegress`         | boolean         | `true`             | A missed cure appointment moves the cure plan one step back                     |
| `appointments.checkInEarlyMin`       | number          | `60`               | How early the patient can check in                                              |
| `appointments.checkInRadius`         | number          | `8.0`              | Metres from a reception within which check-in is accepted                       |
| `appointments.autoNextStep`          | boolean         | `true`             | Closing a cure appointment creates the next one of the plan                     |
| `appointments.autoBill`              | boolean         | `false`            | Bills the patient on closing, using `prices`                                    |
| `appointments.defaultHospital`       | string          | `'Medical Center'` | Hospital name written on new appointments                                       |
| `appointments.prices`                | table           | example            | Price per appointment type; `0` is free                                         |
| `appointments.receptions`            | table           | example            | Reception points: `coords`, `size`, `heading`, `label`                          |

## Federal agency addon

Section `config.fib` (Addon FIB), key `addons.fib`.

| Option             | Type    | Default                    | What it does                                                                     |
| ------------------ | ------- | -------------------------- | -------------------------------------------------------------------------------- |
| `enabled`          | boolean | `true`                     | `false`: the third faction does not exist. Needs a restart                       |
| `jobs`             | table   | example                    | Jobs that belong to the federal faction                                          |
| `label`            | string  | configurable               | Name of the agency                                                               |
| `caseNumberPrefix` | string  | configurable               | Prefix of the case number, followed by year and sequence                         |
| `clearance`        | table   | `0→0`, `1→2`, `2→4`, `3→6` | Minimum grade to see a case of each classification. The case team always sees it |
| `gangResource`     | string  | `'cuxial_gang'`            | Resource that provides the criminal organisations                                |

### Intelligence

| Option                       | Default | What it does                                                                                                                             |
| ---------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `intel.auto`                 | `false` | `false`: intelligence and heat rise only with the agency's work. `true`: police and gang activity also count, using `weights` and `heat` |
| `intel.manual`               | table   | Intelligence points per piece of work (suspect, confirmation, act, verified act, proof, place)                                           |
| `intel.manualHeat`           | table   | Heat points per piece of work                                                                                                            |
| `intel.manualCaps`           | table   | Maximum pieces of each kind that score per organisation; `0` is no limit                                                                 |
| `intel.maxIntel`             | `100`   | Top of the intelligence meter                                                                                                            |
| `intel.decayPerHour`         | `1.5`   | Intelligence lost per hour once the organisation is idle                                                                                 |
| `intel.idleHoursBeforeDecay` | `6`     | Hours without events before intelligence starts to drop                                                                                  |
| `intel.heatDecayPerHour`     | `3`     | Heat lost per hour                                                                                                                       |
| `intel.layers`               | table   | Intelligence needed to unlock each layer of the organisation profile                                                                     |

### Warrants and operations

| Option                   | Default                                           | What it does                                                               |
| ------------------------ | ------------------------------------------------- | -------------------------------------------------------------------------- |
| `warrants.durationHours` | `arrest = 72`, `search = 24`, `surveillance = 48` | Hours a signed warrant lasts                                               |
| `ops.requireWarrant`     | `true`                                            | Raids and seizures need an active search warrant                           |
| `ops.seizeStash`         | `true`                                            | The stash objective empties the organisation's real stash                  |
| `ops.seizeDirtyMoney`    | `true`                                            | The money objective seizes the organisation's dirty money                  |
| `ops.cooldownHours`      | `24`                                              | Minimum hours between two completed operations on the same organisation    |
| `ops.minSuccessRatio`    | `0.5`                                             | Share of objectives (0 to 1) needed for the operation to count as a strike |
| `ops.strikeLoyalty`      | `60`                                              | Loyalty the organisation loses in its territories after a strike           |

### Devices

| Option                      | Default                                                  | What it does                                                     |
| --------------------------- | -------------------------------------------------------- | ---------------------------------------------------------------- |
| `devices.items`             | `fib_camera`, `fib_mic`, `fib_gps`, `WEAPON_DIGISCANNER` | Item of each device and weapon used as detector. Needs a restart |
| `devices.models`            | table                                                    | Prop models offered when placing a camera or a microphone        |
| `devices.placeDistance`     | `4.0`                                                    | Maximum distance to place a camera or microphone                 |
| `devices.pickupDistance`    | `3.0`                                                    | Distance to pick up your own device and get the item back        |
| `devices.gpsAttachDistance` | `3.0`                                                    | Maximum distance to the vehicle to attach a tracker              |
| `devices.maxActive`         | `4` each                                                 | Active devices per agent and type                                |
| `devices.batteryHours`      | `camera = 48`, `mic = 24`, `gps = 72`                    | Hours a device works                                             |
| `devices.micRadius`         | `8.0`                                                    | Metres a microphone picks up                                     |
| `devices.gpsTrailMax`       | `240`                                                    | Trail points kept per tracker                                    |
| `devices.detector`          | `radius = 30.0`, `removeDistance = 2.0`                  | Range of the detector and distance to remove a device            |
| `devices.heatOnLost`        | `3`                                                      | Heat the organisation gains when it removes a device             |

### Dismantling requirements

The `dismantle` table is never sent to players. A requirement set to `0` (or `leader = false`) is switched off.

| Option                           | Default | What it does                                                                   |
| -------------------------------- | ------- | ------------------------------------------------------------------------------ |
| `dismantle.membersPct`           | `80`    | Percentage of the real members that must be confirmed                          |
| `dismantle.leader`               | `true`  | The real leader must be confirmed                                              |
| `dismantle.acts`                 | `30`    | Criminal acts recorded                                                         |
| `dismantle.actsMulti`            | `8`     | Acts with at least `actsMultiPeople` (`2`) confirmed members involved          |
| `dismantle.actsSolid`            | `15`    | Acts with a proof and a supervisor's approval                                  |
| `dismantle.evidence`             | `10`    | Physical evidence linked                                                       |
| `dismantle.zones`                | `1`     | Operation zones: territories with at least `zoneActs` (`5`) acts               |
| `dismantle.places`               | `2`     | Places located                                                                 |
| `dismantle.manualActsNeedVerify` | `true`  | An act counts only after approval                                              |
| `dismantle.verifyNotCreator`     | `true`  | Whoever records an act cannot approve it                                       |
| `dismantle.maxManualActsPerDay`  | `5`     | Acts recorded per day and organisation                                         |
| `dismantle.evidenceResource`     | `''`    | Evidence resource whose cases can be linked as proof. `''` leaves only reports |
| `dismantle.videoDomains`         | `{}`    | Domains accepted for video proofs. Empty accepts any                           |
| `dismantle.requestNoteMin`       | `20`    | Minimum characters of the request note                                         |
| `dismantle.requestCooldownHours` | `24`    | Wait before requesting again after a denial                                    |

## System

| Option                                            | Section            | Default             | What it does                                     |
| ------------------------------------------------- | ------------------ | ------------------- | ------------------------------------------------ |
| `photo.uploadUrl`                                 | `config.photo`     | configurable        | Address photos are uploaded to                   |
| `photo.maxWidth`, `photo.maxHeight`               | `config.photo`     | `1280`, `720`       | Maximum size of a photo                          |
| `photo.uploadTimeoutMs`                           | `config.photo`     | `15000`             | Milliseconds before an upload is given up        |
| `retention.plateChecksDays`                       | `config.retention` | `30`                | Days plate checks are kept                       |
| `retention.usageLogDays`                          | `config.retention` | `7`                 | Days the medicine usage log is kept              |
| `retention.dispensationsDays`                     | `config.retention` | `180`               | Days pharmacy dispensations are kept             |
| `limits.maxBillAmount`                            | `config.limits`    | `10000000`          | Highest amount of a fine or bill                 |
| `limits.maxSentenceMonths`                        | `config.limits`    | `1200`              | Longest sentence, in months                      |
| `limits.maxPenalPrice`                            | `config.limits`    | `10000000`          | Highest fine of a penal code article             |
| `limits.maxTextLen`, `maxTitleLen`, `maxShortLen` | `config.limits`    | `5000`, `120`, `32` | Maximum length of notes, titles and short fields |

Grade permissions (`data.permissions`) and keys (`data.keybinds`) are covered in [Commands & permissions](/scripts/police-and-medical/cuxial-police/commands.md).

## Language

The language follows the `ox:locale` convar. The texts are in `locales/en.json` and `locales/es.json`, and both files can be edited.

## Common changes

### Add a second police job

In the settings tab, section `config.jobs`, add the job to `policeJobs` and to `factionJobs`. The result is equivalent to:

```lua
policeJobs = { police = true, sheriff = true },
factionJobs = { police = 'police', sheriff = 'police', ambulance = 'ems' },
```

### Change the colour of a faction

In section `config.theme`, set only the accent and let the rest be derived:

```lua
theme = {
    police = { accent = '#3b82f6' },
}
```

### Make sentences longer

In section `config.prison`, one month of sentence lasting five real minutes:

```lua
prison = { monthSeconds = 300 }
```

### Turn the federal agency off

In section `config.fib`, set `enabled` to `false` and restart the resource.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.cuxial.com/scripts/police-and-medical/cuxial-police/configuration.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
