{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:magiclane:schema:engine-style:studio-1.0.0",
  "title": "Magic Lane engine style",
  "description": "The JSON a Magic Lane map style is made of: what the map engine reads, and what Magic Lane Studio opens, saves and downloads as \"Style (JSON)\". Generated by docs/tools/gen-engine-schema.py from the Studio 1.0.0 sources. Strict: it accepts what should be written, so layer types, properties and source names Studio does not know are rejected. Rules a JSON Schema cannot express are listed in \"x-checks-not-in-schema\". Checked against the engine field map (docs/schema/engine-field-map.json): every field the engine reads is allowed, fields Studio does not write carry \"x-written-by-studio\": false, and \"x-field-id\" is the field's number in the .style file.",
  "x-checks-not-in-schema": [
    "Layer ids: the first layer in definition.layers has the highest id and the last has 1, and each id is lower than the one before. Gaps are allowed (the official templates have them); Studio renumbers from N down to 1 only when a reorder breaks the order. The id is draw order, not identity.",
    "Array order is draw order: the first layer is drawn last, on top. The background layer comes last.",
    "Every layer group_id names a group id in groups_section.groups; every parent_id names another group, with no cycles.",
    "Every custom_icon value other than \"\" names an icons_section.icons id. An id the style does not carry makes the engine draw its default marker.",
    "icons_section.icons ids are unique.",
    "A layer with source \"satelliteExternal\" needs a sources_list entry whose composite.type is \"satelliteExternal\"; without it the layer draws nothing.",
    "minzoom is not above maxzoom.",
    "Each icon value is a real image: a PNG must have valid chunks ending in IEND. Image bytes cannot be invented; copy a data URI from an existing style or add the file in Studio.",
    "One image is at most 400 KB, and all images in a style at most 4 MB (Studio limits).",
    "Each fonts_section value is a real TTF or OTF file: its table directory fits inside the file, it has cmap, head and name tables, and a browser can load it. No size limit, but the file is part of every save and download of the style. Font bytes cannot be invented; add the font in Studio."
  ],
  "type": "object",
  "required": [
    "sources_list",
    "map_schemes_section",
    "icons_section"
  ],
  "properties": {
    "sources_list": {
      "description": "Declared sources. Usually empty: layers name built-in sources by name, which need no declaration. Only an external tile service is declared here.",
      "type": "object",
      "required": [
        "sources"
      ],
      "properties": {
        "sources": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/declaredSource"
          },
          "x-field-id": 1
        }
      },
      "additionalProperties": false,
      "x-field-id": 1
    },
    "map_schemes_section": {
      "type": "object",
      "required": [
        "map_schemes"
      ],
      "properties": {
        "COMMENT": {
          "type": "string",
          "description": "Free text. Studio writes \"Define all available map schemes.\""
        },
        "map_schemes": {
          "type": "array",
          "minItems": 1,
          "maxItems": 1,
          "items": {
            "$ref": "#/$defs/scheme"
          },
          "x-field-id": 1
        },
        "slippytiles": {
          "type": "integer",
          "minimum": 0,
          "x-field-id": 2,
          "x-written-by-studio": false,
          "description": "In the engine field map; Studio does not write it."
        }
      },
      "additionalProperties": false,
      "x-field-id": 3
    },
    "icons_section": {
      "description": "The images the style carries. Layers refer to them by id.",
      "type": "object",
      "required": [
        "icons"
      ],
      "properties": {
        "COMMENT": {
          "type": "string",
          "description": "Free text. Studio writes \"Define all available icons for schemes.\""
        },
        "icons": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/icon"
          },
          "x-field-id": 1
        }
      },
      "additionalProperties": false,
      "x-field-id": 4
    },
    "fonts_section": {
      "description": "The style's own font for its labels, one font for the whole style: up to three faces, each a TTF or OTF file stored in the style as a data URI, like the images in icons_section. Each face works on its own; a face that is missing is drawn in the built-in font. Optional: leave it out to use the map's built-in font. A character the font does not have is also drawn in the built-in font. Font data cannot be written by hand or generated; add fonts in Magic Lane Studio (Settings > Typography).",
      "type": "object",
      "properties": {
        "COMMENT": {
          "type": "string",
          "description": "Free text. Studio writes none."
        },
        "regular": {
          "type": "string",
          "pattern": "^data:(font/ttf|font/otf|font/sfnt|application/x-font-ttf|application/x-font-otf|application/font-sfnt)(;[^,]*)?;base64,[A-Za-z0-9+/=\\s]+$",
          "description": "The face for layers whose text-style is normal (0). Optional; without it those labels use the built-in font. A whole TTF or OTF file as a base64 data URI, such as \"data:font/ttf;base64,AAEAAAAQ...\". WOFF, WOFF2 and font collections (.ttc) are not read.",
          "x-written-by-studio": true
        },
        "bold": {
          "type": "string",
          "pattern": "^data:(font/ttf|font/otf|font/sfnt|application/x-font-ttf|application/x-font-otf|application/font-sfnt)(;[^,]*)?;base64,[A-Za-z0-9+/=\\s]+$",
          "description": "The face for layers whose text-style is bold (1). Optional; without it those labels use the built-in bold. A whole TTF or OTF file as a base64 data URI, such as \"data:font/ttf;base64,AAEAAAAQ...\". WOFF, WOFF2 and font collections (.ttc) are not read.",
          "x-written-by-studio": true
        },
        "italic": {
          "type": "string",
          "pattern": "^data:(font/ttf|font/otf|font/sfnt|application/x-font-ttf|application/x-font-otf|application/font-sfnt)(;[^,]*)?;base64,[A-Za-z0-9+/=\\s]+$",
          "description": "The face for layers whose text-style is italic (2). Optional; without it those labels use the built-in italic. A whole TTF or OTF file as a base64 data URI, such as \"data:font/ttf;base64,AAEAAAAQ...\". WOFF, WOFF2 and font collections (.ttc) are not read.",
          "x-written-by-studio": true
        }
      },
      "additionalProperties": false
    },
    "map_schemes_list_section": {
      "type": "object",
      "properties": {
        "available_map_schemes": {
          "type": "array",
          "x-field-id": 1,
          "x-written-by-studio": false,
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "x-field-id": 1,
                "x-written-by-studio": false
              },
              "translations": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "language_code": {
                      "type": "string",
                      "x-field-id": 1,
                      "x-written-by-studio": false
                    },
                    "name": {
                      "type": "string",
                      "x-field-id": 2,
                      "x-written-by-studio": false
                    }
                  },
                  "additionalProperties": false,
                  "x-field-id": 2,
                  "x-written-by-studio": false
                },
                "x-field-id": 2
              }
            },
            "additionalProperties": false,
            "x-field-id": 1
          }
        }
      },
      "additionalProperties": false,
      "x-field-id": 2,
      "x-written-by-studio": false,
      "description": "The list of schemes an app can offer, with translated names. In the engine field map; Studio does not write it."
    }
  },
  "additionalProperties": false,
  "$defs": {
    "styleZoom": {
      "description": "A style zoom level, a whole number from 0 to 17.",
      "type": "integer",
      "minimum": 0,
      "maximum": 17
    },
    "easingType": {
      "description": "The curve between two stops, 1-based: 1 = linear, 2 = easeInSine, 3 = easeOutSine, 4 = easeInOutSine, 5 = easeInQuad, 6 = easeOutQuad, 7 = easeInOutQuad, 8 = easeInCubic, 9 = easeOutCubic, 10 = easeInOutCubic, 11 = easeInQuart, 12 = easeOutQuart, 13 = easeInOutQuart, 14 = easeInQuint, 15 = easeOutQuint, 16 = easeInOutQuint, 17 = easeInExpo, 18 = easeOutExpo, 19 = easeInOutExpo, 20 = easeInCirc, 21 = easeOutCirc, 22 = easeInOutCirc. Use 1 (linear) unless a curve is wanted.",
      "type": "integer",
      "minimum": 1,
      "maximum": 22
    },
    "packedColor": {
      "description": "A colour as an unsigned 32-bit integer in ABGR order: (a << 24) | (b << 16) | (g << 8) | r. Opaque #aadaff (light blue) is 4294957738; opaque white is 4294967295. Studio also reads a hex string here and converts it, but the engine reads only the integer.",
      "type": "integer",
      "minimum": 0,
      "maximum": 4294967295
    },
    "iconRef": {
      "description": "The id of an image in icons_section.icons, or \"\" for no icon.",
      "type": "string"
    },
    "declaredSource": {
      "type": "object",
      "required": [
        "id",
        "composite"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "description": "Studio writes 7.",
          "x-field-id": 1
        },
        "composite": {
          "type": "object",
          "required": [
            "type",
            "location"
          ],
          "properties": {
            "COMMENT": {
              "type": "string"
            },
            "type": {
              "type": "string",
              "description": "The kind of source. Studio declares \"satelliteExternal\" only.",
              "x-field-id": 2
            },
            "location": {
              "type": "string",
              "format": "uri",
              "description": "The tile service URL. Studio writes https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/export",
              "x-field-id": 1
            },
            "location_bbox": {
              "type": "string",
              "x-field-id": 3,
              "x-written-by-studio": false,
              "description": "In the engine field map; Studio does not write it."
            },
            "qtree": {
              "type": "string",
              "x-field-id": 4,
              "x-written-by-studio": false,
              "description": "In the engine field map; Studio does not write it."
            },
            "encoding": {
              "type": "string",
              "x-field-id": 5,
              "x-written-by-studio": false,
              "description": "In the engine field map; Studio does not write it."
            },
            "high_res": {
              "type": "integer",
              "minimum": 0,
              "x-field-id": 6,
              "x-written-by-studio": false,
              "description": "In the engine field map; Studio does not write it."
            }
          },
          "additionalProperties": false,
          "x-field-id": 3
        },
        "name": {
          "type": "string",
          "x-field-id": 2,
          "x-written-by-studio": false,
          "description": "In the engine field map; Studio does not write it."
        }
      },
      "additionalProperties": false
    },
    "scheme": {
      "type": "object",
      "required": [
        "id",
        "name",
        "groups_section",
        "definition"
      ],
      "properties": {
        "id": {
          "const": 1,
          "description": "Always 1: the engine reads the scheme with id 1 and no other.",
          "x-field-id": 1
        },
        "name": {
          "type": "string",
          "description": "The style's name.",
          "x-field-id": 2
        },
        "groups_section": {
          "type": "object",
          "required": [
            "groups"
          ],
          "properties": {
            "groups": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/group"
              },
              "x-field-id": 1
            }
          },
          "additionalProperties": false,
          "x-field-id": 4
        },
        "definition": {
          "type": "object",
          "required": [
            "layers"
          ],
          "properties": {
            "layers": {
              "description": "The layers in draw order: the first is drawn last, on top.",
              "type": "array",
              "minItems": 1,
              "items": {
                "$ref": "#/$defs/layer"
              },
              "x-field-id": 1
            }
          },
          "additionalProperties": false,
          "x-field-id": 3
        }
      },
      "additionalProperties": false
    },
    "group": {
      "description": "A folder in the layer tree. Groups do not change drawing.",
      "type": "object",
      "required": [
        "id",
        "name"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "minimum": 0,
          "description": "Any whole number unique among groups.",
          "x-field-id": 1
        },
        "name": {
          "type": "string",
          "x-field-id": 2
        },
        "collapsed": {
          "type": [
            "boolean",
            "integer"
          ],
          "x-field-id": 3
        },
        "parent_id": {
          "type": "integer",
          "description": "The id of the group this one sits in.",
          "x-field-id": 4
        }
      },
      "additionalProperties": false
    },
    "filter": {
      "description": "One combinator over a flat list of conditions on feature attributes.",
      "type": "object",
      "required": [
        "condition",
        "expression"
      ],
      "properties": {
        "condition": {
          "enum": [
            "all",
            "any",
            "none"
          ],
          "x-field-id": 2
        },
        "expression": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "object",
            "required": [
              "key",
              "condition"
            ],
            "properties": {
              "key": {
                "type": "string",
                "description": "A feature attribute name.",
                "x-field-id": 3
              },
              "condition": {
                "enum": [
                  "has",
                  "hasnot",
                  "in",
                  "notin",
                  "==",
                  "!=",
                  ">",
                  "<",
                  ">=",
                  "<="
                ],
                "description": "has and hasnot take no values; > < >= <= compare numbers.",
                "x-field-id": 2
              },
              "values": {
                "type": "array",
                "items": {
                  "type": [
                    "string",
                    "number"
                  ]
                },
                "x-field-id": 4,
                "description": "The engine stores the values as strings. Studio writes numbers for numeric comparisons; the compiler converts them."
              },
              "id": {
                "type": "integer",
                "minimum": 0,
                "x-field-id": 1,
                "x-written-by-studio": false,
                "description": "In the engine field map; Studio does not write it."
              }
            },
            "additionalProperties": false
          },
          "x-field-id": 1
        }
      },
      "additionalProperties": false
    },
    "labelText": {
      "description": "The text a label layer draws. Either label_expression, a JSON-encoded expression tree such as \"{\\\"concat\\\":[{\\\"text\\\":\\\"Speed: \\\"},{\\\"get_v\\\":\\\"maxspeed\\\"}]}\" (nodes: text, number, get_v, concat, *), or label_keys, the form the overlay layers of the shipped basemap use.",
      "type": "object",
      "anyOf": [
        {
          "required": [
            "label_expression"
          ],
          "properties": {
            "label_expression": {
              "type": "string"
            }
          }
        },
        {
          "required": [
            "label_keys"
          ],
          "properties": {
            "label_keys": {
              "type": "object",
              "required": [
                "label_key"
              ],
              "properties": {
                "label_key": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "id",
                      "key_text"
                    ],
                    "properties": {
                      "id": {
                        "type": "integer",
                        "x-field-id": 1
                      },
                      "use_key_text": {
                        "enum": [
                          0,
                          1
                        ],
                        "x-field-id": 2
                      },
                      "key_text": {
                        "type": "string",
                        "x-field-id": 3
                      },
                      "custom_text": {
                        "type": "string",
                        "x-field-id": 4,
                        "x-written-by-studio": false,
                        "description": "In the engine field map; Studio does not write it."
                      }
                    }
                  }
                }
              }
            }
          }
        }
      ],
      "properties": {
        "use_default": {
          "type": "integer",
          "minimum": 0,
          "x-field-id": 1,
          "x-written-by-studio": false,
          "description": "In the engine field map; Studio does not write it."
        },
        "op": {
          "type": "string",
          "x-field-id": 2,
          "x-written-by-studio": false,
          "description": "In the engine field map; Studio does not write it."
        },
        "label_expression": {
          "type": "string",
          "x-field-id": 4
        },
        "label_keys": {
          "type": "object",
          "x-field-id": 3
        }
      }
    },
    "paint": {
      "type": "object",
      "properties": {
        "fill-color": {
          "description": "The color of the filled part of this layer. This color can be specified as rgba with an alpha component and the color's opacity will not affect the opacity of the stroke, if it is used. Seen in shipped styles.",
          "type": "object",
          "required": [
            "color_stops"
          ],
          "properties": {
            "color_stops": {
              "type": "object",
              "required": [
                "color_stop"
              ],
              "properties": {
                "color_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "color"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "color": {
                        "$ref": "#/$defs/packedColor"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 1
        },
        "fill-outline-color": {
          "description": "The border color of the fill. Seen in shipped styles.",
          "type": "object",
          "required": [
            "color_stops"
          ],
          "properties": {
            "color_stops": {
              "type": "object",
              "required": [
                "color_stop"
              ],
              "properties": {
                "color_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "color"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "color": {
                        "$ref": "#/$defs/packedColor"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 3
        },
        "line-inner-color": {
          "description": "The color with which the line will be drawn.  If an icon is set the color will blend with the icon's colors. Seen in shipped styles.",
          "type": "object",
          "required": [
            "color_stops"
          ],
          "properties": {
            "color_stops": {
              "type": "object",
              "required": [
                "color_stop"
              ],
              "properties": {
                "color_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "color"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "color": {
                        "$ref": "#/$defs/packedColor"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 7
        },
        "line-outer-color": {
          "description": "The color with which the border will be drawn. Seen in shipped styles.",
          "type": "object",
          "required": [
            "color_stops"
          ],
          "properties": {
            "color_stops": {
              "type": "object",
              "required": [
                "color_stop"
              ],
              "properties": {
                "color_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "color"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "color": {
                        "$ref": "#/$defs/packedColor"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 8
        },
        "text-color": {
          "description": "The color with which the text will be drawn. Seen in shipped styles.",
          "type": "object",
          "required": [
            "color_stops"
          ],
          "properties": {
            "color_stops": {
              "type": "object",
              "required": [
                "color_stop"
              ],
              "properties": {
                "color_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "color"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "color": {
                        "$ref": "#/$defs/packedColor"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 10
        },
        "text-outline-color": {
          "description": "The text outline color. Seen in shipped styles.",
          "type": "object",
          "required": [
            "color_stops"
          ],
          "properties": {
            "color_stops": {
              "type": "object",
              "required": [
                "color_stop"
              ],
              "properties": {
                "color_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "color"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "color": {
                        "$ref": "#/$defs/packedColor"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 12
        },
        "background-symbol-color": {
          "description": "The text background color Written by Studio; not seen in a shipped style. The map engine reads it.",
          "type": "object",
          "required": [
            "color_stops"
          ],
          "properties": {
            "color_stops": {
              "type": "object",
              "required": [
                "color_stop"
              ],
              "properties": {
                "color_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "color"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "color": {
                        "$ref": "#/$defs/packedColor"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 37
        },
        "fill-opacity": {
          "description": "The opacity at which the polygon will be drawn. Seen in shipped styles.",
          "type": "object",
          "required": [
            "opacity_stops"
          ],
          "properties": {
            "opacity_stops": {
              "type": "object",
              "required": [
                "opacity_stop"
              ],
              "properties": {
                "opacity_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "opacity"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "opacity": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 2
        },
        "fill-outline-opacity": {
          "description": "The opacity at which the polygon border will be drawn. Seen in shipped styles.",
          "type": "object",
          "required": [
            "opacity_stops"
          ],
          "properties": {
            "opacity_stops": {
              "type": "object",
              "required": [
                "opacity_stop"
              ],
              "properties": {
                "opacity_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "opacity"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "opacity": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 4
        },
        "line-width": {
          "description": "Line thickness. Seen in shipped styles. Shipped basemaps (tile-data layers): typical 2, largest 13, 39 distinct values. Reference values, not limits.",
          "type": "object",
          "required": [
            "line_width_stops"
          ],
          "properties": {
            "line_width_stops": {
              "type": "object",
              "required": [
                "line_width_stop"
              ],
              "properties": {
                "line_width_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "width"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "width": {
                        "type": "number",
                        "minimum": 0
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 5
        },
        "line-outline-width": {
          "description": "Border thickness. Seen in shipped styles. Shipped basemaps (tile-data layers): typical 0.15, largest 1.5, 12 distinct values. Reference values, not limits.",
          "type": "object",
          "required": [
            "line_width_stops"
          ],
          "properties": {
            "line_width_stops": {
              "type": "object",
              "required": [
                "line_width_stop"
              ],
              "properties": {
                "line_width_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "width"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "width": {
                        "type": "number",
                        "minimum": 0
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 6
        },
        "text-size": {
          "description": "Font size. Seen in shipped styles. Shipped basemaps (tile-data layers): typical 2.5, largest 6, 17 distinct values. Reference values, not limits. Far above the largest shipped value, symbols collide with each other and disappear.",
          "type": "object",
          "required": [
            "text_size_stops"
          ],
          "properties": {
            "text_size_stops": {
              "type": "object",
              "required": [
                "text_size_stop"
              ],
              "properties": {
                "text_size_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "size"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "size": {
                        "type": "number",
                        "minimum": 0
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 9
        },
        "text-outline-size": {
          "description": "The text outline thickness. Seen in shipped styles. Shipped basemaps (tile-data layers): typical 1, largest 3, 4 distinct values. Reference values, not limits.",
          "type": "object",
          "required": [
            "text_size_stops"
          ],
          "properties": {
            "text_size_stops": {
              "type": "object",
              "required": [
                "text_size_stop"
              ],
              "properties": {
                "text_size_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "size"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "size": {
                        "type": "number",
                        "minimum": 0
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 11
        },
        "text-padding": {
          "description": "Size of the additional area around the text bounding box used for detecting symbol collisions. Seen in shipped styles. Shipped basemaps (tile-data layers): typical 20, largest 20, 1 distinct values. Reference values, not limits.",
          "type": "object",
          "required": [
            "text_padding_stops"
          ],
          "properties": {
            "text_padding_stops": {
              "type": "object",
              "required": [
                "text_padding_stop"
              ],
              "properties": {
                "text_padding_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "size"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "size": {
                        "type": "number",
                        "minimum": 0
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 16
        },
        "text-max-width": {
          "description": "The maximum line width for text wrapping. Seen in shipped styles. Shipped basemaps (tile-data layers): typical 0, largest 0, 1 distinct values. Reference values, not limits.",
          "type": "object",
          "required": [
            "text_max_width_stops"
          ],
          "properties": {
            "text_max_width_stops": {
              "type": "object",
              "required": [
                "text_max_width_stop"
              ],
              "properties": {
                "text_max_width_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "size"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "size": {
                        "type": "number",
                        "minimum": 0
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 15
        },
        "text-row-height": {
          "description": "Text leading value for multi-line text. Seen in shipped styles. Shipped basemaps (tile-data layers): typical 1, largest 1, 2 distinct values. Reference values, not limits.",
          "type": "object",
          "required": [
            "text_row_height_stops"
          ],
          "properties": {
            "text_row_height_stops": {
              "type": "object",
              "required": [
                "text_row_height_stop"
              ],
              "properties": {
                "text_row_height_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "size"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "size": {
                        "type": "number",
                        "minimum": 0
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 14
        },
        "icon-size": {
          "description": "The size of the image. Seen in shipped styles. Shipped basemaps (tile-data layers): typical 3, largest 6, 4 distinct values. Reference values, not limits. Far above the largest shipped value, symbols collide with each other and disappear.",
          "type": "object",
          "required": [
            "icon_size_stops"
          ],
          "properties": {
            "icon_size_stops": {
              "type": "object",
              "required": [
                "icon_size_stop"
              ],
              "properties": {
                "icon_size_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "size"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "size": {
                        "type": "number",
                        "minimum": 0
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 25
        },
        "icon-padding": {
          "description": "Size of the additional area around the icon bounding box used for detecting symbol collisions. Seen in shipped styles. Shipped basemaps (tile-data layers): typical 20, largest 20, 1 distinct values. Reference values, not limits.",
          "type": "object",
          "required": [
            "icon_padding_stops"
          ],
          "properties": {
            "icon_padding_stops": {
              "type": "object",
              "required": [
                "icon_padding_stop"
              ],
              "properties": {
                "icon_padding_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "size"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "size": {
                        "type": "number",
                        "minimum": 0
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 17
        },
        "icon": {
          "description": "The texture which will fill the layer surface. Seen in shipped styles.",
          "type": "object",
          "required": [
            "icon_stops"
          ],
          "properties": {
            "icon_stops": {
              "type": "object",
              "required": [
                "icon_stop"
              ],
              "properties": {
                "icon_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "custom_icon"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "custom_icon": {
                        "$ref": "#/$defs/iconRef"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 13
        },
        "text-anchor": {
          "description": "Part of the text placed closest to the anchor. Seen in shipped styles.",
          "type": "object",
          "required": [
            "text_anchor_stops"
          ],
          "properties": {
            "text_anchor_stops": {
              "type": "object",
              "required": [
                "text_anchor_stop"
              ],
              "properties": {
                "text_anchor_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "intvalue"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "intvalue": {
                        "type": "integer",
                        "enum": [
                          1,
                          2,
                          3,
                          4,
                          5,
                          6,
                          7,
                          8,
                          9
                        ],
                        "description": "1 = center-bottom, 2 = center-top, 3 = right-center, 4 = left-center, 5 = right-bottom, 6 = left-top, 7 = left-bottom, 8 = right-top, 9 = center-center"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 27
        },
        "text-transform": {
          "description": "Specifies how to capitalize text, similar to the CSS text-transform property. Seen in shipped styles.",
          "type": "object",
          "required": [
            "text_transform_stops"
          ],
          "properties": {
            "text_transform_stops": {
              "type": "object",
              "required": [
                "text_transform_stop"
              ],
              "properties": {
                "text_transform_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "intvalue"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "intvalue": {
                        "type": "integer",
                        "enum": [
                          0,
                          1,
                          2
                        ],
                        "description": "0 = none, 1 = lowercase, 2 = uppercase"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 34
        },
        "text-rotation-angle": {
          "description": "Rotates the text clockwise. Seen in shipped styles.",
          "type": "object",
          "required": [
            "angle-stops"
          ],
          "properties": {
            "angle-stops": {
              "type": "object",
              "required": [
                "angle_stop"
              ],
              "properties": {
                "angle_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "angle"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "angle": {
                        "type": "number"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 18
        },
        "text-style": {
          "description": "The style with which the text will be drawn. Written by Studio; not seen in a shipped style. The map engine reads it. Studio writes this wrapper without easing_type.",
          "type": "object",
          "required": [
            "text_style_stops"
          ],
          "properties": {
            "text_style_stops": {
              "type": "object",
              "required": [
                "text_style_stop"
              ],
              "properties": {
                "text_style_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "intvalue"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "intvalue": {
                        "type": "integer",
                        "enum": [
                          0,
                          1,
                          2
                        ],
                        "description": "0 = normal, 1 = bold, 2 = italic"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 36
        },
        "line-blur": {
          "description": "Blur applied to the line, in pixels. Written by Studio; not seen in a shipped style. The map engine reads it.",
          "type": "object",
          "required": [
            "line_blur_stops"
          ],
          "properties": {
            "line_blur_stops": {
              "type": "object",
              "required": [
                "line_blur_stop"
              ],
              "properties": {
                "line_blur_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "blur"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "blur": {
                        "type": "number",
                        "minimum": 0
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 20
        },
        "translate-on-X": {
          "description": "Distance that the text's anchor is moved from its original placement. Positive values indicate right, while negative values indicate left. Written by Studio; not seen in a shipped style. The map engine reads it.",
          "type": "object",
          "required": [
            "translate_stops"
          ],
          "properties": {
            "translate_stops": {
              "type": "object",
              "required": [
                "translate_stop"
              ],
              "properties": {
                "translate_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "value"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "value": {
                        "type": "number"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 21
        },
        "translate-on-Y": {
          "description": "Distance that the text's anchor is moved from its original placement. Positive values indicate down, while negative values indicate up. Written by Studio; not seen in a shipped style. The map engine reads it.",
          "type": "object",
          "required": [
            "translate_stops"
          ],
          "properties": {
            "translate_stops": {
              "type": "object",
              "required": [
                "translate_stop"
              ],
              "properties": {
                "translate_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "value"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "value": {
                        "type": "number"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 22
        },
        "offset-on-X": {
          "description": "Offset distance of text from its anchor. Positive values indicate right, while negative values indicate left Written by Studio; not seen in a shipped style. The map engine reads it.",
          "type": "object",
          "required": [
            "offset_stops"
          ],
          "properties": {
            "offset_stops": {
              "type": "object",
              "required": [
                "offset_stop"
              ],
              "properties": {
                "offset_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "value"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "value": {
                        "type": "number"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 23
        },
        "offset-on-Y": {
          "description": "Offset distance of text from its anchor. Positive values indicate down, while negative values indicate up. Written by Studio; not seen in a shipped style. The map engine reads it.",
          "type": "object",
          "required": [
            "offset_stops"
          ],
          "properties": {
            "offset_stops": {
              "type": "object",
              "required": [
                "offset_stop"
              ],
              "properties": {
                "offset_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "value"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "value": {
                        "type": "number"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 24
        },
        "icon-rotation-angle": {
          "description": "Rotates the icon clockwise. Written by Studio; not seen in a shipped style. The map engine reads it.",
          "type": "object",
          "required": [
            "angle_stops"
          ],
          "properties": {
            "angle_stops": {
              "type": "object",
              "required": [
                "angle_stop"
              ],
              "properties": {
                "angle_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "angle"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "angle": {
                        "type": "number"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 19
        },
        "text-justify": {
          "description": "Text justification options. Written by Studio; not seen in a shipped style. The map engine reads it. Studio writes this wrapper without easing_type.",
          "type": "object",
          "required": [
            "text_justify_stops"
          ],
          "properties": {
            "text_justify_stops": {
              "type": "object",
              "required": [
                "text_justify_stop"
              ],
              "properties": {
                "text_justify_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "intvalue"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "intvalue": {
                        "type": "integer",
                        "enum": [
                          1,
                          4,
                          7
                        ],
                        "description": "1 = left, 4 = center, 7 = right"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 26
        },
        "text-overlap": {
          "description": "If true, the text will be visible even if it collides with other previously drawn symbols. Written by Studio; not seen in a shipped style. The map engine reads it.",
          "type": "object",
          "required": [
            "text_overlap_stops"
          ],
          "properties": {
            "text_overlap_stops": {
              "type": "object",
              "required": [
                "text_overlap_stop"
              ],
              "properties": {
                "text_overlap_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "boolvalue"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "boolvalue": {
                        "type": "boolean"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 28
        },
        "text-optional": {
          "description": "If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not. Written by Studio; not seen in a shipped style. The map engine reads it.",
          "type": "object",
          "required": [
            "text_optional_stops"
          ],
          "properties": {
            "text_optional_stops": {
              "type": "object",
              "required": [
                "text_optional_stop"
              ],
              "properties": {
                "text_optional_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "boolvalue"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "boolvalue": {
                        "type": "boolean"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 30
        },
        "icon-overlap": {
          "description": "If true, the icon will be visible even if it collides with other previously drawn symbols. Written by Studio; not seen in a shipped style. The map engine reads it.",
          "type": "object",
          "required": [
            "icon_overlap_stops"
          ],
          "properties": {
            "icon_overlap_stops": {
              "type": "object",
              "required": [
                "icon_overlap_stop"
              ],
              "properties": {
                "icon_overlap_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "boolvalue"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "boolvalue": {
                        "type": "boolean"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 31
        },
        "icon-optional": {
          "description": "If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not. Written by Studio; not seen in a shipped style. The map engine reads it.",
          "type": "object",
          "required": [
            "icon_optional_stops"
          ],
          "properties": {
            "icon_optional_stops": {
              "type": "object",
              "required": [
                "icon_optional_stop"
              ],
              "properties": {
                "icon_optional_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "boolvalue"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "boolvalue": {
                        "type": "boolean"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 33
        },
        "icon-placement": {
          "description": "Icon placement relative to its geometry. Written by Studio; not seen in a shipped style. The map engine reads it.",
          "type": "object",
          "required": [
            "icon_placement_stops"
          ],
          "properties": {
            "icon_placement_stops": {
              "type": "object",
              "required": [
                "icon_placement_stop"
              ],
              "properties": {
                "icon_placement_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "boolvalue"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "boolvalue": {
                        "type": "boolean"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 32
        },
        "text-placement": {
          "description": "Label placement relative to its geometry. Written by Studio; not seen in a shipped style. The map engine reads it. Studio writes this wrapper without easing_type.",
          "type": "object",
          "required": [
            "text_placement_stops"
          ],
          "properties": {
            "text_placement_stops": {
              "type": "object",
              "required": [
                "text_placement_stop"
              ],
              "properties": {
                "text_placement_stop": {
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "required": [
                      "level_id",
                      "boolvalue"
                    ],
                    "properties": {
                      "level_id": {
                        "$ref": "#/$defs/styleZoom"
                      },
                      "boolvalue": {
                        "type": "boolean"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "easing_type": {
                  "$ref": "#/$defs/easingType"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 29
        },
        "3dMesh": {
          "type": "integer",
          "enum": [
            0,
            1
          ],
          "description": "The dimension at which the buildings will be drawn. 2D dimension has no effect when an elevation layer is being used. A bare value: no wrapper, no stops, does not vary with zoom. 0 = 2D, 1 = 3D.",
          "x-field-id": 35
        }
      },
      "additionalProperties": false
    },
    "layer": {
      "type": "object",
      "required": [
        "id",
        "type",
        "paint"
      ],
      "properties": {
        "COMMENT": {
          "type": "string",
          "description": "Studio writes the layer's name here. Not in the engine field map: the engine ignores it."
        },
        "id": {
          "type": "integer",
          "minimum": 1,
          "description": "Draw position: the first layer has the highest id, the last has 1.",
          "x-field-id": 1
        },
        "type": {
          "enum": [
            "areaname",
            "atmosphere",
            "background",
            "buildings",
            "contour_label",
            "contour_polyline",
            "country",
            "draw_points",
            "draw_poly",
            "drawpath",
            "elevation",
            "highlighted_lmks",
            "hillshade",
            "line",
            "linkarrows",
            "lmk_store",
            "paths",
            "polygon",
            "polyline",
            "raster",
            "roadshield",
            "route_bike_primary",
            "route_bike_secondary",
            "route_car_primary",
            "route_car_secondary",
            "route_dir_arrows",
            "route_label_bike_primary",
            "route_label_bike_secondary",
            "route_label_car_primary",
            "route_label_car_secondary",
            "route_label_pedestrian_primary",
            "route_label_pedestrian_secondary",
            "route_label_pt_primary",
            "route_label_pt_secondary",
            "route_pedestrian_primary",
            "route_pedestrian_secondary",
            "route_pt_primary",
            "route_pt_secondary",
            "route_traffic",
            "route_waypoints",
            "social_reports",
            "street",
            "symbol",
            "symbol group",
            "traffic_icons",
            "traffic_links",
            "traveled_route_bike",
            "traveled_route_car",
            "traveled_route_pedestrian",
            "traveled_route_pt",
            "turn_arrow",
            "wind"
          ],
          "description": "The engine layer type. Which paint properties a type takes is checked below.",
          "x-field-id": 5
        },
        "source": {
          "enum": [
            "map",
            "overlay",
            "satellite",
            "satelliteExternal",
            "elevation",
            "weather",
            "contourpolyline"
          ],
          "description": "A built-in source name: map (the basemap tiles), overlay, satellite, satelliteExternal (must be declared in sources_list), elevation, weather (wind), contourpolyline (contour lines).",
          "x-field-id": 3
        },
        "sourcedata_id": {
          "type": "integer",
          "minimum": 0,
          "description": "The tile data the layer draws: a basemap or Overlays source number, or the tileset number of an uploaded data source. The number is unique only together with the layer type: the same number is different data in different types (0 is Land on a polygon layer, Motorway on a line layer, Metropolis labels on a symbol layer; 12 is POIs on a symbol layer). The numbers each type draws are listed at https://developer.magiclane.com/docs/guides/map-studio/reference/map-data-sources/",
          "x-field-id": 4
        },
        "minzoom": {
          "$ref": "#/$defs/styleZoom",
          "x-field-id": 8
        },
        "maxzoom": {
          "$ref": "#/$defs/styleZoom",
          "x-field-id": 9
        },
        "group_id": {
          "type": "integer",
          "description": "The id of the group the layer sits in.",
          "x-field-id": 10
        },
        "filter": {
          "$ref": "#/$defs/filter"
        },
        "label_text": {
          "$ref": "#/$defs/labelText"
        },
        "paint": {
          "$ref": "#/$defs/paint"
        },
        "metaCategoryID": {
          "type": "integer",
          "minimum": 0,
          "description": "The POI category a POI layer draws, a layer field beside minzoom (never inside paint). The engine draws the category icon from it, so a POI layer does not set icon. Layer types that take it: symbol.",
          "x-field-id": 15
        },
        "contour_interval": {
          "type": "number",
          "exclusiveMinimum": 0,
          "description": "The contour interval. Layer types that take it: contour_label, contour_polyline, polyline.",
          "x-field-id": 20
        },
        "isTemplate": {
          "enum": [
            0,
            1
          ],
          "description": "1 on layers drawn from app state at run time (routes, traffic, reports) rather than tile data.",
          "x-field-id": 12
        },
        "name": {
          "type": "string",
          "x-field-id": 2,
          "x-written-by-studio": false,
          "description": "The layer's name in the engine field map. Studio writes the name to COMMENT instead."
        },
        "offline_grabber": {
          "type": "object",
          "properties": {
            "max_level": {
              "type": "integer",
              "minimum": 0,
              "x-field-id": 1,
              "x-written-by-studio": false
            },
            "max_tile_count": {
              "type": "integer",
              "minimum": 0,
              "x-field-id": 2,
              "x-written-by-studio": false
            }
          },
          "additionalProperties": false,
          "x-field-id": 14,
          "x-written-by-studio": false,
          "description": "In the engine field map; Studio does not write it."
        },
        "data_source": {
          "type": "string",
          "x-field-id": 16,
          "x-written-by-studio": false,
          "description": "In the engine field map; Studio does not write it."
        },
        "data_query": {
          "type": "string",
          "x-field-id": 17,
          "x-written-by-studio": false,
          "description": "In the engine field map; Studio does not write it."
        },
        "data_agg_expr": {
          "type": "string",
          "x-field-id": 18,
          "x-written-by-studio": false,
          "description": "In the engine field map; Studio does not write it."
        },
        "data_cluster": {
          "type": "string",
          "x-field-id": 19,
          "x-written-by-studio": false,
          "description": "In the engine field map; Studio does not write it."
        }
      },
      "additionalProperties": false,
      "allOf": [
        {
          "if": {
            "properties": {
              "type": {
                "const": "areaname"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "text-color",
                    "text-size",
                    "text-outline-color",
                    "text-outline-size",
                    "text-transform",
                    "text-style",
                    "text-row-height",
                    "text-max-width",
                    "fill-opacity",
                    "icon",
                    "icon-size",
                    "text-justify",
                    "text-anchor",
                    "text-rotation-angle",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y",
                    "text-overlap",
                    "text-placement",
                    "text-optional",
                    "text-padding"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "atmosphere"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "maxProperties": 0
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "background"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "fill-color",
                    "fill-opacity"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "buildings"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "fill-color",
                    "fill-opacity",
                    "fill-outline-color",
                    "fill-outline-opacity",
                    "3dMesh"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "contour_label"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "fill-color",
                    "text-color",
                    "text-size",
                    "text-outline-color",
                    "text-outline-size",
                    "text-transform",
                    "text-style",
                    "text-row-height",
                    "text-max-width",
                    "fill-opacity",
                    "icon-size",
                    "text-justify",
                    "text-anchor",
                    "text-rotation-angle",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y",
                    "text-overlap",
                    "text-placement",
                    "text-optional",
                    "text-padding"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "contour_polyline"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "line-width",
                    "fill-opacity"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "country"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "text-color",
                    "text-size",
                    "text-outline-color",
                    "text-outline-size",
                    "text-transform",
                    "text-style",
                    "text-row-height",
                    "text-max-width",
                    "fill-opacity",
                    "icon",
                    "icon-size",
                    "text-justify",
                    "text-anchor",
                    "text-rotation-angle",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y",
                    "text-overlap",
                    "text-placement",
                    "text-optional",
                    "text-padding"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "draw_points"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "icon-size"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "draw_poly"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "line-width",
                    "fill-opacity",
                    "line-outer-color",
                    "line-outline-width",
                    "line-blur",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "drawpath"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "line-width",
                    "fill-opacity",
                    "line-outer-color",
                    "line-outline-width",
                    "line-blur",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "elevation"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "fill-opacity"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "highlighted_lmks"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "text-color",
                    "text-size",
                    "text-outline-color",
                    "text-outline-size",
                    "text-transform",
                    "text-style",
                    "text-row-height",
                    "text-max-width",
                    "fill-opacity",
                    "icon",
                    "icon-size",
                    "text-justify",
                    "text-anchor",
                    "text-rotation-angle",
                    "icon-rotation-angle",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y",
                    "text-overlap",
                    "text-placement",
                    "text-optional",
                    "text-padding",
                    "icon-overlap",
                    "icon-placement",
                    "icon-optional",
                    "icon-padding"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "hillshade"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "fill-opacity"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "line"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "line-width",
                    "line-outer-color",
                    "line-outline-width",
                    "line-blur",
                    "fill-opacity",
                    "icon",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "linkarrows"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "fill-opacity"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "lmk_store"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "text-color",
                    "text-size",
                    "text-style",
                    "icon",
                    "icon-size",
                    "text-justify",
                    "text-anchor",
                    "text-rotation-angle",
                    "icon-rotation-angle",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y",
                    "text-overlap",
                    "text-placement",
                    "text-optional",
                    "text-padding",
                    "icon-overlap",
                    "icon-placement",
                    "icon-optional",
                    "icon-padding"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "paths"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "line-width",
                    "fill-opacity",
                    "line-outer-color",
                    "line-outline-width",
                    "line-blur",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "polygon"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "fill-color",
                    "fill-opacity",
                    "fill-outline-color",
                    "fill-outline-opacity",
                    "icon",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "polyline"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "line-width",
                    "fill-opacity",
                    "line-outer-color",
                    "line-outline-width",
                    "line-blur",
                    "icon",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "raster"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "fill-opacity"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "roadshield"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "text-size",
                    "text-style",
                    "icon",
                    "icon-size",
                    "text-justify",
                    "text-anchor",
                    "text-rotation-angle",
                    "icon-rotation-angle",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y",
                    "text-overlap",
                    "text-placement",
                    "text-optional",
                    "text-padding",
                    "icon-overlap",
                    "icon-placement",
                    "icon-optional",
                    "icon-padding"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "route_bike_primary"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "line-width",
                    "fill-opacity",
                    "line-outer-color",
                    "line-outline-width",
                    "line-blur",
                    "icon",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "route_bike_secondary"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "line-width",
                    "fill-opacity",
                    "line-outer-color",
                    "line-outline-width",
                    "line-blur",
                    "icon",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "route_car_primary"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "line-width",
                    "fill-opacity",
                    "line-outer-color",
                    "line-outline-width",
                    "line-blur",
                    "icon",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "route_car_secondary"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "line-width",
                    "fill-opacity",
                    "line-outer-color",
                    "line-outline-width",
                    "line-blur",
                    "icon",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "route_dir_arrows"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "fill-opacity",
                    "line-outer-color",
                    "line-blur"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "route_label_bike_primary"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "fill-color",
                    "text-color",
                    "text-size",
                    "text-outline-color",
                    "text-outline-size",
                    "text-transform",
                    "text-style",
                    "text-row-height",
                    "text-max-width",
                    "fill-opacity",
                    "icon",
                    "icon-size",
                    "text-justify",
                    "text-anchor",
                    "text-rotation-angle",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y",
                    "text-overlap",
                    "text-placement",
                    "text-optional",
                    "text-padding"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "route_label_bike_secondary"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "fill-color",
                    "text-color",
                    "text-size",
                    "text-outline-color",
                    "text-outline-size",
                    "text-transform",
                    "text-style",
                    "text-row-height",
                    "text-max-width",
                    "fill-opacity",
                    "icon",
                    "icon-size",
                    "text-justify",
                    "text-anchor",
                    "text-rotation-angle",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y",
                    "text-overlap",
                    "text-placement",
                    "text-optional",
                    "text-padding"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "route_label_car_primary"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "fill-color",
                    "text-color",
                    "text-size",
                    "text-outline-color",
                    "text-outline-size",
                    "text-transform",
                    "text-style",
                    "text-row-height",
                    "text-max-width",
                    "fill-opacity",
                    "icon",
                    "icon-size",
                    "text-justify",
                    "text-anchor",
                    "text-rotation-angle",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y",
                    "text-overlap",
                    "text-placement",
                    "text-optional",
                    "text-padding"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "route_label_car_secondary"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "fill-color",
                    "text-color",
                    "text-size",
                    "text-outline-color",
                    "text-outline-size",
                    "text-transform",
                    "text-style",
                    "text-row-height",
                    "text-max-width",
                    "fill-opacity",
                    "icon",
                    "icon-size",
                    "text-justify",
                    "text-anchor",
                    "text-rotation-angle",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y",
                    "text-overlap",
                    "text-placement",
                    "text-optional",
                    "text-padding"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "route_label_pedestrian_primary"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "fill-color",
                    "text-color",
                    "text-size",
                    "text-outline-color",
                    "text-outline-size",
                    "text-transform",
                    "text-style",
                    "text-row-height",
                    "text-max-width",
                    "fill-opacity",
                    "icon",
                    "icon-size",
                    "text-justify",
                    "text-anchor",
                    "text-rotation-angle",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y",
                    "text-overlap",
                    "text-placement",
                    "text-optional",
                    "text-padding"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "route_label_pedestrian_secondary"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "fill-color",
                    "text-color",
                    "text-size",
                    "text-outline-color",
                    "text-outline-size",
                    "text-transform",
                    "text-style",
                    "text-row-height",
                    "text-max-width",
                    "fill-opacity",
                    "icon",
                    "icon-size",
                    "text-justify",
                    "text-anchor",
                    "text-rotation-angle",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y",
                    "text-overlap",
                    "text-placement",
                    "text-optional",
                    "text-padding"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "route_label_pt_primary"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "fill-color",
                    "text-color",
                    "text-size",
                    "text-outline-color",
                    "text-outline-size",
                    "text-transform",
                    "text-style",
                    "text-row-height",
                    "text-max-width",
                    "fill-opacity",
                    "icon",
                    "icon-size",
                    "text-justify",
                    "text-anchor",
                    "text-rotation-angle",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y",
                    "text-overlap",
                    "text-placement",
                    "text-optional",
                    "text-padding"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "route_label_pt_secondary"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "fill-color",
                    "text-color",
                    "text-size",
                    "text-outline-color",
                    "text-outline-size",
                    "text-transform",
                    "text-style",
                    "text-row-height",
                    "text-max-width",
                    "fill-opacity",
                    "icon",
                    "icon-size",
                    "text-justify",
                    "text-anchor",
                    "text-rotation-angle",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y",
                    "text-overlap",
                    "text-placement",
                    "text-optional",
                    "text-padding"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "route_pedestrian_primary"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "line-width",
                    "fill-opacity",
                    "line-outer-color",
                    "line-outline-width",
                    "line-blur",
                    "icon",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "route_pedestrian_secondary"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "line-width",
                    "fill-opacity",
                    "line-outer-color",
                    "line-outline-width",
                    "line-blur",
                    "icon",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "route_pt_primary"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "line-width",
                    "fill-opacity",
                    "line-outer-color",
                    "line-outline-width",
                    "line-blur",
                    "icon",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "route_pt_secondary"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "line-width",
                    "fill-opacity",
                    "line-outer-color",
                    "line-outline-width",
                    "line-blur",
                    "icon",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "route_traffic"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "line-width",
                    "fill-opacity",
                    "line-outer-color",
                    "line-outline-width",
                    "line-blur",
                    "icon",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "route_waypoints"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "icon",
                    "icon-size",
                    "icon-rotation-angle",
                    "icon-overlap",
                    "icon-placement",
                    "icon-optional",
                    "icon-padding"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "social_reports"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "text-color",
                    "text-size",
                    "text-outline-color",
                    "text-outline-size",
                    "text-transform",
                    "text-style",
                    "text-row-height",
                    "text-max-width",
                    "fill-opacity",
                    "icon",
                    "icon-size",
                    "text-justify",
                    "text-anchor",
                    "text-rotation-angle",
                    "icon-rotation-angle",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y",
                    "text-overlap",
                    "text-placement",
                    "text-optional",
                    "text-padding",
                    "icon-overlap",
                    "icon-placement",
                    "icon-optional",
                    "icon-padding"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "street"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "text-color",
                    "text-size",
                    "text-outline-color",
                    "text-outline-size",
                    "text-transform",
                    "text-style",
                    "text-row-height",
                    "text-max-width",
                    "fill-opacity",
                    "icon",
                    "icon-size",
                    "text-justify",
                    "text-anchor",
                    "text-rotation-angle",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y",
                    "text-overlap",
                    "text-placement",
                    "text-optional",
                    "text-padding"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "symbol"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "text-color",
                    "text-size",
                    "text-outline-color",
                    "background-symbol-color",
                    "text-outline-size",
                    "text-transform",
                    "text-style",
                    "text-row-height",
                    "text-max-width",
                    "fill-opacity",
                    "icon",
                    "icon-size",
                    "text-justify",
                    "text-anchor",
                    "text-rotation-angle",
                    "icon-rotation-angle",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y",
                    "text-overlap",
                    "text-placement",
                    "text-optional",
                    "text-padding",
                    "icon-overlap",
                    "icon-placement",
                    "icon-optional",
                    "icon-padding"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "symbol group"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "text-color",
                    "text-size",
                    "text-outline-color",
                    "text-outline-size",
                    "text-transform",
                    "text-style",
                    "text-row-height",
                    "text-max-width",
                    "fill-opacity",
                    "icon",
                    "icon-size",
                    "text-justify",
                    "text-anchor",
                    "text-rotation-angle",
                    "icon-rotation-angle",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y",
                    "text-overlap",
                    "text-placement",
                    "text-optional",
                    "text-padding",
                    "icon-overlap",
                    "icon-placement",
                    "icon-optional",
                    "icon-padding"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "traffic_icons"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "text-size",
                    "text-style",
                    "icon",
                    "icon-size",
                    "text-justify",
                    "text-anchor",
                    "text-rotation-angle",
                    "icon-rotation-angle",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y",
                    "text-overlap",
                    "text-placement",
                    "text-optional",
                    "text-padding",
                    "icon-overlap",
                    "icon-placement",
                    "icon-optional",
                    "icon-padding"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "traffic_links"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "line-width",
                    "fill-opacity",
                    "line-outer-color",
                    "line-outline-width",
                    "line-blur",
                    "icon",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "traveled_route_bike"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "line-width",
                    "fill-opacity",
                    "line-outer-color",
                    "line-outline-width",
                    "line-blur",
                    "icon",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "traveled_route_car"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "line-width",
                    "fill-opacity",
                    "line-outer-color",
                    "line-outline-width",
                    "line-blur",
                    "icon",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "traveled_route_pedestrian"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "line-width",
                    "fill-opacity",
                    "line-outer-color",
                    "line-outline-width",
                    "line-blur",
                    "icon",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "traveled_route_pt"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "line-width",
                    "fill-opacity",
                    "line-outer-color",
                    "line-outline-width",
                    "line-blur",
                    "icon",
                    "translate-on-X",
                    "translate-on-Y",
                    "offset-on-X",
                    "offset-on-Y"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "turn_arrow"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "propertyNames": {
                  "enum": [
                    "line-inner-color",
                    "line-width",
                    "fill-opacity",
                    "line-outer-color",
                    "line-outline-width",
                    "line-blur"
                  ]
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "wind"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "paint": {
                "maxProperties": 0
              }
            }
          }
        }
      ]
    },
    "icon": {
      "type": "object",
      "required": [
        "id",
        "value"
      ],
      "properties": {
        "id": {
          "type": "string",
          "minLength": 1,
          "description": "The name layers use to refer to the image, such as \"dunga1.png\". The compiler stores it as a number in the .style file.",
          "x-field-id": 1
        },
        "value": {
          "type": "string",
          "pattern": "^data:(image/png|image/jpeg|image/svg\\+xml)(;[^,]*)?,",
          "description": "The image as a data URI: image/png, image/jpeg, image/svg+xml. Base64 for PNG and JPEG; SVG may be base64 or percent-encoded text.",
          "x-field-id": 2
        }
      },
      "additionalProperties": false
    }
  }
}
