{
  "$schema": "http://json-schema.org/draft-06/schema#",
  "definitions": {
    "ElementaryTypeName": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "integer"
        },
        "name": {
          "type": "string"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "ElementaryTypeName"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "stateMutability": {
          "$ref": "#/definitions/StateMutability"
        },
        "typeDescriptions": {
          "$ref": "#/definitions/TypeDescriptions"
        }
      },
      "required": [
        "id",
        "name",
        "nodeType",
        "src",
        "typeDescriptions"
      ],
      "title": "ElementaryTypeName"
    },
    "TypeDescriptions": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "typeIdentifier": {
          "anyOf": [
            { "type": "string" },
            { "type": "null" }
          ]
        },
        "typeString": {
          "anyOf": [
            { "type": "string" },
            { "type": "null" }
          ]
        }
      },
      "required": [
      ],
      "title": "TypeDescriptions"
    },
    "Expression": {
      "anyOf": [
        { "$ref": "#/definitions/Assignment" },
        { "$ref": "#/definitions/BinaryOperation" },
        { "$ref": "#/definitions/Conditional" },
        { "$ref": "#/definitions/ElementaryTypeNameExpression" },
        { "$ref": "#/definitions/FunctionCall" },
        { "$ref": "#/definitions/FunctionCallOptions" },
        { "$ref": "#/definitions/Identifier" },
        { "$ref": "#/definitions/IndexAccess" },
        { "$ref": "#/definitions/Literal" },
        { "$ref": "#/definitions/MemberAccess" },
        { "$ref": "#/definitions/NewExpression" },
        { "$ref": "#/definitions/TupleExpression" },
        { "$ref": "#/definitions/UnaryOperation" }
      ]
    },
    "Assignment": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "argumentTypes": {
          "anyOf": [
            { "type": "null" },
            {
              "type": "array",
              "items": {
                "$ref": "#/definitions/TypeDescriptions"
              }
            }
          ]
        },
        "id": {
          "type": "integer"
        },
        "isConstant": {
          "type": "boolean"
        },
        "isLValue": {
          "type": "boolean"
        },
        "isPure": {
          "type": "boolean"
        },
        "lValueRequested": {
          "type": "boolean"
        },
        "leftHandSide": {
          "$ref": "#/definitions/Expression"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "Assignment"
          ]
        },
        "operator": {
          "type": "string",
          "enum": [
            "=",
            "+=",
            "/="
          ]
        },
        "rightHandSide": {
          "$ref": "#/definitions/Expression"
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "typeDescriptions": {
          "$ref": "#/definitions/TypeDescriptions"
        }
      },
      "required": [
        "id",
        "isConstant",
        "isLValue",
        "isPure",
        "lValueRequested",
        "leftHandSide",
        "nodeType",
        "operator",
        "rightHandSide",
        "src",
        "typeDescriptions"
      ],
      "title": "Assignment"
    },
    "BinaryOperation": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "argumentTypes": {
          "anyOf": [
            { "type": "null" },
            {
              "type": "array",
              "items": {
                "$ref": "#/definitions/TypeDescriptions"
              }
            }
          ]
        },
        "commonType": {
          "$ref": "#/definitions/TypeDescriptions"
        },
        "id": {
          "type": "integer"
        },
        "isConstant": {
          "type": "boolean"
        },
        "isLValue": {
          "type": "boolean"
        },
        "isPure": {
          "type": "boolean"
        },
        "lValueRequested": {
          "type": "boolean"
        },
        "leftExpression": {
          "$ref": "#/definitions/Expression"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "BinaryOperation"
          ]
        },
        "operator": {
          "type": "string",
          "enum": [
            "+",
            "-",
            "*",
            "/",
            "%",
            "**",
            "&&",
            "||",
            "!=",
            "==",
            "<",
            "<=",
            ">",
            ">=",
            "^",
            "<<",
            ">>"
          ]
        },
        "rightExpression": {
          "$ref": "#/definitions/Expression"
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "typeDescriptions": {
          "$ref": "#/definitions/TypeDescriptions"
        }
      },
      "required": [
        "commonType",
        "id",
        "isConstant",
        "isLValue",
        "isPure",
        "lValueRequested",
        "leftExpression",
        "nodeType",
        "operator",
        "rightExpression",
        "src",
        "typeDescriptions"
      ],
      "title": "BinaryOperation"
    },
    "Conditional": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "argumentTypes": {
          "anyOf": [
            { "type": "null" },
            {
              "type": "array",
              "items": {
                "$ref": "#/definitions/TypeDescriptions"
              }
            }
          ]
        },
        "condition": {
          "$ref": "#/definitions/Expression"
        },
        "falseExpression": {
          "$ref": "#/definitions/Expression"
        },
        "id": {
          "type": "integer"
        },
        "isConstant": {
          "type": "boolean"
        },
        "isLValue": {
          "type": "boolean"
        },
        "isPure": {
          "type": "boolean"
        },
        "lValueRequested": {
          "type": "boolean"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "Conditional"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "trueExpression": {
          "$ref": "#/definitions/Expression"
        },
        "typeDescriptions": {
          "$ref": "#/definitions/TypeDescriptions"
        }
      },
      "required": [
        "condition",
        "falseExpression",
        "id",
        "isConstant",
        "isLValue",
        "isPure",
        "lValueRequested",
        "nodeType",
        "src",
        "trueExpression",
        "typeDescriptions"
      ],
      "title": "Conditional"
    },
    "ElementaryTypeNameExpression": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "argumentTypes": {
          "anyOf": [
            { "type": "null" },
            {
              "type": "array",
              "items": {
                "$ref": "#/definitions/TypeDescriptions"
              }
            }
          ]
        },
        "id": {
          "type": "integer"
        },
        "isConstant": {
          "type": "boolean"
        },
        "isLValue": {
          "type": "boolean"
        },
        "isPure": {
          "type": "boolean"
        },
        "lValueRequested": {
          "type": "boolean"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "ElementaryTypeNameExpression"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "typeDescriptions": {
          "$ref": "#/definitions/TypeDescriptions"
        },
        "typeName": {
          "$ref": "#/definitions/ElementaryTypeName"
        }
      },
      "required": [
        "id",
        "isConstant",
        "isLValue",
        "isPure",
        "lValueRequested",
        "nodeType",
        "src",
        "typeDescriptions",
        "typeName"
      ],
      "title": "ElementaryTypeNameExpression"
    },
    "IndexAccess": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "argumentTypes": {
          "anyOf": [
            { "type": "null" },
            {
              "type": "array",
              "items": {
                "$ref": "#/definitions/TypeDescriptions"
              }
            }
          ]
        },
        "baseExpression": {
          "$ref": "#/definitions/Expression"
        },
        "id": {
          "type": "integer"
        },
        "indexExpression": {
          "$ref": "#/definitions/Expression"
        },
        "isConstant": {
          "type": "boolean"
        },
        "isLValue": {
          "type": "boolean"
        },
        "isPure": {
          "type": "boolean"
        },
        "lValueRequested": {
          "type": "boolean"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "IndexAccess"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "typeDescriptions": {
          "$ref": "#/definitions/TypeDescriptions"
        }
      },
      "required": [
        "id",
        "indexExpression",
        "isConstant",
        "isLValue",
        "isPure",
        "lValueRequested",
        "nodeType",
        "src",
        "typeDescriptions"
      ],
      "title": "IndexAccess"
    },
    "FunctionCall": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "argumentTypes": {
          "anyOf": [
            { "type": "null" },
            {
              "type": "array",
              "items": {
                "$ref": "#/definitions/TypeDescriptions"
              }
            }
          ]
        },
        "arguments": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Expression"
          }
        },
        "expression": {
          "$ref": "#/definitions/Expression"
        },
        "id": {
          "type": "integer"
        },
        "isConstant": {
          "type": "boolean"
        },
        "isLValue": {
          "type": "boolean"
        },
        "isPure": {
          "type": "boolean"
        },
        "kind": {
          "type": "string",
          "enum": [
            "functionCall",
            "typeConversion",
            "structConstructorCall"
          ]
        },
        "lValueRequested": {
          "type": "boolean"
        },
        "names": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "FunctionCall"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "tryCall": {
          "type": "boolean"
        },
        "typeDescriptions": {
          "$ref": "#/definitions/TypeDescriptions"
        }
      },
      "required": [
        "arguments",
        "expression",
        "id",
        "isConstant",
        "isLValue",
        "isPure",
        "kind",
        "lValueRequested",
        "names",
        "nodeType",
        "src",
        "tryCall",
        "typeDescriptions"
      ],
      "title": "FunctionCall"
    },
    "FunctionCallOptions": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "argumentTypes": {
          "anyOf": [
            { "type": "null" },
            {
              "type": "array",
              "items": {
                "$ref": "#/definitions/TypeDescriptions"
              }
            }
          ]
        },
        "expression": {
          "$ref": "#/definitions/Expression"
        },
        "id": {
          "type": "integer"
        },
        "isConstant": {
          "type": "boolean"
        },
        "isLValue": {
          "type": "boolean"
        },
        "isPure": {
          "type": "boolean"
        },
        "lValueRequested": {
          "type": "boolean"
        },
        "names": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "FunctionCallOptions"
          ]
        },
        "options": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Expression"
          }
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "typeDescriptions": {
          "$ref": "#/definitions/TypeDescriptions"
        }
      },
      "required": [
        "expression",
        "id",
        "isConstant",
        "isLValue",
        "isPure",
        "lValueRequested",
        "names",
        "nodeType",
        "options",
        "src",
        "typeDescriptions"
      ],
      "title": "FunctionCallOptions"
    },
    "Literal": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "argumentTypes": {
          "anyOf": [
            { "type": "null" },
            {
              "type": "array",
              "items": {
                "$ref": "#/definitions/TypeDescriptions"
              }
            }
          ]
        },
        "hexValue": {
          "type": "string",
          "pattern": "^[0-9a-f]*$"
        },
        "id": {
          "type": "integer"
        },
        "isConstant": {
          "type": "boolean"
        },
        "isLValue": {
          "type": "boolean"
        },
        "isPure": {
          "type": "boolean"
        },
        "kind": {
          "type": "string",
          "enum": [
            "bool",
            "number",
            "string"
          ]
        },
        "lValueRequested": {
          "type": "boolean"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "Literal"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "subdenomination": {
          "type": "null"
        },
        "typeDescriptions": {
          "$ref": "#/definitions/TypeDescriptions"
        },
        "value": {
          "anyOf": [
            { "type": "null" },
            { "type": "string" }
          ]
        }
      },
      "required": [
        "hexValue",
        "id",
        "isConstant",
        "isLValue",
        "isPure",
        "kind",
        "lValueRequested",
        "nodeType",
        "src",
        "typeDescriptions"
      ],
      "title": "Literal"
    },
    "MemberAccess": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "argumentTypes": {
          "anyOf": [
            { "type": "null" },
            {
              "type": "array",
              "items": {
                "$ref": "#/definitions/TypeDescriptions"
              }
            }
          ]
        },
        "expression": {
          "$ref": "#/definitions/Expression"
        },
        "id": {
          "type": "integer"
        },
        "isConstant": {
          "type": "boolean"
        },
        "isLValue": {
          "type": "boolean"
        },
        "isPure": {
          "type": "boolean"
        },
        "lValueRequested": {
          "type": "boolean"
        },
        "memberName": {
          "type": "string"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "MemberAccess"
          ]
        },
        "referencedDeclaration": {
          "anyOf": [
            { "type": "null" },
            { "type": "integer" }
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "typeDescriptions": {
          "$ref": "#/definitions/TypeDescriptions"
        }
      },
      "required": [
        "expression",
        "id",
        "isConstant",
        "isLValue",
        "isPure",
        "lValueRequested",
        "nodeType",
        "src",
        "typeDescriptions"
      ],
      "title": "MemberAccess"
    },
    "NewExpression": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "argumentTypes": {
          "anyOf": [
            { "type": "null" },
            {
              "type": "array",
              "items": {
                "$ref": "#/definitions/TypeDescriptions"
              }
            }
          ]
        },
        "id": {
          "type": "integer"
        },
        "isConstant": {
          "type": "boolean"
        },
        "isLValue": {
          "type": "boolean"
        },
        "isPure": {
          "type": "boolean"
        },
        "lValueRequested": {
          "type": "boolean"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "NewExpression"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "typeDescriptions": {
          "$ref": "#/definitions/TypeDescriptions"
        },
        "typeName": {
          "$ref": "#/definitions/TypeName"
        }
      },
      "required": [
        "id",
        "isConstant",
        "isLValue",
        "isPure",
        "lValueRequested",
        "nodeType",
        "src",
        "typeDescriptions",
        "typeName"
      ],
      "title": "NewExpression"
    },
    "TupleExpression": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "argumentTypes": {
          "anyOf": [
            { "type": "null" },
            {
              "type": "array",
              "items": {
                "$ref": "#/definitions/TypeDescriptions"
              }
            }
          ]
        },
        "components": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Expression"
          }
        },
        "id": {
          "type": "integer"
        },
        "isConstant": {
          "type": "boolean"
        },
        "isInlineArray": {
          "type": "boolean"
        },
        "isLValue": {
          "type": "boolean"
        },
        "isPure": {
          "type": "boolean"
        },
        "lValueRequested": {
          "type": "boolean"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "TupleExpression"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "typeDescriptions": {
          "$ref": "#/definitions/TypeDescriptions"
        }
      },
      "required": [
        "components",
        "id",
        "isConstant",
        "isInlineArray",
        "isLValue",
        "isPure",
        "lValueRequested",
        "nodeType",
        "src",
        "typeDescriptions"
      ],
      "title": "TupleExpression"
    },
    "UnaryOperation": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "argumentTypes": {
          "anyOf": [
            { "type": "null" },
            {
              "type": "array",
              "items": {
                "$ref": "#/definitions/TypeDescriptions"
              }
            }
          ]
        },
        "id": {
          "type": "integer"
        },
        "isConstant": {
          "type": "boolean"
        },
        "isLValue": {
          "type": "boolean"
        },
        "isPure": {
          "type": "boolean"
        },
        "lValueRequested": {
          "type": "boolean"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "UnaryOperation"
          ]
        },
        "operator": {
          "type": "string",
          "enum": [
            "++",
            "--",
            "-",
            "!",
            "delete"
          ]
        },
        "prefix": {
          "type": "boolean"
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "subExpression": {
          "$ref": "#/definitions/Expression"
        },
        "typeDescriptions": {
          "$ref": "#/definitions/TypeDescriptions"
        }
      },
      "required": [
        "id",
        "isConstant",
        "isLValue",
        "isPure",
        "lValueRequested",
        "nodeType",
        "operator",
        "prefix",
        "src",
        "subExpression",
        "typeDescriptions"
      ],
      "title": "UnaryOperation"
    },
    "FunctionTypeName": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "integer"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "FunctionTypeName"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "stateMutability": {
          "$ref": "#/definitions/StateMutability"
        },
        "typeDescriptions": {
          "$ref": "#/definitions/TypeDescriptions"
        },
        "parameterTypes": {
          "$ref": "#/definitions/ParameterList"
        },
        "returnParameterTypes": {
          "$ref": "#/definitions/ParameterList"
        },
        "visibility": {
          "$ref": "#/definitions/Visibility"
        }
      },
      "required": [
        "id",
        "nodeType",
        "parameterTypes",
        "returnParameterTypes",
        "src",
        "stateMutability",
        "typeDescriptions",
        "visibility"
      ],
      "title": "FunctionTypeName"
    },
    "ForStatement": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "body": {
          "anyOf": [
            { "$ref": "#/definitions/Block" },
            { "$ref": "#/definitions/Statement" }
          ]
        },
        "condition": {
          "$ref": "#/definitions/Expression"
        },
        "id": {
          "type": "integer"
        },
        "initializationExpression": {
          "$ref": "#/definitions/VariableDeclarationStatement"
        },
        "loopExpression": {
          "$ref": "#/definitions/ExpressionStatement"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "ForStatement"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        }
      },
      "required": [
        "body",
        "condition",
        "id",
        "initializationExpression",
        "loopExpression",
        "nodeType",
        "src"
      ],
      "title": "ForStatement"
    },
    "IfStatement": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "condition": {
          "$ref": "#/definitions/Expression"
        },
        "falseBody": {
          "anyOf": [
            { "type": "null" },
            { "$ref": "#/definitions/Statement" },
            { "$ref": "#/definitions/Block" }
          ]
        },
        "id": {
          "type": "integer"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "IfStatement"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "trueBody": {
          "anyOf": [
            { "$ref": "#/definitions/Block" },
            { "$ref": "#/definitions/Statement" }
          ]
        }
      },
      "required": [
        "condition",
        "id",
        "nodeType",
        "src",
        "trueBody"
      ],
      "title": "IfStatement"
    },
    "EmitStatement": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "eventCall": {
          "$ref": "#/definitions/FunctionCall"
        },
        "id": {
          "type": "integer"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "EmitStatement"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        }
      },
      "required": [
        "eventCall",
        "id",
        "nodeType",
        "src"
      ],
      "title": "EmitStatement"
    },
    "ExpressionStatement": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "expression": {
          "$ref": "#/definitions/Expression"
        },
        "id": {
          "type": "integer"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "ExpressionStatement"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        }
      },
      "required": [
        "expression",
        "id",
        "nodeType",
        "src"
      ],
      "title": "ExpressionStatement"
    },
    "VariableDeclarationStatement": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "assignments": {
          "type": "array",
          "items": {
            "anyOf": [
              { "type": "null" },
              { "type": "integer" }
            ]
          }
        },
        "declarations": {
          "type": "array",
          "items": {
            "anyOf": [
              { "type": "null" },
              { "$ref": "#/definitions/VariableDeclaration" }
            ]
          }
        },
        "id": {
          "type": "integer"
        },
        "initialValue": {
          "anyOf": [
            {
              "$ref": "#/definitions/Expression"
            },
            {
              "type": "null"
            }
          ]
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "VariableDeclarationStatement"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        }
      },
      "required": [
        "assignments",
        "declarations",
        "id",
        "nodeType",
        "src"
      ],
      "title": "VariableDeclarationStatement"
    },
    "WhileStatement": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "body": {
          "anyOf": [
            { "$ref": "#/definitions/Block" },
            { "$ref": "#/definitions/Statement" }
          ]
        },
        "condition": {
          "$ref": "#/definitions/Expression"
        },
        "id": {
          "type": "integer"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "WhileStatement"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        }
      },
      "required": [
        "body",
        "condition",
        "id",
        "nodeType",
        "src"
      ],
      "title": "WhileStatement"
    },
    "PlaceholderStatement": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "integer"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "PlaceholderStatement"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        }
      },
      "required": [
        "id",
        "nodeType",
        "src"
      ],
      "title": "PlaceholderStatement"
    },
    "UserDefinedTypeName": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "contractScope": {
          "type": "null"
        },
        "id": {
          "type": "integer"
        },
        "name": {
          "type": "string"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "UserDefinedTypeName"
          ]
        },
        "referencedDeclaration": {
          "type": "integer"
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "typeDescriptions": {
          "$ref": "#/definitions/TypeDescriptions"
        }
      },
      "required": [
        "id",
        "name",
        "nodeType",
        "referencedDeclaration",
        "src",
        "typeDescriptions"
      ],
      "title": "UserDefinedTypeName"
    },
    "InheritanceSpecifier": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "arguments": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "$ref": "#/definitions/Expression"
              }
            },
            {
              "type": "null"
            }
          ]
        },
        "baseName": {
          "$ref": "#/definitions/UserDefinedTypeName"
        },
        "id": {
          "type": "integer"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "InheritanceSpecifier"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        }
      },
      "required": [
        "baseName",
        "id",
        "nodeType",
        "src"
      ],
      "title": "InheritanceSpecifier"
    },
    "ModifierInvocation": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "arguments": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "$ref": "#/definitions/Expression"
              }
            },
            {
              "type": "null"
            }
          ]
        },
        "id": {
          "type": "integer"
        },
        "modifierName": {
          "$ref": "#/definitions/Identifier"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "ModifierInvocation"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        }
      },
      "required": [
        "id",
        "modifierName",
        "nodeType",
        "src"
      ],
      "title": "ModifierInvocation"
    },
    "Identifier": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "argumentTypes": {
          "anyOf": [
            { "type": "null" },
            {
              "type": "array",
              "items": {
                "$ref": "#/definitions/TypeDescriptions"
              }
            }
          ]
        },
        "id": {
          "type": "integer"
        },
        "name": {
          "type": "string"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "Identifier"
          ]
        },
        "overloadedDeclarations": {
          "type": "array",
          "items": {}
        },
        "referencedDeclaration": {
          "anyOf": [
            { "type": "null" },
            { "type": "integer" }
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "typeDescriptions": {
          "$ref": "#/definitions/TypeDescriptions"
        }
      },
      "required": [
        "id",
        "name",
        "nodeType",
        "overloadedDeclarations",
        "src",
        "typeDescriptions"
      ],
      "title": "Identifier"
    },
    "Block": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "integer"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "Block"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "statements": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Statement"
          }
        }
      },
      "required": [
        "id",
        "nodeType",
        "src",
        "statements"
      ],
      "title": "Block"
    },
    "Statement": {
      "anyOf": [
        { "$ref": "#/definitions/EmitStatement" },
        { "$ref": "#/definitions/ExpressionStatement" },
        { "$ref": "#/definitions/ForStatement" },
        { "$ref": "#/definitions/IfStatement" },
        { "$ref": "#/definitions/WhileStatement" },
        { "$ref": "#/definitions/InlineAssembly" },
        { "$ref": "#/definitions/PlaceholderStatement" },
        { "$ref": "#/definitions/Return" },
        { "$ref": "#/definitions/VariableDeclarationStatement" }
      ]
    },
    "OverrideSpecifier": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "integer"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "OverrideSpecifier"
          ]
        },
        "overrides": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/UserDefinedTypeName"
          }
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        }
      },
      "required": [
        "id",
        "nodeType",
        "overrides",
        "src"
      ],
      "title": "OverrideSpecifier"
    },
    "EnumValue": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "integer"
        },
        "name": {
          "type": "string"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "EnumValue"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        }
      },
      "required": [
        "id",
        "name",
        "nodeType",
        "src"
      ],
      "title": "EnumValue"
    },
    "EnumDefinition": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "canonicalName": {
          "type": "string"
        },
        "id": {
          "type": "integer"
        },
        "members": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/EnumValue"
          }
        },
        "name": {
          "type": "string"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "EnumDefinition"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        }
      },
      "required": [
        "canonicalName",
        "id",
        "members",
        "name",
        "nodeType",
        "src"
      ],
      "title": "EnumDefinition"
    },
    "EventDefinition": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "anonymous": {
          "type": "boolean"
        },
        "documentation": {
          "anyOf": [
            { "type": "null" },
            { "$ref": "#/definitions/StructuredDocumentation" }
          ]
        },
        "id": {
          "type": "integer"
        },
        "name": {
          "type": "string"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "EventDefinition"
          ]
        },
        "parameters": {
          "$ref": "#/definitions/ParameterList"
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        }
      },
      "required": [
        "anonymous",
        "id",
        "name",
        "nodeType",
        "parameters",
        "src"
      ],
      "title": "EventDefinition"
    },
    "FunctionDefinition": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "baseFunctions": {
          "type": "array",
          "items": {
            "type": "integer"
          }
        },
        "body": {
          "anyOf": [
            { "type": "null" },
            { "$ref": "#/definitions/Block" }
          ]
        },
        "documentation": {
          "anyOf": [
            { "type": "null" },
            { "$ref": "#/definitions/StructuredDocumentation" }
          ]
        },
        "functionSelector": {
          "type": "string"
        },
        "id": {
          "type": "integer"
        },
        "implemented": {
          "type": "boolean"
        },
        "kind": {
          "type": "string",
          "enum": [
            "function",
            "receive",
            "constructor",
            "fallback",
            "freeFunction"
          ]
        },
        "modifiers": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/ModifierInvocation"
          }
        },
        "name": {
          "type": "string"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "FunctionDefinition"
          ]
        },
        "overrides": {
          "anyOf": [
            {
              "$ref": "#/definitions/OverrideSpecifier"
            },
            {
              "type": "null"
            }
          ]
        },
        "parameters": {
          "$ref": "#/definitions/ParameterList"
        },
        "returnParameters": {
          "$ref": "#/definitions/ParameterList"
        },
        "scope": {
          "type": "integer"
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "stateMutability": {
          "$ref": "#/definitions/StateMutability"
        },
        "virtual": {
          "type": "boolean"
        },
        "visibility": {
          "$ref": "#/definitions/Visibility"
        }
      },
      "required": [
        "id",
        "implemented",
        "kind",
        "modifiers",
        "name",
        "nodeType",
        "parameters",
        "returnParameters",
        "scope",
        "src",
        "stateMutability",
        "virtual",
        "visibility"
      ],
      "title": "FunctionDefinition"
    },
    "ParameterList": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "integer"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "ParameterList"
          ]
        },
        "parameters": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/VariableDeclaration"
          }
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        }
      },
      "required": [
        "id",
        "nodeType",
        "parameters",
        "src"
      ],
      "title": "ParameterList"
    },
    "ArrayTypeName": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "baseType": {
          "$ref": "#/definitions/TypeName"
        },
        "id": {
          "type": "integer"
        },
        "length": {
          "anyOf": [
            { "type": "null" },
            { "$ref": "#/definitions/Expression" }
          ]
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "ArrayTypeName"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "typeDescriptions": {
          "$ref": "#/definitions/TypeDescriptions"
        }
      },
      "required": [
        "baseType",
        "id",
        "nodeType",
        "src",
        "typeDescriptions"
      ],
      "title": "ArrayTypeName"
    },
    "Mapping": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "integer"
        },
        "keyType": {
          "$ref": "#/definitions/TypeName"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "Mapping"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "typeDescriptions": {
          "$ref": "#/definitions/TypeDescriptions"
        },
        "valueType": {
          "$ref": "#/definitions/TypeName"
        }
      },
      "required": [
        "id",
        "keyType",
        "nodeType",
        "src",
        "typeDescriptions",
        "valueType"
      ],
      "title": "Mapping"
    },
    "ModifierDefinition": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "body": {
          "$ref": "#/definitions/Block"
        },
        "documentation": {
          "anyOf": [
            { "type": "null" },
            { "$ref": "#/definitions/StructuredDocumentation" }
          ]
        },
        "id": {
          "type": "integer"
        },
        "name": {
          "type": "string"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "ModifierDefinition"
          ]
        },
        "overrides": {
          "type": "null"
        },
        "parameters": {
          "$ref": "#/definitions/ParameterList"
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "virtual": {
          "type": "boolean"
        },
        "visibility": {
          "$ref": "#/definitions/Visibility"
        }
      },
      "required": [
        "body",
        "id",
        "name",
        "nodeType",
        "parameters",
        "src",
        "virtual",
        "visibility"
      ],
      "title": "ModifierDefinition"
    },
    "InlineAssembly": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "AST": {
          "type": "object"
        },
        "evmVersion": {
          "type": "string",
          "enum": [
            "homestead",
            "tangerineWhistle",
            "spuriousDragon",
            "byzantium",
            "constantinople",
            "petersburg",
            "istanbul",
            "berlin"
          ]
        },
        "externalReferences": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "declaration": {
                "type": "integer"
              },
              "isOffset": {
                "type": "boolean"
              },
              "isSlot": {
                "type": "boolean"
              },
              "src": {
                "$ref": "#/definitions/SourceLocation"
              },
              "valueSize": {
                "type": "integer"
              }
            },
            "required": [
              "declaration",
              "isOffset",
              "isSlot",
              "src",
              "valueSize"
            ]
          }
        },
        "id": {
          "type": "integer"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "InlineAssembly"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        }
      },
      "required": [
        "AST",
        "evmVersion",
        "externalReferences",
        "id",
        "nodeType",
        "src"
      ],
      "title": "InlineAssembly"
    },
    "ImportDirective": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "absolutePath": {
          "type": "string"
        },
        "file": {
          "type": "string"
        },
        "id": {
          "type": "integer"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "ImportDirective"
          ]
        },
        "scope": {
          "type": "integer"
        },
        "sourceUnit": {
          "type": "integer"
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "symbolAliases": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "foreign": {
                "$ref": "#/definitions/Identifier"
              },
              "local": {
                "anyOf": [
                  { "type": "null" },
                  { "type": "string" }
                ]
              }
            },
            "required": [
              "foreign"
            ]
          }
        },
        "unitAlias": {
          "type": "string"
        }
      },
      "required": [
        "absolutePath",
        "file",
        "id",
        "nodeType",
        "scope",
        "sourceUnit",
        "src",
        "symbolAliases",
        "unitAlias"
      ],
      "title": "ImportDirective"
    },
    "PragmaDirective": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "integer"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "PragmaDirective"
          ]
        },
        "literals": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        }
      },
      "required": [
        "id",
        "nodeType",
        "literals",
        "src"
      ],
      "title": "PragmaDirective"
    },
    "ContractDefinition": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "abstract": {
          "type": "boolean"
        },
        "baseContracts": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/InheritanceSpecifier"
          }
        },
        "contractDependencies": {
          "type": "array",
          "items": {
            "type": "integer"
          }
        },
        "contractKind": {
          "type": "string",
          "enum": [
            "contract",
            "interface",
            "library"
          ]
        },
        "documentation": {
          "anyOf": [
            { "type": "null" },
            { "$ref": "#/definitions/StructuredDocumentation" }
          ]
        },
        "fullyImplemented": {
          "type": "boolean"
        },
        "id": {
          "type": "integer"
        },
        "linearizedBaseContracts": {
          "type": "array",
          "items": {
            "type": "integer"
          }
        },
        "name": {
          "type": "string"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "ContractDefinition"
          ]
        },
        "nodes": {
          "type": "array",
          "items": {
            "anyOf": [
              { "$ref": "#/definitions/EnumDefinition" },
              { "$ref": "#/definitions/EventDefinition" },
              { "$ref": "#/definitions/FunctionDefinition" },
              { "$ref": "#/definitions/ModifierDefinition" },
              { "$ref": "#/definitions/StructDefinition" },
              { "$ref": "#/definitions/UsingForDirective" },
              { "$ref": "#/definitions/VariableDeclaration" }
            ]
          }
        },
        "scope": {
          "type": "integer"
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        }
      },
      "required": [
        "abstract",
        "baseContracts",
        "contractDependencies",
        "contractKind",
        "fullyImplemented",
        "id",
        "linearizedBaseContracts",
        "name",
        "nodeType",
        "nodes",
        "scope",
        "src"
      ],
      "title": "ContractDefinition"
    },
    "Return": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "expression": {
          "anyOf": [
            { "$ref": "#/definitions/Expression" },
            { "type": "null" }
          ]
        },
        "functionReturnParameters": {
          "type": "integer"
        },
        "id": {
          "type": "integer"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "Return"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        }
      },
      "required": [
        "expression",
        "functionReturnParameters",
        "id",
        "nodeType",
        "src"
      ],
      "title": "Return"
    },
    "StructDefinition": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "canonicalName": {
          "type": "string"
        },
        "id": {
          "type": "integer"
        },
        "members": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/VariableDeclaration"
          }
        },
        "name": {
          "type": "string"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "StructDefinition"
          ]
        },
        "scope": {
          "type": "integer"
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "visibility": {
          "$ref": "#/definitions/Visibility"
        }
      },
      "required": [
        "canonicalName",
        "id",
        "members",
        "name",
        "nodeType",
        "scope",
        "src",
        "visibility"
      ],
      "title": "StructDefinition"
    },
    "UsingForDirective": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "integer"
        },
        "libraryName": {
          "$ref": "#/definitions/UserDefinedTypeName"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "UsingForDirective"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "typeName": {
          "$ref": "#/definitions/TypeName"
        }
      },
      "required": [
        "id",
        "libraryName",
        "nodeType",
        "src",
        "typeName"
      ],
      "title": "UsingForDirective"
    },
    "VariableDeclaration": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "constant": {
          "type": "boolean"
        },
        "functionSelector": {
          "type": "string"
        },
        "id": {
          "type": "integer"
        },
        "indexed": {
          "type": "boolean"
        },
        "mutability": {
          "$ref": "#/definitions/Mutability"
        },
        "name": {
          "type": "string"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "VariableDeclaration"
          ]
        },
        "overrides": {
          "type": "null"
        },
        "scope": {
          "type": "integer"
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "stateVariable": {
          "type": "boolean"
        },
        "storageLocation": {
          "$ref": "#/definitions/StorageLocation"
        },
        "typeDescriptions": {
          "$ref": "#/definitions/TypeDescriptions"
        },
        "typeName": {
          "anyOf": [
            { "$ref": "#/definitions/TypeName" },
            { "type": "null" }
          ]
        },
        "value": {
          "anyOf": [
            {
              "$ref": "#/definitions/Expression"
            },
            {
              "type": "null"
            }
          ]
        },
        "visibility": {
          "$ref": "#/definitions/Visibility"
        }
      },
      "required": [
        "constant",
        "id",
        "mutability",
        "name",
        "nodeType",
        "scope",
        "src",
        "stateVariable",
        "storageLocation",
        "typeDescriptions",
        "visibility"
      ],
      "title": "VariableDeclaration"
    },
    "StructuredDocumentation": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "integer"
        },
        "nodeType": {
          "type": "string",
          "enum": [
            "StructuredDocumentation"
          ]
        },
        "src": {
          "$ref": "#/definitions/SourceLocation"
        },
        "text": {
          "type": "string"
        }
      },
      "required": [
        "id",
        "nodeType",
        "src",
        "text"
      ],
      "title": "StructuredDocumentation"
    },
    "TypeName": {
      "anyOf": [
        { "$ref": "#/definitions/ArrayTypeName" },
        { "$ref": "#/definitions/ElementaryTypeName" },
        { "$ref": "#/definitions/FunctionTypeName" },
        { "$ref": "#/definitions/Mapping" },
        { "$ref": "#/definitions/UserDefinedTypeName" }
      ]
    },
    "StateMutability": {
      "type": "string",
      "enum": [
        "payable",
        "pure",
        "nonpayable",
        "view"
      ],
      "title": "StateMutability"
    },
    "Mutability": {
      "type": "string",
      "enum": [
        "mutable",
        "immutable",
        "constant"
      ],
      "title": "Mutability"
    },
    "SourceLocation": {
      "type": "string",
      "pattern": "^\\d+:\\d+:\\d+$",
      "title": "SourceLocation"
    },
    "StorageLocation": {
      "type": "string",
      "enum": [
        "calldata",
        "default",
        "memory",
        "storage"
      ],
      "title": "StorageLocation"
    },
    "Visibility": {
      "type": "string",
      "enum": [
        "external",
        "public",
        "internal",
        "private"
      ],
      "title": "Visibility"
    }
  },
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "absolutePath": {
      "type": "string"
    },
    "exportedSymbols": {
      "type": "object",
      "additionalProperties": {
        "type": "array",
        "items": {
          "type": "integer"
        }
      },
      "title": "ExportedSymbols"
    },
    "id": {
      "type": "integer"
    },
    "license": {
      "anyOf": [
        {
          "type": "null"
        },
        {
          "type": "string"
        }
      ]
    },
    "nodeType": {
      "type": "string",
      "enum": [
        "SourceUnit"
      ]
    },
    "nodes": {
      "type": "array",
      "items": {
        "anyOf": [
          { "$ref": "#/definitions/ContractDefinition" },
          { "$ref": "#/definitions/EnumDefinition" },
          { "$ref": "#/definitions/FunctionDefinition" },
          { "$ref": "#/definitions/ImportDirective" },
          { "$ref": "#/definitions/PragmaDirective" },
          { "$ref": "#/definitions/StructDefinition" }
        ]
      }
    },
    "src": {
      "$ref": "#/definitions/SourceLocation"
    }
  },
  "required": [
    "absolutePath",
    "exportedSymbols",
    "id",
    "nodeType",
    "nodes",
    "src"
  ],
  "title": "SourceUnit"
}
