{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "version": "1.0.2",
    "definitions": {
        "cr": {
            "type": "integer",
            "minimum": 0,
            "maximum": 30,
            "required": [
                "type",
                "minimum",
                "maximum"
            ],
            "additionalProperties": false
        },
        "d100": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "required": [
                "type",
                "minimum",
                "maximum"
            ],
            "additionalProperties": false
        },
        "coin": {
            "type": "object",
            "properties": {
                "cp": {
                    "type": "string"
                },
                "sp": {
                    "type": "string"
                },
                "ep": {
                    "type": "string"
                },
                "gp": {
                    "type": "string"
                },
                "pp": {
                    "type": "string"
                }
            },
            "additionalProperties": false
        },
        "lootTypeAmount": {
            "type": "object",
            "properties": {
                "type": {
                    "type": "string"
                },
                "amount": {
                    "type": "string"
                }
            },
            "required": [
                "type",
                "amount"
            ],
            "additionalProperties": false
        },
        "gems_or_art": {
            "type": "array",
            "_uniqueItems": true,
            "items": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string"
                    },
                    "source": {
                        "type": "string"
                    },
                    "page": {
                        "type": "integer"
                    },
                    "type": {
                        "type": "string"
                    },
                    "table": {
                        "type": "array",
                        "_uniqueItems": true,
                        "items": {
                            "type": "string"
                        }
                    }
                },
                "required": [
                    "name",
                    "source",
                    "page",
                    "type",
                    "table"
                ],
                "additionalProperties": false
            }
        },
        "table": {
            "type": "array",
            "_uniqueItems": true,
            "items": {
                "type": "object",
                "properties": {
                    "min": {
                        "$ref": "#/definitions/d100"
                    },
                    "max": {
                        "$ref": "#/definitions/d100"
                    },
                    "item": {
                        "type": "string"
                    },
                    "spellLevel": {
                        "type": "integer"
                    },
                    "table": {
                        "$ref": "#/definitions/table"
                    },
                    "choose": {
                        "type": "object",
                        "properties": {
                            "fromGroup": {
                                "type": "array",
                                "items": {
                                    "type": "string"
                                }
                            },
                            "fromGeneric": {
                                "type": "array",
                                "items": {
                                    "type": "string"
                                }
                            },
                            "fromItems": {
                                "type": "array",
                                "items": {
                                    "type": "string"
                                }
                            }
                        },
                        "additionalProperties": false
                    }
                },
                "additionalProperties": false
            }
        }
    },
    "type": "object",
    "properties": {
        "individual": {
            "type": "array",
            "_uniqueItems": true,
            "items": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string"
                    },
                    "source": {
                        "type": "string"
                    },
                    "page": {
                        "type": "integer"
                    },
                    "mincr": {
                        "$ref": "#/definitions/cr"
                    },
                    "maxcr": {
                        "$ref": "#/definitions/cr"
                    },
                    "table": {
                        "type": "array",
                        "_uniqueItems": true,
                        "items": {
                            "type": "object",
                            "properties": {
                                "min": {
                                    "$ref": "#/definitions/d100"
                                },
                                "max": {
                                    "$ref": "#/definitions/d100"
                                },
                                "coins": {
                                    "$ref": "#/definitions/coin"
                                }
                            },
                            "required": [
                                "min",
                                "max",
                                "coins"
                            ],
                            "additionalProperties": false
                        }
                    }
                },
                "required": [
                    "name",
                    "source",
                    "page",
                    "mincr",
                    "maxcr",
                    "table"
                ],
                "additionalProperties": false
            }
        },
        "hoard": {
            "type": "array",
            "_uniqueItems": true,
            "items": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string"
                    },
                    "source": {
                        "type": "string"
                    },
                    "page": {
                        "type": "integer"
                    },
                    "mincr": {
                        "$ref": "#/definitions/cr"
                    },
                    "maxcr": {
                        "$ref": "#/definitions/cr"
                    },
                    "coins": {
                        "$ref": "#/definitions/coin"
                    },
                    "table": {
                        "type": "array",
                        "_uniqueItems": true,
                        "items": {
                            "type": "object",
                            "properties": {
                                "min": {
                                    "$ref": "#/definitions/d100"
                                },
                                "max": {
                                    "$ref": "#/definitions/d100"
                                },
                                "gems": {
                                    "$ref": "#/definitions/lootTypeAmount"
                                },
                                "artobjects": {
                                    "$ref": "#/definitions/lootTypeAmount"
                                },
                                "magicitems": {
                                    "$ref": "#/definitions/lootTypeAmount"
                                }
                            },
                            "required": [
                                "min",
                                "max"
                            ],
                            "additionalProperties": false
                        }
                    }
                },
                "required": [
                    "name",
                    "source",
                    "page",
                    "mincr",
                    "maxcr",
                    "coins",
                    "table"
                ],
                "additionalProperties": false
            }
        },
        "gemstones": {
            "$ref": "#/definitions/gems_or_art"
        },
        "artobjects": {
            "$ref": "#/definitions/gems_or_art"
        },
        "magicitems": {
            "type": "array",
            "_uniqueItems": true,
            "items": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string"
                    },
                    "source": {
                        "type": "string"
                    },
                    "page": {
                        "type": "integer"
                    },
                    "type": {
                        "type": "string"
                    },
                    "table": {
                        "$ref": "#/definitions/table"
                    }
                },
                "required": [
                    "name",
                    "source",
                    "page",
                    "type",
                    "table"
                ],
                "additionalProperties": false
            }
        }
    },
    "required": [
        "individual",
        "hoard",
        "gemstones",
        "artobjects",
        "magicitems"
    ],
    "additionalProperties": false
}