{
  "openapi": "3.1.1",
  "info": {
    "title": "Focus Room API",
    "version": "1.0.0",
    "summary": "Deterministic tools for people and AI agents.",
    "description": "Every endpoint performs the same calculation as the human page and returns inputs, result, units, assumptions, sources, warnings and computedAt. MCP endpoint: /mcp."
  },
  "servers": [
    {
      "url": "https://focusroom.usefulweb.app"
    }
  ],
  "paths": {
    "/api/v1/tools": {
      "get": {
        "operationId": "listTools",
        "summary": "Catalog of all tools",
        "responses": {
          "200": {
            "description": "Tool list.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/{id}": {
      "get": {
        "operationId": "getTool",
        "summary": "Definition of one tool",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "focusroom-playlist-render",
                "focusroom-focus-timer",
                "soundscape-ambience-generator",
                "soundscape-noise-generator",
                "soundscape-reverb"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Tool definition.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "404": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/focusroom-playlist-render/calculate": {
      "post": {
        "operationId": "calculateFocusroomPlaylistRender",
        "summary": "Mix a playlist of generated ambience scenes with crossfades and master effects into a WAV.",
        "description": "Renders a playlist of generated ambience scenes — Focus Room presets such as brown noise, light rain or a surf-like swell, and the generated Soundscape Atlas worlds — one after another with equal-power crossfades, then runs the master effects: low cut, high cut, an 8-band graphic EQ, room reverb, stereo width, volume and a gentle soft limiter. Paste scene lines or a whole Focus Room (JSON or share link). The result is a 16-bit stereo WAV file with a timeline of the scenes and the EQ curve; the Focus Room app uses the same renderer, so both give identical files.\n\nMethodology:\n- Each scene is a Soundscape Atlas scene rendered by the shared audio engine exactly like a Soundscape WAV export: seamless loops of the noise and ambience generators (seeded), layer gains, equal-power pan, filters, slow automation curves and the scene’s own room. Layer fade-outs are switched off, as in live playback.\n- Scenes follow each other on one timeline; scene n + 1 starts one crossfade before scene n ends (at most half of the shorter scene). The overlap uses equal-power gains — outgoing cos(uπ/2), incoming sin(uπ/2) — so the summed power of two unrelated ambiences stays constant. The last scene fades out the same way.\n- Master chain in this order: high-pass (low cut) and low-pass (high cut), both 12 dB/octave Butterworth biquads; eight peaking biquads at the ISO octave centres 63 Hz – 8 kHz with Q 1.41 (Robert Bristow-Johnson’s Audio EQ Cookbook, the same formulas as the Web Audio BiquadFilterNode); room reverb (Freeverb-style, preset reverberation time, mono input); mid/side stereo width; volume; and a soft limiter (tanh above 80 % of a 0.98 ceiling).\n- The mix is written as 16-bit PCM WAV. The Focus Room app plays the same chain live with Web Audio nodes whose coefficients equal these biquads.\n\nAll sounds are synthesized; names such as “surf-like swell” or “coffee-shop-like murmur” describe what filtered noise imitates, not recordings. This is not a medical or hearing device; keep the volume comfortable.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "focusroom_playlist_render",
        "x-owner-app": "focusroom",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FocusroomPlaylistRenderInput"
              },
              "examples": {
                "example1": {
                  "summary": "Three study scenes, 20 seconds each, warm sound",
                  "value": {
                    "items": "brown-noise 20\nrainy-study-room 20\npink-rain 20",
                    "secondsPerItem": 20,
                    "crossfade": 6,
                    "fx": "warm",
                    "sampleRate": "44100"
                  }
                },
                "example2": {
                  "summary": "The “Ocean floor” room shortened to 15 seconds per scene",
                  "value": {
                    "project": "{\"format\":\"focus-room\",\"version\":1,\"name\":\"Ocean floor\",\"playlist\":{\"items\":[{\"id\":\"I1\",\"name\":\"Submarine\",\"minutes\":25,\"preset\":\"submarine\",\"scene\":null},{\"id\":\"I2\",\"name\":\"Surf-like swell\",\"minutes\":25,\"preset\":\"surf-like-swell\",\"scene\":null},{\"id\":\"I3\",\"name\":\"Cavern drips\",\"minutes\":25,\"preset\":\"cavern-drips\",\"scene\":null}],\"shuffle\":false,\"shuffleSeed\":1,\"repeat\":\"all\",\"crossfadeSeconds\":15},\"fx\":{\"volumeDb\":-3,\"lowCutHz\":180,\"highCutHz\":3500,\"eq\":[0,0,0,1.5,0,-2,0,0],\"room\":\"hall\",\"roomAmount\":1.2,\"width\":0.7,\"limiter\":true},\"visual\":{\"background\":\"caustics\",\"seed\":3,\"theme\":\"auto\",\"speed\":1,\"fps\":30,\"reactive\":false,\"clock\":true,\"clock24\":true},\"timer\":{\"mode\":\"pomodoro\",\"focusMinutes\":25,\"shortBreakMinutes\":5,\"longBreakMinutes\":15,\"longEvery\":4,\"cycles\":4,\"chime\":\"bell\",\"chimeDb\":-12,\"breakDuckDb\":-6},\"sleep\":{\"minutes\":0,\"fadeMinutes\":10}}",
                    "secondsPerItem": 15,
                    "sampleRate": "44100"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FocusroomPlaylistRenderResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/focusroom-focus-timer/calculate": {
      "post": {
        "operationId": "calculateFocusroomFocusTimer",
        "summary": "Plan Pomodoro, 52/17 or custom focus blocks and export them as a calendar file.",
        "description": "Turns a focus routine into a concrete schedule: Pomodoro (25-minute blocks, 5-minute breaks, a 15-minute break after every fourth block), 52/17, or your own lengths. Enter a start date and time to get every focus block and break with clock times, the total focus and break time, and an iCalendar (.ics) file with one event per block — optionally with breaks and a reminder — that any calendar app can import. The Focus Room app uses the same planner for its timer and its calendar export.\n\nMethodology:\n- Pomodoro: 25 minutes of focus, 5-minute short breaks and a 15-minute long break after every fourth block (the lengths of Francesco Cirillo’s technique). 52/17: 52 minutes of focus and 17 minutes of break (the ratio DeskTime reported in 2014). Custom uses your lengths.\n- There is no break after the last block. Times are added in whole minutes to the local start; there are no daylight-saving jumps because the calendar file uses floating local times (no time zone), which calendar apps show at the same wall-clock time.\n- The .ics file follows RFC 5545: one VEVENT per focus block (busy) and optionally per break (free), with a display reminder when requested; lines are folded at 75 octets. UIDs and DTSTAMP are derived from the plan, so the same input always gives the same file.\n\nFocus routines are conventions, not medical advice. Take longer breaks whenever you need them.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "focusroom_focus_timer",
        "x-owner-app": "focusroom",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FocusroomFocusTimerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Four Pomodoros from 9:00 with a 1-minute reminder",
                  "value": {
                    "mode": "pomodoro",
                    "cycles": 4,
                    "start": "2026-11-16T09:00",
                    "alarmMinutes": 1,
                    "title": "Focus block"
                  }
                },
                "example2": {
                  "summary": "Three 52/17 blocks in the afternoon, breaks included",
                  "value": {
                    "mode": "52-17",
                    "cycles": 3,
                    "start": "2026-11-16T13:30",
                    "includeBreaks": true,
                    "title": "Deep work"
                  }
                },
                "example3": {
                  "summary": "Custom 45 / 10 with a long break after three blocks",
                  "value": {
                    "mode": "custom",
                    "cycles": 6,
                    "focusMinutes": 45,
                    "shortBreakMinutes": 10,
                    "longBreakMinutes": 30,
                    "longEvery": 3,
                    "start": "2026-11-17T08:00",
                    "title": "Study"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FocusroomFocusTimerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/soundscape-ambience-generator/calculate": {
      "post": {
        "operationId": "calculateSoundscapeAmbienceGenerator",
        "summary": "Synthesize rain, wind, water, fire, room hum or a drone as a seamless-loop WAV.",
        "description": "Creates procedural background sound — rain with individual drops, gusty wind, a bubbling stream, a crackling campfire, room tone with mechanical hum, or an evolving drone — as a seamless-loop WAV. Every layer is synthesized from seeded noise and oscillators (no samples), with intensity, brightness and character controls and an optional room reverb.\n\nMethodology:\n- Rain: a pink-noise bed band-limited by the brightness, plus raindrops as a Poisson process (rate = drops per second × intensity), each a short decaying, slightly falling sine with a click, at a random stereo position.\n- Wind: pink noise through a band-pass filter whose centre frequency, sharpness and level follow a gust envelope made from three smoothed random curves (about 8 s, 2.5 s and 0.8 s), plus low rumble; the right channel hears each gust 0.25 s later.\n- Stream: four noise bands (≈300 Hz–4 kHz, lower for larger water) with fast random level changes, plus bubbles: short sines with rising pitch, as in physically based liquid-sound models.\n- Fire: low brown-noise roar and airy hiss with flicker, plus clusters of very short noise bursts (crackles) and occasional low pops. Hum: fundamental and harmonics with a 1/k^p roll-off (odd harmonics stronger) over low-passed pink room tone. Drone: band-limited (polyBLEP) sawtooth voices on root, fifth and octave, detuned, through a low-pass filter moved by slow LFOs.\n- Seamless loops: noise-like parts are rendered longer and the tail is crossfaded (equal power) onto the start; periodic parts (hum, drone, LFOs) are rounded to whole cycles per loop so they repeat exactly. Optional room reverb (Freeverb structure) is applied before looping, with a warm-up so the loop start is already reverberant.\n\nThese are synthesized impressions of natural sounds, not field recordings. Start playback quietly.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "soundscape_ambience_generator",
        "x-owner-app": "soundscape",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SoundscapeAmbienceGeneratorInput"
              },
              "examples": {
                "example1": {
                  "summary": "Steady rain, 6 s seamless loop",
                  "value": {
                    "kind": "rain",
                    "duration": 6,
                    "sampleRate": "44100",
                    "intensity": 0.6,
                    "density": 150,
                    "brightness": 0.5,
                    "seed": "1"
                  }
                },
                "example2": {
                  "summary": "Gusty wind in an open forest, 6 s",
                  "value": {
                    "kind": "wind",
                    "duration": 6,
                    "sampleRate": "32000",
                    "intensity": 0.7,
                    "gustiness": 0.8,
                    "pitch": 0.4,
                    "room": "forest",
                    "seed": "storm"
                  }
                },
                "example3": {
                  "summary": "Campfire with lots of crackles, 5 s mono",
                  "value": {
                    "kind": "fire",
                    "duration": 5,
                    "sampleRate": "44100",
                    "channels": "mono",
                    "intensity": 0.6,
                    "detail": 0.8,
                    "seed": "7"
                  }
                },
                "example4": {
                  "summary": "Server-room hum on 60 Hz mains, 4 s",
                  "value": {
                    "kind": "hum",
                    "duration": 4,
                    "sampleRate": "22050",
                    "frequency": 120,
                    "partials": 10,
                    "brightness": 0.6,
                    "roomToneDb": -18,
                    "seed": "1"
                  }
                },
                "example5": {
                  "summary": "Evolving drone in a hall, 8 s",
                  "value": {
                    "kind": "drone",
                    "duration": 8,
                    "sampleRate": "32000",
                    "frequency": 55,
                    "partials": 5,
                    "detuneCents": 12,
                    "motion": 0.6,
                    "lfoRate": 0.25,
                    "room": "hall",
                    "seed": "1"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SoundscapeAmbienceGeneratorResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/soundscape-noise-generator/calculate": {
      "post": {
        "operationId": "calculateSoundscapeNoiseGenerator",
        "summary": "Make white, pink, brown, blue or violet noise as a WAV file and check its spectrum.",
        "description": "Generates coloured noise with the correct spectral slope (white 0, pink −3, brown −6, blue +3, violet +6 dB per octave) as a downloadable WAV, mono or decorrelated stereo, 8–96 kHz, with level, fades, seamless looping and a seed for repeatable files. The measured spectrum, slope and levels are reported so you can verify the colour.\n\nMethodology:\n- White noise: Gaussian random samples from a seeded sfc32 generator (Box–Muller), so the power spectrum is flat.\n- Pink noise: white noise through a cascade of first-order pole/zero filters designed for the chosen sample rate (a pole every two octaves from 5 Hz, a zero half-way between), which averages −10 dB per decade = −3 dB per octave within about ±0.3 dB.\n- Brown noise: a leaky integrator (corner 10 Hz, so it never drifts) gives −6 dB per octave; blue noise inverts the pink filter (+3 dB); violet noise is the first difference of white noise (+6 dB per octave below about a quarter of the sample rate).\n- The level is set as RMS over all channels; if the highest peak would exceed −0.1 dBFS the gain is lowered and reported. Fades use an equal-power (sine) curve. Seamless loops render extra noise and crossfade it onto the start.\n- Check: the result is analysed with a Hann-windowed 4096-point Welch spectrum; the slope is a least-squares fit over 1/3-octave bands from 100 Hz to 10 kHz (or a quarter of the sample rate).\n\nStart playback quietly: noise at full level can damage speakers and hearing. Noise is not a medical sleep or tinnitus treatment.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "soundscape_noise_generator",
        "x-owner-app": "soundscape",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SoundscapeNoiseGeneratorInput"
              },
              "examples": {
                "example1": {
                  "summary": "Pink noise, 5 s stereo, 44.1 kHz",
                  "value": {
                    "type": "pink",
                    "duration": 5,
                    "sampleRate": "44100",
                    "channels": "stereo",
                    "level": -18,
                    "seed": "1"
                  }
                },
                "example2": {
                  "summary": "Brown noise, 4 s mono loop at 48 kHz",
                  "value": {
                    "type": "brown",
                    "duration": 4,
                    "sampleRate": "48000",
                    "channels": "mono",
                    "loop": true,
                    "level": -20,
                    "seed": "sleep"
                  }
                },
                "example3": {
                  "summary": "White noise test signal, 2 s mono, 32-bit float",
                  "value": {
                    "type": "white",
                    "duration": 2,
                    "sampleRate": "48000",
                    "channels": "mono",
                    "level": -12,
                    "fadeIn": 0,
                    "fadeOut": 0,
                    "encoding": "float32",
                    "seed": "42"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SoundscapeNoiseGeneratorResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/soundscape-reverb/calculate": {
      "post": {
        "operationId": "calculateSoundscapeReverb",
        "summary": "Add room, hall, cathedral or cave reverb to a WAV file with a known reverberation time.",
        "description": "Applies a Freeverb-style stereo reverb with room presets (small room, living room, studio, concert hall, cathedral, cave, open forest) to an audio file. The reverberation time (RT60) is set exactly per preset or by you and measured on the impulse response; the reverb tail is kept by default.\n\nMethodology:\n- Freeverb structure (Jezar, public domain): per channel eight parallel comb filters with a low-pass in the feedback loop (damping) followed by four series all-pass filters; the right channel’s delays are 23 samples longer for a wide stereo image. Delay lengths are scaled to the sample rate.\n- Unlike the original “room size” knob, each comb’s feedback gain is computed from the reverberation time: g = 10^(−3·delay / (sample rate × RT60)), so every comb decays by 60 dB in RT60 seconds at low and middle frequencies; damping makes high frequencies die away sooner, as in real rooms.\n- The RT60 is verified by measuring the reverb’s impulse response with Schroeder backward integration (T20: the −5 to −25 dB part of the decay, extrapolated to −60 dB).\n- Mono input becomes stereo. With “keep the tail” the file is extended by about 1.2 × RT60 plus the pre-delay so the reverb can fade out. If long reverbs on sustained sounds build up above full scale, the whole result is turned down to a −1 dBFS peak instead of clipping (reported as gain reduction).\n\nRoom presets give typical reverberation times for such spaces; they do not simulate a specific real room’s geometry or early reflections.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "soundscape_reverb",
        "x-owner-app": "soundscape",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SoundscapeReverbInput"
              },
              "examples": {
                "example1": {
                  "summary": "Clap in a concert hall",
                  "value": {
                    "file": {
                      "filename": "clap.wav",
                      "contentType": "audio/wav",
                      "contentBase64": "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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                    },
                    "preset": "hall",
                    "keepTail": true
                  }
                },
                "example2": {
                  "summary": "Two tones in a cathedral with only the reverb (dry 0)",
                  "value": {
                    "file": {
                      "filename": "two-tones.wav",
                      "contentType": "audio/wav",
                      "contentBase64": "UklGRmQfAABXQVZFZm10IBAAAAABAAEAQB8AAIA+AAACABAAZGF0YUAfAABnAAEonjkeMoMh+hnyIhIwWS08ENDmHsj6wp3T1OUH6KjchNVb5IgIIjC/Q1s8oCURFYgWxx8RH98Fut4bv3e5zMxe5sXxzO1V5yPyixEmNrFJq0DsJXYNngYPDagOCPuW2I26x7XUy//qOv/q/+r5nP5fF+Y4lEtDQvQikgMh9YX55v2P8enUfblOtF7L//BmC9oRuwruCu8aazdhSFA/HB3490Xk4OWi7gXrNtbovsW5rNFo+YwZgyQoHHEUrxw2MutA0jdEFvftgtVN1eziIefG2wnJNsXL2u8CTidZNNYquhtCGiYoLzQWLUQN5uKyyA3HWdjp5TrjydZr0lvlxQxvMuBAQDbzIGYVnxvZJewgUwNq28u+nr2F0g/pR+/z5kniIfEWFUM5IUn1O2shCQ5rC8wSShEf+YrU87hLt5LPVO13/Nj5dPW4/YUbuj3ITAs/GSDyA4/6d/9ZAufwetHlt3u23dBw82MMtg1QBu0Iox4sPAdLaTxGGjf4DukZ7arzaOs40gm8z7vy1Vj9RxksH2MWSRLHH5o3tEQQOKUTR+z/1y/bF+dx55rXtsMIw0Dd2wVEJnwvAiVZGXQd9C1BOZMtiwnc4LbJv8zT3Pfl9d4X0HvPIOc1DzQyHjwKMIEdZhbBID0qiyBKAHHXjL5Owc/Waeh86vbfbd6+8cYYBDwpR4U45B5pDicRjRlBE7/2WtA5t1G6+dLG7Fv3QPEf7uv8Eh41PyFLRjo8G5EDjf8YBnIDru4Oza+0MLi/0wD1ugcFBgEAvwi7IndASEt/OWwWCfgD7azy4vU16EzN27dhu2fZBP+QFqEYURAPEegizDvQRrY0dQ+u65vc0eLg6gjmBdKgv4XCCeCcCLAlnSosH2MXzSCHM+48byw+BsLf7cxE0gnhX+X+2RjLZc1+6DkT6zJMOX4qVRslGjQncC/2IFP9htWnwN3GOtvQ6GLmntrp2rjz3BuGPJBDzTFwGjcQ4RYnHpITPvPMzJW35r6c18TtsfL06/rqrv5uImRCeEkaNmAYQgUyBB4LvATV6v7IzrL3uiLYgvanAof+NPs+CLgmVkMFS6Y18xIk+Nrywvl4+eHmI8nYtRW95tyhAPwT3xI4CyURZCfJQE9HLzLuC6XrFuHR6LruvuR6zMG7zcKF44gLXCRiJUIapxfrJNE5wz8ZKzwDnt+/0BvY/eTt5M3UbsbhzGfsjBUMMgQ0VCXnGdUedi27MoQgLPrK04/Cbsw733LopOD/1I7ZFPYEH+49pECjLiwaYBXtHbYjShQV8MLKErniw+Xbke2W7ZflA+e6/6klvkJPR5AxVRYUCKkLMhKcB/bpbcaitD6/Idx59tH+//j099AJnCp4RkhKsjJDEXv75fk6AHP7IOSlxI60wr+i4NMBtxBIDOsGbBGrLCpFaUjDL6UIh+xy5j7uC/BL4eTImLl1xKnnJg4KIi4gahYZGEMqWD9uQmkprAC33zfWr94V6HTiEtCawhvMl+8rGKIwYi9UIRAaRSMRMzc2oR5s9fXRLMYh0TziO+Yo20/QG9lX+awjID0YPNUp3RjiGP4kVCizE4Ht2sgsvOrIB+Ag7eHpQuFx5moE7SrCRQdFyi1SFV0MfxJ1Fv0H5uUmwgC0KMMl4Lz15/nG8n30/wv8LodIZEcYLuYOjP2Z/3kEXvvE3z6/c7KjwYLkRgKbC50FFAOuEm0wR0ewRjIqdgUK7ubr3vOz8XDeDMM5tmXFPuo6Dd4dVRlWEcoXfC6AQ0tC+yQ5/C/fk9lT487ord3NyFm+zczP8jUadC36KDkcMRkvJyQ4ETc4HAXyANKjylLXn+Rw46fUncu72Lv8mSSPOlU2ESQoGHgdkilfKj4RKemEx42+cs0w4p/qz+Me24vlQQaHLRBFr0CiKMAUoxCGGfcaSgcQ4qPAd7dMyN7jNfVM8/PrPvEWDW4ygElZRcgp0wzmAWUGZwnn+6fbpL2Ks7HGp+f9ABAG7f5jAMgUczQmSTVEaSbkA0rx9/EO+Xrx6tgkvo20oMgj7uEMuhekEbkM+xj7MadFTkDjII75g+D532PpkerK2rvD8bsC0Aj2vRn3KA4jzBcgGpksLj2sOCQaR/EN1FfQRd2b5h/g/c6Zx3DZ/f/LJvs3ijFjIMMZLiMuMcYsQhDc5vDHhMKw0xjl1+cn3f7W1OW1CpEw50JDOzcksxQ5FkgfOx0lBSne9b75uULNiubg8o3ukecQ8qoQujXSSUlBCCZfDdkG4wzKDTH7a9jwuju1J8sn61j/0gBw+VD/DxhXOcpLL0OQI2QEwPXM+cn9r/KB1VG6srW2zHnxBQ1tE7gM+AvZHGI4dEkrQGIerPlj5T3nYO9D60nXHr7xuSzRKvmWGYgjQxwwFEMc7zC6P5I2aRV57YfUBtWQ4YfmNNtFyNvD39kKAqEmvTPrKuUbZBmTJ0E0JizjC5riz8e+xnLX/eX24x7W89G+5U0MFDJJQeg1dCGfFsUbrCW4H9ECIdpTvmy9CtIL6H/usOeG42nz4xRFOqNJ7j3lIsYOzwyZE7EQc/mh1Im4XbauzsXrUPtM+Qn06v02G+09nEwNQE4f8AKw+T//mQEO8dvRzLdRtkrQFPNYCq0LawVqCPQeZjzpSq08EhoI+EPpWuzI8jTqJNK7ugG6itS8+98YAh/TFdQRTh/6NmFE/zYpEqjrbtc124/lZOYv1kLDr8I33WUGkSd7L9kk7hkHHcctzzhWLdMJc+GAytXM19xv5trfM9Hjz33ntg+3MiY+dDAuHp0YVCEwKlkgYQAB2GO/F8KB1kboWepW4eXehvIvGd46lkYoOGkejw+eEfUZqhP59sTQ9rcqu//TJO6m+IDzuO9h/g4gDEFvTKA7LBziBEAAqAYgBQTwws4Itq257NQN9qQIBAcoARwJgyPvQG5MHTp1Fkb4jO4s9G/2uunSzsm45Lte2Uf/VhdNGc0Q2xFUI2M8JEZ8NckPnuvB3B7jjeuv5tTSwr9Uw9Tg8AmfJqQrZSA1GGMhATQcPQgsdgbu3qLLhtEy4Hzl7dk1y9vNvelfEzsz/jihKqEbIhuHJ+MvEyFv/YDU5cBrxvTaceiO5QLauNqx8zccxDzjQ8AyXRtnEegWsB69FJbzys2zuOO+xdg078T0+uzZ63D/xiNmQlFKjDa9GBUGgAVvDN0GQOzHyUu1wrvX2Or2/gIT/5f67gcbJsFD4krwNJgSiPjg8iX6BPo55lLJWbWdvZ7dBAHuE2MTxwznEp0ok0FdR8cx/wv9697hi+iz7gDkAc3mu0XDeeQKDDUk0CUYGpAW3CQcOWQ/uymxAo7fwtA22P7jyeNg1Q7Hms397GQW4zHENDQmoRpkHvos7TJ2H6v5e9Myw2jMit/b6Dridta12l73/R+jPXdANC5AGhEVGB4xJPQUJvGmy2G578Mi3R3vVu8y54Xp3ADYJytFykiEMwYXaAmrDIUTvgju6SzFZrTfv3jd2vcw/5b5IvklCr4rEUd1StIy4xD0+pj57P9U+8fjPsT1sty+RuDjAUkQ5AwvCH0RcSy3RV1Iny/KCIHsNuZ87gfw8uCox9+4scRO55sNeyECHzsVIRbCKDQ+0UCXJ7b/RN9v1T/eqOew4U/PzcG4zJDvYxjgL2wuGiAtGSUjcjP9NfwexfZ80kDHFNLx4vPmU9vkz7nYpPmqIqQ8YDthKe8X8Bg9JH8nGxTT7LTIWrvfx3rfUew86MDgkeZ5A8Yq40WkRCUuxBUnDUgSmhbgB1Lm3cLltO3CKOCc9Xv55vFj9BILuS7YSOBHqC3XDb78G/9jBXr8bN+4v9yxVcKr42MBQguWBIUCjRHML1tHtkbTKs0FF+6l64TzgfHQ3UfCb7Y5xmzqmAw1HLQXDhGtF+kuA0OeQVUl3f2E4AfbPeWv6n/e6Mnrvn3NA/ONGvMsiylRHCAZkyc6OFM3ZhvM8YXRccpq1rXj1OIG1KHKpddf/Awk6jqINrMjnRgyHiwqNCrpEaXpwcckv2bNBuOD6njjcts15tAGLi8yRhtBmykhFMgQlBnpGmgHUOL+wIW24sdj44b0j/RT7d/yPg4ZM2VKxUSEKTYOOAIvBksKKv1O3Wm9frNZxzboEwG4Btr/5wHSFbw1mEs+RqIohAWU8mPzqvp38+baUr/rtSLKvu7jDmkZRhPdDqkadDNGRydCjiIW+yvig+D66fXq7drTxAW9h88w9j8blilGI1QYVhvpLMg9qThIGjXxodRP0fjdPOd54ADQW8io2RQA1SY+OJgwLiBfGUcjOjC6LCkQoeZXyBbE69QQ5uPo292/1pflxQlJMShEjzvBJCwUvRXOH2YeSgWy3di+sLlxzEfmkPKk7V/nKfLQEUI2OEqgQf8lOQ31Bq0Mow3q+zLYjLqPtGHK1eof//L/W/qA/5kYoTk/TCNCcSP3AzX2Hfqg/XLygtYwu6C1NM0S8c0MdhMwDXUMZRykN/9Ivz9zHg35neV95uvuNOvR1j+/JrrJ0an5sRleJB8cxBMPHGkx/0BrOOwVCO2Z1U7VIeG65nbbK8hgxJzaZgL8Jqg0mioZHMgarSfVNL8tgg1H5LHIMcej10PmcOOS1k/SruUHDBAxwkDdNd4gVRX2GxkmKiCSAyPb/L0LvTrRr+eW7o3n8uJm8d8UVDkFSfk8lyG8DWQLxRJsEI74btRGuM+3ONBr7ev7OfkW86D9ZRqgPLlLrj5cHoUC3Pk3/wQCIPFB0UK3SraJz43zhArFDAYGDQpdH988P0saPsoZQPe36PjsNvNE64zSsrtJu87VnvxXGSYfoRZ8EnsgMDglROk2aRKU6zDYPtuO5jfns9amxJrD6N19BpYn+y9+JfcZQB6eLm45Xy1PCm/hAcs7zbjcIubN3j3Q/84651IQgDOIPbIvlB3RFz8gKCrlIMj/eda1va/AWtU26NXp09/N3e/xLhhwOwFHvTepHf0O/BDVGMES9/V90Eu3JLvC04ztFfhs84vv3f3PHktAOEzSOzQcJgWJAH0GdwSL7tDMErUeuAbUZ/WqBwgGaQDmCHgj3UDSSxA6PRY3+Ifu0vOJ9mfp/MxKt1u6YNfl/S0XFxgqEIsQuiI1PDBGajSuDozq1dtE4WjqSuXg0Km++8HW3/8IuCV5KvEeRBi3Iac01j2zLN0GN9/hzBrTguEn5kfancuWzcjpQRNcMx854Cp8G1wbBijTLokhof2x1b3AbsaG24boM+VK2hnb0/O4G1s82EKaMikcexFZFyUfaxM89P7NLrk3v+XYOe+Z9EvsAuu5/lQjm0JWSu422xmFBugF6QxTB+nsh8kztL26Ldnt9vQD4f/G+5EIMifmQ/RLtzatE9T5dfPg+jj6Hec0yeq1+L023R8CRRXFE4IMbRFqJyBB70eDMqQL5+s64X/oM+4G5OLMSrwUw7rjGwzeJE0ljRv9F8AkRTkJP/Eq2wLH3hjRkNj35PbjRtTJxYHMhuy1Fs0yEzUIJnkZHB7TLTg02iB0+rHTlsMNzYff9+cB4e/VV9rK9pkfgj3hQDEuihnOFJMdAyS/FKHwqMo2uX3Dwts67lPvteYN6Q0B6CYmRZ9IgzJZGHcKBQ1jE2MIfumsxWe0PL/c2wv34f9t+eH3DwoQKwdHnElhMvkQCfw++aX/u/ub437Eh7N4vingiAFpD9gLUAaaECUr/kTeR9Muxwly7Jzmo+738bzit8j0uTzFwOdaDR0iEyC7FdcXIilvPstA3yeh/03fjNVr3j3oXOKTz1DDDc6d8LcZADF4MLkg6BkMI9Uz9jbBH9X2hNOMx3XSvOJ75nbbF9HN2QT7RSRoPiM99SlaGeAZGCUOKCoUku2XyAm8hclR4F7tUOn14C/n3QMpK91FRET0LaAVoA1jE9kXUAhv5sDDz7X8w/zgnPa3+lbz0vUDDBQwRUjhR+cuXg89/mz/tgVI/LvgqMActOrDa+XbAgEMwQauBJgTHDEPSQxHRiufBnLvgOzk9C3ywd65wwa3XcZ96wAOYh2KGXERcRcEL/pC3kE1JTL91t8N24/ktem63kXJGL4BzojzqhoHLnApbRyzGoMpJTrZOE4dD/Sm0/LLUtch5bHj39R9yyzZIv2sJSg7ZzZXJNsYtR24KbEpGBEe6qzHoL9PznTjN+wI5JzbleWnBtotUUX6QHEpcBRNETEZcxpPBunh5cDet77I3OSW9Xj0J+3q8mUORjPzScxE6yk6DekBPwZyCQj84NtGvPGxXMVB5zYATAWj//oAZxUqNd9KZUXSJvsDw/Fw8hP69/Ij2v6+x7XDySjunw24GFoRCw3BGd8yr0bnQI4iHfq44ereyujR6m/bM8QQvKrPfPZEG+opqSMrGLAaFCw7PCw3fBjY7+TS2c/X3PPmwd/czVPHgtio/8omHjitMIwgKBq9I+Awcy1AED3nhsiYw/HTAuWu5/zczdWi5AgJoDCSQ107xSR+FCwWySDmHuUF+t6VvwW6Kc1S5gTzre2Q6ELzUxJeN/JKX0LlJjEOkAcjDskOdfsR2qG71bU4y4/qAP9lACr6pf8KGIc6U02IQ2cjDAXD9ij6ef658YnVyrq0tcDMs/EQDcsS6QuYCwEcNDhvSFU/Ih+p+U/lZebs7S7rMNerv7G6yNJ3+a4a4CWeHoMWlR0sM5tCkjk3F6vuB9ai1i3jS+id3C/KZcY03MAE2yjUNcEr/hyDG7Yp6jXkLQ8OZePzx3PH1tfu5WXkqtZq07vm1Q2MMjhC5jYUIioWmBzhJmkh+ANA26S+Lr1X0rTo9+9L6G7jUPJwFZk5ikk3PT4icQ59DHcUzBFq+mDV2Lmzt0rPDu1//J35H/TY/lscDj4TTqlAUSEyBQ788wA8Aj3xY9JeuNa2/s9t9I4Lfg3lBawJ/x/+PKtLsz0+Gmn4KOkQ7qP0+Otu0xq8S7sa1zH9yhkyIKcWdRS1IFM5d0bPOJUUoe1E2pPc/efL58fXXcTZw0fdkwZ8KGcwGSbyGcgdPS5COiIu1wqT4bbKis3a3b3n4N/U0YnPgeeDENUzoj6qMWMeDxkYIn4rFCJOAFvYu7/4wTLXaema62HhY9+F898ZzzxvSL05NSBrEKoSthlVFJ339tBDuJS7R9W17xX6ivT276b+oh9bQHdMyjvZHagG6QC7B1kFYvAkzh62Z7lW1fX2uwjPB8MBLArPJDlC70zFO+8X9Pjl7uTzLPdB6n7OPriou1ba5f9hFzwaaxGnEX0jSjyvRsQ13g9o6wzca+FN6tnmrdLFv1bDN+GHCmsmBCuYINIYYSGGNPc8TywlB87fNM5p0y7icucg3A/N+c2K6hQUuDPgOgAszxtmG38nCzBaIQj9TdYLwU/HjNvT6UXmItt73DT1XB2DPQNFAzNdG90RlxjiH7cUBPWBzti4GcBw2Nrvk/S37XzszwDaJFpET0s5NxQaNAf0BowNKweO7JDJ6LT3uw/ZYve1BBMAbvxgCakneUTYS881khIT+KLyGflr+fjmLMnMtfK9393AASIVMRSFDCgRtidbQRBIuzIgDLbrx+Cf6BDuNuRlzCK8x8Lt49wKmiPoJM8ZOheOJYs5lz+PK3UDqt/V0RDZUuaT5fjVzMZQzTDtCRfuMp41SyZYGtweZC3wMx0hU/qH01PDmsyf31zomOBx1G7ZzvYIIEQ9+ECILlcaXhVEH8MkfBWb8QLMbbqWxMPc9e4o78bm2ehYAQEnwkRSSPQy3xfTCXQN5RJoCP/p68UKtQTAvd0j91n/RPlU+K4KlCuXR4RLPDMAEaH6OPlb/7j7EuR/xMez376C4MUBVBBMDGcHlhFPLOpEiEeaLrEIn+wY5jPuXvDJ4a7IRrnqw1fnSw0QImsfJBXVF+kpsT51QXUoqv/g3krVY94C6GbiXs8Nw3bN3+++GB4x5y8AItsZoSN2M+Q2eh9c92/TOMcs0mHiUOcb23LQH9mJ+eIihz0JPVQpmBmwGHQkyyfXE2PtYMnfu7HICOGE7sTqiOFz5/cDQCuSRp5FFS9zFi8NlxNtF44ItuZ2w3S1GMRE4fP2QPr88mL15AxcMJ5JekjALrEPg/4GASsG9/sb4TzBobNwwlnkmgGGCzYGwwO4E7owVUj1RrErhAby7irtjvTv8VzeDMNstqbFT+tMDr0d1RjXEP0XUS4/Qz5BYyUj/pThbdp45b3q+d9pymy/Us7i8+kayC4mKhgd4RpgKE85yzgqHRbzgNM/zI3YuOWg5D/V7csr2YX9+SWnOz42WCRqGHodKSvzKm0Sa+n0xzq+Zs1Z4iDrIuP82izlqAbQLfJEgEDeKFMUhBAwGd0bKgeT4jXBjrcPyOHjP/Xv86/tpvPjDpcze0rOReQpXA6fAZMGXApb/GTca73rs8vGJegbAW4GjQD0AbsVszXJSv5FhyeDBefyAfTo+TnzGdqbvji1XMla7oUOZhguEl0NUhlzM8VGikAZItz64eKY4GDqN+tK2xHE+Lw30G33MhsUKTUiBxjaGtEsSD0aOGwZv+8704nP09zf5nrfMs9kx//YhgA5Jxw5xDHNH8cZpiPGL5MsCBBN5+fGX8IG0+Dkjefe3NzWbOUpCa8v6UPMO4olYxXZFs8fBR1wBcrehr4Kuu3M3OVm8i7uZueT8mYSQzcWS4pCTybJDUUGIQ0XDt76y9fvuYi0TMsT6zP/UAC3+fP+nxjyOQVNh0O6I4sEmva/+db+5fJU1q+7vrWRzVvx+QzsEk4MgAqNG7Q300grQCAef/mC5P/mN+/X6wXXUMATuzfS5PmdGtMkRR0lFaEdSjKnQVY4khYV7pzVh9Vf4Rvn5dtNyW3EnNp8A1AnmTTsKi4cfhpLKPc0Ii35CyPi0MdIx0HYNeYy5HPWWNIU5qkNsTKgQRc3kyFBFvsbiCZTIKADAtwPv3W+iNKi6LvvW+cX40/y4hVIOmhKuz12Iy0PxAzAFNURRPs/1Wa5srixzxLtWfyV+rL0M//NGyg910ypP4EfYQOM+jMA6gHt8HfR0rfKtpDQofQrCxINbAYFChwfszy7Snc8+hke9zfp8e2b86Pq5NKUu/C6l9Vz/DkZ/R5hFrESCCCjNxZEwDbREr3sntik25DmC+f31sDDDsMZ3dQGUycvMGAlPBrFHRIuQjnDLSoJ/+BxyeHLbtzJ5TLeCdCrz5PmGRA3M6M9vzBKHscYGCHYKa8g9v+n1wS/msHA1XboZ+pC4Pvej/IUGEo77kZhOJYeIRD4EVoYnhM9+DXRLbiuuwnUa+9O+Rz0mvDu/tQflkB/Ta88jxwaBU0AkQbCBGjvDc4DthC5XtTa9T4IXAaaAK0I1SJVQKpMcDtHFtb4nO7c88L3Y+nlzhi5fbwi2if/1BcoGQoRfhHxI2o8YUZeNYEP1+pQ3HfiZ+tX5i7Sub+zwuDghgnFJhAs9B98GJMhQzQGPUAtUgd04ELON9S14iPnvdq/y6/NVOpHFHAziTlFK44bWxvmJ2kvDSHc/LrUpMBxxy/bc+kI5v3abdu89CUdPj1NRGwzUhzLEnkYoB9JFKb0Gc4EuKm+DdjM7kf0fuy9613/aiIgQ/dKHDgeGq8HsQaNDLwGZ+zZyJuzKbsI2fr2ygQrAFT7LQhUJy1EdkxSNoET3/k/82X5VPnf5kvIn7WmvVrdWAEfFeMTzgyKEpAoFkJlSD0z4gzz6/bheOms78fl7s3fvMHD5uQjDG8kbyREGQgWQCXPOfQ/2CswBDLfoNFq2QvmB+VI1XDHC80R7Z8XATMhNWwmRhqrHg8uEjQLIrL5ndMwxKHMvN/N6ITgqNUn2/H2vSC/PVNBRy4BGw8Vkx5OJGUV7PAdywK6ZMQO3afvePAn58PpIwIcKSdGP0loM9oXAAm/DbYSqQi66r3Gy7UxwAHeJfhJAKT66PkuDL4sx0iHS/gzvxJ1/Jz6GAGv/NjkMcWVtHLABOJCA0YRnA3uCAcS1iyvRQhIyC/iCdHsfecC7z/xGOJxyMi5CcZ36OIObCEgH+4VuxfKKUU+FEKKKAsARd+p1aPfiOiK4mDPU8Nwzf/vThgfMJwvByG1GfkiXjIMNgEeZPWz0R3HPtJW4hPnadv/z0HYvPjYIdQ7uzviKDoZOhnAJPkmSBMR7enIbrsLybjfiO3L6S3gteZPAy4qXEXcRFYtPBX3DO0SrxeEB67l/MKPtZDD8OBu9t35ZvPC9e0MVzAJSvRIzy5yD9v+VwAJBjL9lOBZwL+zW8PF5DwCYQyiBiwEvxOVMNtIEkcnKyIGPe6g7BH0qfLg3inE1bcIx3Hr8g5NHdwYmhFLGGIuuELCQcIld/0Y4OTaAuSw6Xbf3Mmmv4zOwfO3GswtnikAHQsaOSh6OFQ40hy788DSssoL19XkROTL1HjLRdkU/Qsl8jvuNkUksxjwHSEqgSpEEgbqHcievnDNs+Ew6uHiatq75D4FiC0IRSNA/CjAEzYQkxmzGjIHW+LnwF23qMig45X0KPRZ7MPynw5TM99JAUViKhEOfQJUBnEKuvta3IG9NLPoxjznhv/hBRsA7wBMFZA1b0sNRWAm8gOd8TLykfl+8hjax75dte/Jc+64DdIYJxIUDZUZ9zK5R1pB4yJi+zjjauAM6oDr39vZxN68JNDN9uQayyk9IxcY8BoyLFo9tDhqGkLwRNNczx7cFuZZ39HObscy2A=="
                    },
                    "preset": "cathedral",
                    "rt60": 3,
                    "dry": 0,
                    "wet": 0.25
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SoundscapeReverbResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/workflows": {
      "get": {
        "operationId": "listWorkflows",
        "summary": "Multi-tool workflows",
        "responses": {
          "200": {
            "description": "Workflow list.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem details. 422 responses include per-field `errors`.",
        "required": [
          "type",
          "title",
          "status",
          "detail"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer"
          },
          "detail": {
            "type": "string"
          },
          "code": {
            "type": "string"
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "field",
                "message"
              ],
              "properties": {
                "field": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "FocusroomPlaylistRenderInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "items": {
            "title": "Scenes (one per line: scene id and seconds)",
            "description": "Generated scenes: brown-noise, pink-rain, surf-like-swell, fireside, forest-stream, night-wind, rainy-study-room, submarine, medieval-tavern, spacecraft-hum, cavern-drips, coffee-shop-murmur. Write \"brown-noise 30\" or \"fireside 2 min\". Used when no room is pasted below.",
            "type": "string",
            "maxLength": 2000,
            "default": "brown-noise 20\nrainy-study-room 20\npink-rain 20"
          },
          "project": {
            "title": "Focus Room (JSON or share link, optional)",
            "description": "Paste a .focusroom.json file or a Focus Room share link to render its playlist (shuffle order included) with its master effects. Scenes with Wikimedia Commons recordings cannot be rendered on the server.",
            "type": "string",
            "maxLength": 200000,
            "default": ""
          },
          "secondsPerItem": {
            "title": "Seconds per scene",
            "description": "Length of each scene of a pasted room (a room’s scenes usually last many minutes), and of scene lines without their own length.",
            "type": "number",
            "minimum": 4,
            "maximum": 600,
            "default": 20,
            "x-unit": "s"
          },
          "crossfade": {
            "title": "Crossfade",
            "description": "Equal-power crossfade between scenes (at most half a scene). A pasted room uses its own crossfade.",
            "type": "number",
            "minimum": 0,
            "maximum": 30,
            "default": 6,
            "x-unit": "s"
          },
          "fx": {
            "title": "Master effects preset",
            "description": "A pasted room uses its own master effects.",
            "type": "string",
            "enum": [
              "flat",
              "warm",
              "bright",
              "far-away",
              "small-room"
            ],
            "default": "flat"
          },
          "sampleRate": {
            "title": "Sample rate",
            "type": "string",
            "enum": [
              "44100",
              "48000",
              "22050"
            ],
            "default": "44100"
          }
        },
        "required": []
      },
      "FocusroomPlaylistRenderResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "seconds",
              "sampleRate",
              "channels",
              "crossfadeSeconds",
              "scenes",
              "fx",
              "peakDb",
              "rmsDb",
              "limitedSamples",
              "wavFile"
            ],
            "properties": {
              "seconds": {
                "type": "number",
                "description": "Length of the WAV file (scenes overlap during crossfades)."
              },
              "sampleRate": {
                "type": "integer"
              },
              "channels": {
                "type": "integer"
              },
              "crossfadeSeconds": {
                "type": "number"
              },
              "scenes": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "name",
                    "start",
                    "end",
                    "fadeIn",
                    "fadeOut",
                    "origin"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "start": {
                      "type": "number"
                    },
                    "end": {
                      "type": "number"
                    },
                    "fadeIn": {
                      "type": "number"
                    },
                    "fadeOut": {
                      "type": "number"
                    },
                    "origin": {
                      "type": "string"
                    }
                  }
                }
              },
              "fx": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "volumeDb",
                  "lowCutHz",
                  "highCutHz",
                  "eq",
                  "room",
                  "roomAmount",
                  "width",
                  "limiter"
                ],
                "properties": {
                  "volumeDb": {
                    "type": "number"
                  },
                  "lowCutHz": {
                    "type": "number"
                  },
                  "highCutHz": {
                    "type": "number"
                  },
                  "eq": {
                    "type": "array",
                    "items": {
                      "type": "number"
                    }
                  },
                  "room": {
                    "type": "string"
                  },
                  "roomAmount": {
                    "type": "number"
                  },
                  "width": {
                    "type": "number"
                  },
                  "limiter": {
                    "type": "boolean"
                  }
                }
              },
              "peakDb": {
                "type": "number",
                "description": "Sample peak in dBFS after the limiter."
              },
              "rmsDb": {
                "type": "number"
              },
              "limitedSamples": {
                "type": "integer",
                "description": "Samples the soft limiter changed (0 = it never engaged)."
              },
              "wavFile": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "FocusroomFocusTimerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "mode": {
            "title": "Routine",
            "type": "string",
            "enum": [
              "pomodoro",
              "52-17",
              "custom"
            ],
            "default": "pomodoro"
          },
          "cycles": {
            "title": "Focus blocks",
            "type": "integer",
            "minimum": 1,
            "maximum": 16,
            "default": 4
          },
          "start": {
            "title": "Start",
            "description": "Local date and time of the first block. Calendar events use floating local time. Local date-time YYYY-MM-DDTHH:mm",
            "type": "string",
            "default": "2026-11-16T09:00"
          },
          "focusMinutes": {
            "title": "Focus minutes (custom)",
            "type": "integer",
            "minimum": 1,
            "maximum": 180,
            "default": 45,
            "x-unit": "min"
          },
          "shortBreakMinutes": {
            "title": "Short break minutes (custom)",
            "type": "integer",
            "minimum": 1,
            "maximum": 60,
            "default": 10,
            "x-unit": "min"
          },
          "longBreakMinutes": {
            "title": "Long break minutes (custom)",
            "type": "integer",
            "minimum": 1,
            "maximum": 90,
            "default": 20,
            "x-unit": "min"
          },
          "longEvery": {
            "title": "Long break after every n blocks (custom, 0 = never)",
            "type": "integer",
            "minimum": 0,
            "maximum": 12,
            "default": 3
          },
          "includeBreaks": {
            "title": "Put breaks in the calendar file too",
            "type": "boolean",
            "default": false
          },
          "alarmMinutes": {
            "title": "Reminder before each block",
            "description": "0 = no reminder.",
            "type": "integer",
            "minimum": 0,
            "maximum": 60,
            "default": 0,
            "x-unit": "min"
          },
          "title": {
            "title": "Event title",
            "type": "string",
            "maxLength": 120,
            "default": "Focus block"
          }
        },
        "required": []
      },
      "FocusroomFocusTimerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "mode",
              "focusMinutes",
              "breakMinutes",
              "totalMinutes",
              "blocks",
              "start",
              "end",
              "phases",
              "icsFile"
            ],
            "properties": {
              "mode": {
                "type": "string"
              },
              "focusMinutes": {
                "type": "number"
              },
              "breakMinutes": {
                "type": "number"
              },
              "totalMinutes": {
                "type": "number"
              },
              "blocks": {
                "type": "integer"
              },
              "start": {
                "type": "string",
                "description": "Local start YYYY-MM-DD HH:MM."
              },
              "end": {
                "type": "string"
              },
              "phases": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "kind",
                    "block",
                    "start",
                    "end",
                    "minutes"
                  ],
                  "properties": {
                    "kind": {
                      "type": "string",
                      "enum": [
                        "focus",
                        "short-break",
                        "long-break"
                      ]
                    },
                    "block": {
                      "type": "integer"
                    },
                    "start": {
                      "type": "string"
                    },
                    "end": {
                      "type": "string"
                    },
                    "minutes": {
                      "type": "number"
                    }
                  }
                }
              },
              "icsFile": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "SoundscapeAmbienceGeneratorInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "kind": {
            "title": "Sound",
            "type": "string",
            "enum": [
              "rain",
              "wind",
              "stream",
              "fire",
              "hum",
              "drone"
            ],
            "default": "rain"
          },
          "duration": {
            "title": "Loop length",
            "description": "Up to 60 seconds (stereo up to 48 kHz). A seamless loop can be repeated as long as you like in any player that loops. The WAV file is kept on the server for about 2 hours so you can download it, then deleted.",
            "type": "number",
            "minimum": 1,
            "maximum": 60,
            "default": 20,
            "x-unit": "s"
          },
          "sampleRate": {
            "title": "Sample rate",
            "type": "string",
            "enum": [
              "8000",
              "16000",
              "22050",
              "32000",
              "44100",
              "48000",
              "96000"
            ],
            "default": "44100"
          },
          "channels": {
            "title": "Channels",
            "type": "string",
            "enum": [
              "stereo",
              "mono"
            ],
            "default": "stereo"
          },
          "level": {
            "title": "Level (RMS)",
            "type": "number",
            "minimum": -60,
            "maximum": -6,
            "default": -20,
            "x-unit": "dBFS"
          },
          "loop": {
            "title": "Seamless loop",
            "type": "boolean",
            "default": true
          },
          "loopCrossfade": {
            "title": "Loop crossfade",
            "description": "Longer crossfades hide the seam better; at most a quarter of the loop length is used.",
            "type": "number",
            "minimum": 0.05,
            "maximum": 10,
            "default": 1,
            "x-unit": "s"
          },
          "room": {
            "title": "Room",
            "type": "string",
            "enum": [
              "none",
              "small-room",
              "living-room",
              "studio",
              "hall",
              "cathedral",
              "cave",
              "forest"
            ],
            "default": "none"
          },
          "intensity": {
            "title": "Intensity (rain, wind strength, water flow, fire size)",
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 0.5
          },
          "density": {
            "title": "Raindrops per second at full intensity (rain)",
            "type": "number",
            "minimum": 0,
            "maximum": 400,
            "default": 120
          },
          "brightness": {
            "title": "Brightness (rain, fire, hum, drone)",
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 0.5
          },
          "gustiness": {
            "title": "Gustiness (wind)",
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 0.5
          },
          "pitch": {
            "title": "Pitch (wind) or water size (stream: 0 brook … 1 river)",
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 0.5
          },
          "detail": {
            "title": "Bubbles (stream) or crackles (fire)",
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 0.5
          },
          "frequency": {
            "title": "Frequency (hum fundamental or drone root)",
            "description": "Empty = 100 Hz hum (transformer hum on 50 Hz mains; use 120 for 60 Hz mains) or a 55 Hz drone root.",
            "type": "number",
            "minimum": 20,
            "maximum": 1000,
            "x-unit": "Hz"
          },
          "partials": {
            "title": "Harmonics (hum, 1–16) or voices (drone, 2–8)",
            "description": "Empty = 8 harmonics or 4 voices.",
            "type": "integer",
            "minimum": 1,
            "maximum": 16
          },
          "detuneCents": {
            "title": "Detune spread (drone)",
            "type": "number",
            "minimum": 0,
            "maximum": 50,
            "default": 8,
            "x-unit": "cents"
          },
          "motion": {
            "title": "Slow movement (drone LFO depth, hum wobble)",
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 0.5
          },
          "lfoRate": {
            "title": "LFO rate (drone)",
            "type": "number",
            "minimum": 0.01,
            "maximum": 1,
            "default": 0.08,
            "x-unit": "Hz"
          },
          "roomToneDb": {
            "title": "Room tone level relative to the hum (hum)",
            "type": "number",
            "minimum": -60,
            "maximum": 0,
            "default": -24,
            "x-unit": "dB"
          },
          "encoding": {
            "title": "File format",
            "type": "string",
            "enum": [
              "pcm16",
              "float32"
            ],
            "default": "pcm16"
          },
          "seed": {
            "title": "Seed",
            "description": "Same seed and settings = the same file. Change it for different drops, gusts and crackles.",
            "type": "string",
            "maxLength": 40,
            "default": "1"
          }
        },
        "required": []
      },
      "SoundscapeAmbienceGeneratorResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "kind",
              "sampleRate",
              "channels",
              "durationSeconds",
              "frames",
              "loop",
              "room",
              "seed",
              "encoding",
              "parameters",
              "events",
              "quantisedFrequencyHz",
              "levelReduced",
              "spectrum",
              "seam",
              "artifact"
            ],
            "properties": {
              "kind": {
                "type": "string",
                "enum": [
                  "rain",
                  "wind",
                  "stream",
                  "fire",
                  "hum",
                  "drone"
                ]
              },
              "sampleRate": {
                "type": "integer"
              },
              "channels": {
                "type": "integer"
              },
              "durationSeconds": {
                "type": "number"
              },
              "frames": {
                "type": "integer"
              },
              "loop": {
                "type": "boolean"
              },
              "room": {
                "type": "string"
              },
              "seed": {
                "type": "string"
              },
              "encoding": {
                "type": "string"
              },
              "parameters": {
                "type": "object",
                "description": "All synthesis parameters after defaults and clamping (what was rendered)."
              },
              "events": {
                "type": "integer",
                "description": "Raindrops, bubbles or crackles that were synthesized."
              },
              "quantisedFrequencyHz": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Hum fundamental or drone root after rounding to whole cycles per loop (looped files only)."
              },
              "levelReduced": {
                "type": "boolean"
              },
              "spectrum": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "centroidHz",
                  "rolloffHz",
                  "slopeDbPerOctave",
                  "peaks",
                  "rmsDb",
                  "peakDb",
                  "crestDb",
                  "octaveBands"
                ],
                "properties": {
                  "centroidHz": {
                    "type": "number",
                    "description": "Power-weighted mean frequency (spectral centroid)."
                  },
                  "rolloffHz": {
                    "type": "number",
                    "description": "Frequency below which 85 % of the power lies."
                  },
                  "slopeDbPerOctave": {
                    "type": "number",
                    "description": "Least-squares slope of the 1/3-octave power spectrum between 100 Hz and min(10 kHz, sample rate / 4)."
                  },
                  "peaks": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "frequencyHz",
                        "levelDb"
                      ],
                      "properties": {
                        "frequencyHz": {
                          "type": "number"
                        },
                        "levelDb": {
                          "type": "number"
                        }
                      }
                    }
                  },
                  "rmsDb": {
                    "type": "number"
                  },
                  "peakDb": {
                    "type": "number"
                  },
                  "crestDb": {
                    "type": "number"
                  },
                  "octaveBands": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "centerHz",
                        "relativeDb"
                      ],
                      "properties": {
                        "centerHz": {
                          "type": "number"
                        },
                        "relativeDb": {
                          "type": "number"
                        }
                      }
                    }
                  }
                }
              },
              "seam": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "seamJump",
                  "maxInnerJump"
                ],
                "properties": {
                  "seamJump": {
                    "type": "number"
                  },
                  "maxInnerJump": {
                    "type": "number"
                  }
                }
              },
              "artifact": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "SoundscapeNoiseGeneratorInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "type": {
            "title": "Noise colour",
            "type": "string",
            "enum": [
              "white",
              "pink",
              "brown",
              "blue",
              "violet"
            ],
            "default": "pink"
          },
          "duration": {
            "title": "Duration",
            "description": "Up to 120 seconds (stereo at 96 kHz: up to 60 seconds). The WAV file is kept on the server for about 2 hours so you can download it, then deleted.",
            "type": "number",
            "minimum": 0.1,
            "maximum": 120,
            "default": 10,
            "x-unit": "s"
          },
          "sampleRate": {
            "title": "Sample rate",
            "type": "string",
            "enum": [
              "8000",
              "16000",
              "22050",
              "32000",
              "44100",
              "48000",
              "96000"
            ],
            "default": "44100"
          },
          "channels": {
            "title": "Channels",
            "type": "string",
            "enum": [
              "stereo",
              "mono"
            ],
            "default": "stereo"
          },
          "level": {
            "title": "Level (RMS)",
            "description": "Average level. It is lowered automatically if the peaks would clip.",
            "type": "number",
            "minimum": -60,
            "maximum": -6,
            "default": -18,
            "x-unit": "dBFS"
          },
          "fadeIn": {
            "title": "Fade in",
            "description": "Ignored for seamless loops.",
            "type": "number",
            "minimum": 0,
            "maximum": 30,
            "default": 0.5,
            "x-unit": "s"
          },
          "fadeOut": {
            "title": "Fade out",
            "description": "Ignored for seamless loops.",
            "type": "number",
            "minimum": 0,
            "maximum": 30,
            "default": 0.5,
            "x-unit": "s"
          },
          "loop": {
            "title": "Seamless loop (the end flows into the start)",
            "type": "boolean",
            "default": false
          },
          "encoding": {
            "title": "File format",
            "type": "string",
            "enum": [
              "pcm16",
              "float32"
            ],
            "default": "pcm16"
          },
          "seed": {
            "title": "Seed",
            "description": "Same seed and settings = the same file, byte for byte. Change it for a different noise.",
            "type": "string",
            "maxLength": 40,
            "default": "1"
          }
        },
        "required": []
      },
      "SoundscapeNoiseGeneratorResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "noiseType",
              "sampleRate",
              "channels",
              "durationSeconds",
              "frames",
              "encoding",
              "seed",
              "loop",
              "expectedSlopeDbPerOctave",
              "levelReduced",
              "spectrum",
              "seam",
              "artifact"
            ],
            "properties": {
              "noiseType": {
                "type": "string",
                "enum": [
                  "white",
                  "pink",
                  "brown",
                  "blue",
                  "violet"
                ]
              },
              "sampleRate": {
                "type": "integer"
              },
              "channels": {
                "type": "integer"
              },
              "durationSeconds": {
                "type": "number"
              },
              "frames": {
                "type": "integer"
              },
              "encoding": {
                "type": "string"
              },
              "seed": {
                "type": "string"
              },
              "loop": {
                "type": "boolean"
              },
              "expectedSlopeDbPerOctave": {
                "type": "number",
                "description": "Nominal slope of the chosen colour."
              },
              "levelReduced": {
                "type": "boolean",
                "description": "True when the requested RMS level would have clipped and the level was lowered."
              },
              "spectrum": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "centroidHz",
                  "rolloffHz",
                  "slopeDbPerOctave",
                  "peaks",
                  "rmsDb",
                  "peakDb",
                  "crestDb",
                  "octaveBands"
                ],
                "properties": {
                  "centroidHz": {
                    "type": "number",
                    "description": "Power-weighted mean frequency (spectral centroid)."
                  },
                  "rolloffHz": {
                    "type": "number",
                    "description": "Frequency below which 85 % of the power lies."
                  },
                  "slopeDbPerOctave": {
                    "type": "number",
                    "description": "Least-squares slope of the 1/3-octave power spectrum between 100 Hz and min(10 kHz, sample rate / 4)."
                  },
                  "peaks": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "frequencyHz",
                        "levelDb"
                      ],
                      "properties": {
                        "frequencyHz": {
                          "type": "number"
                        },
                        "levelDb": {
                          "type": "number"
                        }
                      }
                    }
                  },
                  "rmsDb": {
                    "type": "number"
                  },
                  "peakDb": {
                    "type": "number"
                  },
                  "crestDb": {
                    "type": "number"
                  },
                  "octaveBands": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "centerHz",
                        "relativeDb"
                      ],
                      "properties": {
                        "centerHz": {
                          "type": "number"
                        },
                        "relativeDb": {
                          "type": "number"
                        }
                      }
                    }
                  }
                }
              },
              "seam": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "seamJump",
                  "maxInnerJump"
                ],
                "properties": {
                  "seamJump": {
                    "type": "number"
                  },
                  "maxInnerJump": {
                    "type": "number"
                  }
                }
              },
              "artifact": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "SoundscapeReverbInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "file": {
            "title": "Audio file",
            "description": "WAV directly, other formats are decoded with ffmpeg; up to 120 seconds, 8–96 kHz. The WAV file is kept on the server for about 2 hours so you can download it, then deleted. Upload as {filename, contentType?, contentBase64}. Max 51200 KiB. Accepts .wav,.mp3,.flac,.ogg,.oga,.opus,.m4a,.aac,.aif,.aiff,audio/*.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "preset": {
            "title": "Room",
            "type": "string",
            "enum": [
              "small-room",
              "living-room",
              "studio",
              "hall",
              "cathedral",
              "cave",
              "forest"
            ],
            "default": "hall"
          },
          "rt60": {
            "title": "Reverberation time (optional)",
            "description": "Empty = the preset value. Time for the reverb to fall by 60 dB.",
            "type": "number",
            "minimum": 0.1,
            "maximum": 12,
            "x-unit": "s"
          },
          "wet": {
            "title": "Reverb level (optional, 0–1)",
            "description": "Empty = the preset value.",
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "dry": {
            "title": "Original level (optional, 0–1)",
            "description": "Empty = the preset value; 0 gives only the reverb.",
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "keepTail": {
            "title": "Keep the reverb tail (the file gets longer)",
            "type": "boolean",
            "default": true
          },
          "encoding": {
            "title": "File format",
            "type": "string",
            "enum": [
              "auto",
              "pcm16",
              "float32"
            ],
            "default": "auto"
          }
        },
        "required": [
          "file"
        ]
      },
      "SoundscapeReverbResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "preset",
              "parameters",
              "measuredRt60Seconds",
              "gainReductionDb",
              "inputSeconds",
              "outputSeconds",
              "tailSeconds",
              "sampleRate",
              "channelsIn",
              "decodedBy",
              "before",
              "after",
              "artifact"
            ],
            "properties": {
              "preset": {
                "type": "string"
              },
              "parameters": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "rt60",
                  "damping",
                  "wet",
                  "dry",
                  "width",
                  "preDelayMs"
                ],
                "properties": {
                  "rt60": {
                    "type": "number"
                  },
                  "damping": {
                    "type": "number"
                  },
                  "wet": {
                    "type": "number"
                  },
                  "dry": {
                    "type": "number"
                  },
                  "width": {
                    "type": "number"
                  },
                  "preDelayMs": {
                    "type": "number"
                  }
                }
              },
              "measuredRt60Seconds": {
                "type": "number",
                "description": "RT60 measured on the impulse response (Schroeder integration, T20, low/mid frequencies)."
              },
              "gainReductionDb": {
                "type": "number",
                "description": "How much the whole result was turned down to avoid clipping (0 = not needed)."
              },
              "inputSeconds": {
                "type": "number"
              },
              "outputSeconds": {
                "type": "number"
              },
              "tailSeconds": {
                "type": "number"
              },
              "sampleRate": {
                "type": "integer"
              },
              "channelsIn": {
                "type": "integer"
              },
              "decodedBy": {
                "type": "string",
                "enum": [
                  "engine",
                  "ffmpeg"
                ]
              },
              "before": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "rmsDb",
                  "peakDb",
                  "centroidHz"
                ],
                "properties": {
                  "rmsDb": {
                    "type": "number"
                  },
                  "peakDb": {
                    "type": "number"
                  },
                  "centroidHz": {
                    "type": "number"
                  }
                }
              },
              "after": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "rmsDb",
                  "peakDb",
                  "centroidHz"
                ],
                "properties": {
                  "rmsDb": {
                    "type": "number"
                  },
                  "peakDb": {
                    "type": "number"
                  },
                  "centroidHz": {
                    "type": "number"
                  }
                }
              },
              "artifact": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      }
    }
  }
}