diff --git a/DEPS b/DEPS
index fac5e34..a3188c5 100644
--- a/DEPS
+++ b/DEPS
@@ -165,7 +165,7 @@
   "test_process_tag": "2.0.0",
   "term_glyph_rev": "6a0f9b6fb645ba75e7a00a4e20072678327a0347",
   "test_reflective_loader_rev": "54e930a11c372683792e22bddad79197728c91ce",
-  "test_rev": "433f1d8726f9c1484007588470b17830a5e97a12",
+  "test_rev": "cd91c38f184fe7162ecbab8bfa2f15d2a335015d",
   "typed_data_tag": "f94fc57b8e8c0e4fe4ff6cfd8290b94af52d3719",
   "usage_rev": "e0780cd8b2f8af69a28dc52678ffe8492da27d06",
   "vector_math_rev": "0c9f5d68c047813a6dcdeb88ba7a42daddf25025",
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_not_null_aware.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_not_null_aware.dart
index a46a17e..7998030 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_not_null_aware.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_not_null_aware.dart
@@ -21,6 +21,9 @@
   FixKind get fixKind => DartFixKind.REPLACE_WITH_NOT_NULL_AWARE;
 
   @override
+  FixKind get multiFixKind => DartFixKind.REPLACE_WITH_NOT_NULL_AWARE_MULTI;
+
+  @override
   Future<void> compute(ChangeBuilder builder) async {
     var node = coveredNode;
     if (node is MethodInvocation) {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 7bb4b16..365dc29 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -839,6 +839,10 @@
       'dart.fix.replace.withNotNullAware',
       DartFixKindPriority.DEFAULT,
       "Replace with '{0}'");
+  static const REPLACE_WITH_NOT_NULL_AWARE_MULTI = FixKind(
+      'dart.fix.replace.withNotNullAware.multi',
+      DartFixKindPriority.IN_FILE,
+      'Replace with non-null-aware operator everywhere in file.');
   static const REPLACE_WITH_NULL_AWARE = FixKind(
       'dart.fix.replace.withNullAware',
       DartFixKindPriority.DEFAULT,
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 406dcd01..2ff9ef9 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -1690,10 +1690,22 @@
       FixInfo.single([RemoveDeadIfNull.newInstance]),
     ],
     StaticWarningCode.INVALID_NULL_AWARE_OPERATOR: [
-      FixInfo.single([ReplaceWithNotNullAware.newInstance]),
+      FixInfo(
+        canBeAppliedToFile: true,
+        canBeBulkApplied: true,
+        generators: [
+          ReplaceWithNotNullAware.newInstance,
+        ],
+      ),
     ],
     StaticWarningCode.INVALID_NULL_AWARE_OPERATOR_AFTER_SHORT_CIRCUIT: [
-      FixInfo.single([ReplaceWithNotNullAware.newInstance]),
+      FixInfo(
+        canBeAppliedToFile: true,
+        canBeBulkApplied: true,
+        generators: [
+          ReplaceWithNotNullAware.newInstance,
+        ],
+      ),
     ],
     StaticWarningCode.MISSING_ENUM_CONSTANT_IN_SWITCH: [
       FixInfo.single([AddMissingEnumCaseClauses.newInstance]),
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_not_null_aware_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_not_null_aware_test.dart
index ccbc1cf..35c3f0c 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_not_null_aware_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_not_null_aware_test.dart
@@ -7,15 +7,65 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../../../abstract_context.dart';
+import 'bulk/bulk_fix_processor.dart';
 import 'fix_processor.dart';
 
 void main() {
   defineReflectiveSuite(() {
+    defineReflectiveTests(ReplaceWithNotNullAwareBulkTest);
     defineReflectiveTests(ReplaceWithNotNullAwareTest);
   });
 }
 
 @reflectiveTest
+class ReplaceWithNotNullAwareBulkTest extends BulkFixProcessorTest
+    with WithNullSafetyMixin {
+  Future<void> test_notShortCircuit() async {
+    await resolveTestCode('''
+void f(A a) {
+  a?.b?.c;
+}
+class A {
+  A get b => this;
+  A get c => this;
+}
+''');
+    await assertHasFix('''
+void f(A a) {
+  a.b.c;
+}
+class A {
+  A get b => this;
+  A get c => this;
+}
+''');
+  }
+
+  Future<void> test_shortCircuit() async {
+    await resolveTestCode('''
+void f(A? a) {
+  a?.b?.c?.d;
+}
+class A {
+  A get b => this;
+  A get c => this;
+  A get d => this;
+}
+''');
+    await assertHasFix('''
+void f(A? a) {
+  a?.b.c.d;
+}
+class A {
+  A get b => this;
+  A get c => this;
+  A get d => this;
+}
+''');
+  }
+}
+
+@reflectiveTest
 class ReplaceWithNotNullAwareTest extends FixProcessorTest
     with WithNullSafetyMixin {
   @override
diff --git a/pkg/dds/lib/src/dap/protocol_common.dart b/pkg/dds/lib/src/dap/protocol_common.dart
new file mode 100644
index 0000000..6295243
--- /dev/null
+++ b/pkg/dds/lib/src/dap/protocol_common.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A base class for (spec-generated) classes that represent the `body` of a an
+/// event.
+abstract class EventBody {
+  static bool canParse(Object? obj) => obj is Map<String, Object?>?;
+}
+
+/// A base class for (spec-generated) classes that represent the `arguments` of
+/// a request.
+abstract class RequestArguments {
+  static bool canParse(Object? obj) => obj is Map<String, Object?>?;
+}
diff --git a/pkg/dds/lib/src/dap/protocol_generated.dart b/pkg/dds/lib/src/dap/protocol_generated.dart
new file mode 100644
index 0000000..30620e4
--- /dev/null
+++ b/pkg/dds/lib/src/dap/protocol_generated.dart
@@ -0,0 +1,8934 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This code was auto-generated by tool/dap/generate_all.dart - do not hand-edit!
+
+import 'package:dds/src/dap/protocol_common.dart';
+import 'package:dds/src/dap/protocol_special.dart';
+
+/// Arguments for 'attach' request. Additional attributes are implementation
+/// specific.
+class AttachRequestArguments extends RequestArguments {
+  /// Optional data from the previous, restarted session.
+  /// The data is sent as the 'restart' attribute of the 'terminated' event.
+  /// The client should leave the data intact.
+  final Object? restart;
+
+  static AttachRequestArguments fromJson(Map<String, Object?> obj) =>
+      AttachRequestArguments.fromMap(obj);
+
+  AttachRequestArguments({
+    this.restart,
+  });
+
+  AttachRequestArguments.fromMap(Map<String, Object?> obj)
+      : restart = obj['__restart'];
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (restart != null) '__restart': restart,
+      };
+}
+
+/// Response to 'attach' request. This is just an acknowledgement, so no body
+/// field is required.
+class AttachResponse extends Response {
+  static AttachResponse fromJson(Map<String, Object?> obj) =>
+      AttachResponse.fromMap(obj);
+
+  AttachResponse({
+    Object? body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  AttachResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Information about a Breakpoint created in setBreakpoints,
+/// setFunctionBreakpoints, setInstructionBreakpoints, or setDataBreakpoints.
+class Breakpoint {
+  /// An optional start column of the actual range covered by the breakpoint.
+  final int? column;
+
+  /// An optional end column of the actual range covered by the breakpoint.
+  /// If no end line is given, then the end column is assumed to be in the start
+  /// line.
+  final int? endColumn;
+
+  /// An optional end line of the actual range covered by the breakpoint.
+  final int? endLine;
+
+  /// An optional identifier for the breakpoint. It is needed if breakpoint
+  /// events are used to update or remove breakpoints.
+  final int? id;
+
+  /// An optional memory reference to where the breakpoint is set.
+  final String? instructionReference;
+
+  /// The start line of the actual range covered by the breakpoint.
+  final int? line;
+
+  /// An optional message about the state of the breakpoint.
+  /// This is shown to the user and can be used to explain why a breakpoint
+  /// could not be verified.
+  final String? message;
+
+  /// An optional offset from the instruction reference.
+  /// This can be negative.
+  final int? offset;
+
+  /// The source where the breakpoint is located.
+  final Source? source;
+
+  /// If true breakpoint could be set (but not necessarily at the desired
+  /// location).
+  final bool verified;
+
+  static Breakpoint fromJson(Map<String, Object?> obj) =>
+      Breakpoint.fromMap(obj);
+
+  Breakpoint({
+    this.column,
+    this.endColumn,
+    this.endLine,
+    this.id,
+    this.instructionReference,
+    this.line,
+    this.message,
+    this.offset,
+    this.source,
+    required this.verified,
+  });
+
+  Breakpoint.fromMap(Map<String, Object?> obj)
+      : column = obj['column'] as int?,
+        endColumn = obj['endColumn'] as int?,
+        endLine = obj['endLine'] as int?,
+        id = obj['id'] as int?,
+        instructionReference = obj['instructionReference'] as String?,
+        line = obj['line'] as int?,
+        message = obj['message'] as String?,
+        offset = obj['offset'] as int?,
+        source = obj['source'] == null
+            ? null
+            : Source.fromJson(obj['source'] as Map<String, Object?>),
+        verified = obj['verified'] as bool;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['column'] is! int?) {
+      return false;
+    }
+    if (obj['endColumn'] is! int?) {
+      return false;
+    }
+    if (obj['endLine'] is! int?) {
+      return false;
+    }
+    if (obj['id'] is! int?) {
+      return false;
+    }
+    if (obj['instructionReference'] is! String?) {
+      return false;
+    }
+    if (obj['line'] is! int?) {
+      return false;
+    }
+    if (obj['message'] is! String?) {
+      return false;
+    }
+    if (obj['offset'] is! int?) {
+      return false;
+    }
+    if (!Source?.canParse(obj['source'])) {
+      return false;
+    }
+    if (obj['verified'] is! bool) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (column != null) 'column': column,
+        if (endColumn != null) 'endColumn': endColumn,
+        if (endLine != null) 'endLine': endLine,
+        if (id != null) 'id': id,
+        if (instructionReference != null)
+          'instructionReference': instructionReference,
+        if (line != null) 'line': line,
+        if (message != null) 'message': message,
+        if (offset != null) 'offset': offset,
+        if (source != null) 'source': source,
+        'verified': verified,
+      };
+}
+
+/// Properties of a breakpoint location returned from the 'breakpointLocations'
+/// request.
+class BreakpointLocation {
+  /// Optional start column of breakpoint location.
+  final int? column;
+
+  /// Optional end column of breakpoint location if the location covers a range.
+  final int? endColumn;
+
+  /// Optional end line of breakpoint location if the location covers a range.
+  final int? endLine;
+
+  /// Start line of breakpoint location.
+  final int line;
+
+  static BreakpointLocation fromJson(Map<String, Object?> obj) =>
+      BreakpointLocation.fromMap(obj);
+
+  BreakpointLocation({
+    this.column,
+    this.endColumn,
+    this.endLine,
+    required this.line,
+  });
+
+  BreakpointLocation.fromMap(Map<String, Object?> obj)
+      : column = obj['column'] as int?,
+        endColumn = obj['endColumn'] as int?,
+        endLine = obj['endLine'] as int?,
+        line = obj['line'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['column'] is! int?) {
+      return false;
+    }
+    if (obj['endColumn'] is! int?) {
+      return false;
+    }
+    if (obj['endLine'] is! int?) {
+      return false;
+    }
+    if (obj['line'] is! int) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (column != null) 'column': column,
+        if (endColumn != null) 'endColumn': endColumn,
+        if (endLine != null) 'endLine': endLine,
+        'line': line,
+      };
+}
+
+/// Arguments for 'breakpointLocations' request.
+class BreakpointLocationsArguments extends RequestArguments {
+  /// Optional start column of range to search possible breakpoint locations in.
+  /// If no start column is given, the first column in the start line is
+  /// assumed.
+  final int? column;
+
+  /// Optional end column of range to search possible breakpoint locations in.
+  /// If no end column is given, then it is assumed to be in the last column of
+  /// the end line.
+  final int? endColumn;
+
+  /// Optional end line of range to search possible breakpoint locations in. If
+  /// no end line is given, then the end line is assumed to be the start line.
+  final int? endLine;
+
+  /// Start line of range to search possible breakpoint locations in. If only
+  /// the line is specified, the request returns all possible locations in that
+  /// line.
+  final int line;
+
+  /// The source location of the breakpoints; either 'source.path' or
+  /// 'source.reference' must be specified.
+  final Source source;
+
+  static BreakpointLocationsArguments fromJson(Map<String, Object?> obj) =>
+      BreakpointLocationsArguments.fromMap(obj);
+
+  BreakpointLocationsArguments({
+    this.column,
+    this.endColumn,
+    this.endLine,
+    required this.line,
+    required this.source,
+  });
+
+  BreakpointLocationsArguments.fromMap(Map<String, Object?> obj)
+      : column = obj['column'] as int?,
+        endColumn = obj['endColumn'] as int?,
+        endLine = obj['endLine'] as int?,
+        line = obj['line'] as int,
+        source = Source.fromJson(obj['source'] as Map<String, Object?>);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['column'] is! int?) {
+      return false;
+    }
+    if (obj['endColumn'] is! int?) {
+      return false;
+    }
+    if (obj['endLine'] is! int?) {
+      return false;
+    }
+    if (obj['line'] is! int) {
+      return false;
+    }
+    if (!Source.canParse(obj['source'])) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (column != null) 'column': column,
+        if (endColumn != null) 'endColumn': endColumn,
+        if (endLine != null) 'endLine': endLine,
+        'line': line,
+        'source': source,
+      };
+}
+
+/// Response to 'breakpointLocations' request.
+/// Contains possible locations for source breakpoints.
+class BreakpointLocationsResponse extends Response {
+  static BreakpointLocationsResponse fromJson(Map<String, Object?> obj) =>
+      BreakpointLocationsResponse.fromMap(obj);
+
+  BreakpointLocationsResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  BreakpointLocationsResponse.fromMap(Map<String, Object?> obj)
+      : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Arguments for 'cancel' request.
+class CancelArguments extends RequestArguments {
+  /// The ID (attribute 'progressId') of the progress to cancel. If missing no
+  /// progress is cancelled.
+  /// Both a 'requestId' and a 'progressId' can be specified in one request.
+  final String? progressId;
+
+  /// The ID (attribute 'seq') of the request to cancel. If missing no request
+  /// is cancelled.
+  /// Both a 'requestId' and a 'progressId' can be specified in one request.
+  final int? requestId;
+
+  static CancelArguments fromJson(Map<String, Object?> obj) =>
+      CancelArguments.fromMap(obj);
+
+  CancelArguments({
+    this.progressId,
+    this.requestId,
+  });
+
+  CancelArguments.fromMap(Map<String, Object?> obj)
+      : progressId = obj['progressId'] as String?,
+        requestId = obj['requestId'] as int?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['progressId'] is! String?) {
+      return false;
+    }
+    if (obj['requestId'] is! int?) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (progressId != null) 'progressId': progressId,
+        if (requestId != null) 'requestId': requestId,
+      };
+}
+
+/// Response to 'cancel' request. This is just an acknowledgement, so no body
+/// field is required.
+class CancelResponse extends Response {
+  static CancelResponse fromJson(Map<String, Object?> obj) =>
+      CancelResponse.fromMap(obj);
+
+  CancelResponse({
+    Object? body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  CancelResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Information about the capabilities of a debug adapter.
+class Capabilities {
+  /// The set of additional module information exposed by the debug adapter.
+  final List<ColumnDescriptor>? additionalModuleColumns;
+
+  /// The set of characters that should trigger completion in a REPL. If not
+  /// specified, the UI should assume the '.' character.
+  final List<String>? completionTriggerCharacters;
+
+  /// Available exception filter options for the 'setExceptionBreakpoints'
+  /// request.
+  final List<ExceptionBreakpointsFilter>? exceptionBreakpointFilters;
+
+  /// The debug adapter supports the 'suspendDebuggee' attribute on the
+  /// 'disconnect' request.
+  final bool? supportSuspendDebuggee;
+
+  /// The debug adapter supports the 'terminateDebuggee' attribute on the
+  /// 'disconnect' request.
+  final bool? supportTerminateDebuggee;
+
+  /// Checksum algorithms supported by the debug adapter.
+  final List<ChecksumAlgorithm>? supportedChecksumAlgorithms;
+
+  /// The debug adapter supports the 'breakpointLocations' request.
+  final bool? supportsBreakpointLocationsRequest;
+
+  /// The debug adapter supports the 'cancel' request.
+  final bool? supportsCancelRequest;
+
+  /// The debug adapter supports the 'clipboard' context value in the 'evaluate'
+  /// request.
+  final bool? supportsClipboardContext;
+
+  /// The debug adapter supports the 'completions' request.
+  final bool? supportsCompletionsRequest;
+
+  /// The debug adapter supports conditional breakpoints.
+  final bool? supportsConditionalBreakpoints;
+
+  /// The debug adapter supports the 'configurationDone' request.
+  final bool? supportsConfigurationDoneRequest;
+
+  /// The debug adapter supports data breakpoints.
+  final bool? supportsDataBreakpoints;
+
+  /// The debug adapter supports the delayed loading of parts of the stack,
+  /// which requires that both the 'startFrame' and 'levels' arguments and an
+  /// optional 'totalFrames' result of the 'StackTrace' request are supported.
+  final bool? supportsDelayedStackTraceLoading;
+
+  /// The debug adapter supports the 'disassemble' request.
+  final bool? supportsDisassembleRequest;
+
+  /// The debug adapter supports a (side effect free) evaluate request for data
+  /// hovers.
+  final bool? supportsEvaluateForHovers;
+
+  /// The debug adapter supports 'filterOptions' as an argument on the
+  /// 'setExceptionBreakpoints' request.
+  final bool? supportsExceptionFilterOptions;
+
+  /// The debug adapter supports the 'exceptionInfo' request.
+  final bool? supportsExceptionInfoRequest;
+
+  /// The debug adapter supports 'exceptionOptions' on the
+  /// setExceptionBreakpoints request.
+  final bool? supportsExceptionOptions;
+
+  /// The debug adapter supports function breakpoints.
+  final bool? supportsFunctionBreakpoints;
+
+  /// The debug adapter supports the 'gotoTargets' request.
+  final bool? supportsGotoTargetsRequest;
+
+  /// The debug adapter supports breakpoints that break execution after a
+  /// specified number of hits.
+  final bool? supportsHitConditionalBreakpoints;
+
+  /// The debug adapter supports adding breakpoints based on instruction
+  /// references.
+  final bool? supportsInstructionBreakpoints;
+
+  /// The debug adapter supports the 'loadedSources' request.
+  final bool? supportsLoadedSourcesRequest;
+
+  /// The debug adapter supports logpoints by interpreting the 'logMessage'
+  /// attribute of the SourceBreakpoint.
+  final bool? supportsLogPoints;
+
+  /// The debug adapter supports the 'modules' request.
+  final bool? supportsModulesRequest;
+
+  /// The debug adapter supports the 'readMemory' request.
+  final bool? supportsReadMemoryRequest;
+
+  /// The debug adapter supports restarting a frame.
+  final bool? supportsRestartFrame;
+
+  /// The debug adapter supports the 'restart' request. In this case a client
+  /// should not implement 'restart' by terminating and relaunching the adapter
+  /// but by calling the RestartRequest.
+  final bool? supportsRestartRequest;
+
+  /// The debug adapter supports the 'setExpression' request.
+  final bool? supportsSetExpression;
+
+  /// The debug adapter supports setting a variable to a value.
+  final bool? supportsSetVariable;
+
+  /// The debug adapter supports stepping back via the 'stepBack' and
+  /// 'reverseContinue' requests.
+  final bool? supportsStepBack;
+
+  /// The debug adapter supports the 'stepInTargets' request.
+  final bool? supportsStepInTargetsRequest;
+
+  /// The debug adapter supports stepping granularities (argument 'granularity')
+  /// for the stepping requests.
+  final bool? supportsSteppingGranularity;
+
+  /// The debug adapter supports the 'terminate' request.
+  final bool? supportsTerminateRequest;
+
+  /// The debug adapter supports the 'terminateThreads' request.
+  final bool? supportsTerminateThreadsRequest;
+
+  /// The debug adapter supports a 'format' attribute on the stackTraceRequest,
+  /// variablesRequest, and evaluateRequest.
+  final bool? supportsValueFormattingOptions;
+
+  static Capabilities fromJson(Map<String, Object?> obj) =>
+      Capabilities.fromMap(obj);
+
+  Capabilities({
+    this.additionalModuleColumns,
+    this.completionTriggerCharacters,
+    this.exceptionBreakpointFilters,
+    this.supportSuspendDebuggee,
+    this.supportTerminateDebuggee,
+    this.supportedChecksumAlgorithms,
+    this.supportsBreakpointLocationsRequest,
+    this.supportsCancelRequest,
+    this.supportsClipboardContext,
+    this.supportsCompletionsRequest,
+    this.supportsConditionalBreakpoints,
+    this.supportsConfigurationDoneRequest,
+    this.supportsDataBreakpoints,
+    this.supportsDelayedStackTraceLoading,
+    this.supportsDisassembleRequest,
+    this.supportsEvaluateForHovers,
+    this.supportsExceptionFilterOptions,
+    this.supportsExceptionInfoRequest,
+    this.supportsExceptionOptions,
+    this.supportsFunctionBreakpoints,
+    this.supportsGotoTargetsRequest,
+    this.supportsHitConditionalBreakpoints,
+    this.supportsInstructionBreakpoints,
+    this.supportsLoadedSourcesRequest,
+    this.supportsLogPoints,
+    this.supportsModulesRequest,
+    this.supportsReadMemoryRequest,
+    this.supportsRestartFrame,
+    this.supportsRestartRequest,
+    this.supportsSetExpression,
+    this.supportsSetVariable,
+    this.supportsStepBack,
+    this.supportsStepInTargetsRequest,
+    this.supportsSteppingGranularity,
+    this.supportsTerminateRequest,
+    this.supportsTerminateThreadsRequest,
+    this.supportsValueFormattingOptions,
+  });
+
+  Capabilities.fromMap(Map<String, Object?> obj)
+      : additionalModuleColumns = (obj['additionalModuleColumns'] as List?)
+            ?.map((item) =>
+                ColumnDescriptor.fromJson(item as Map<String, Object?>))
+            .toList(),
+        completionTriggerCharacters =
+            (obj['completionTriggerCharacters'] as List?)
+                ?.map((item) => item as String)
+                .toList(),
+        exceptionBreakpointFilters =
+            (obj['exceptionBreakpointFilters'] as List?)
+                ?.map((item) => ExceptionBreakpointsFilter.fromJson(
+                    item as Map<String, Object?>))
+                .toList(),
+        supportSuspendDebuggee = obj['supportSuspendDebuggee'] as bool?,
+        supportTerminateDebuggee = obj['supportTerminateDebuggee'] as bool?,
+        supportedChecksumAlgorithms =
+            (obj['supportedChecksumAlgorithms'] as List?)
+                ?.map((item) =>
+                    ChecksumAlgorithm.fromJson(item as Map<String, Object?>))
+                .toList(),
+        supportsBreakpointLocationsRequest =
+            obj['supportsBreakpointLocationsRequest'] as bool?,
+        supportsCancelRequest = obj['supportsCancelRequest'] as bool?,
+        supportsClipboardContext = obj['supportsClipboardContext'] as bool?,
+        supportsCompletionsRequest = obj['supportsCompletionsRequest'] as bool?,
+        supportsConditionalBreakpoints =
+            obj['supportsConditionalBreakpoints'] as bool?,
+        supportsConfigurationDoneRequest =
+            obj['supportsConfigurationDoneRequest'] as bool?,
+        supportsDataBreakpoints = obj['supportsDataBreakpoints'] as bool?,
+        supportsDelayedStackTraceLoading =
+            obj['supportsDelayedStackTraceLoading'] as bool?,
+        supportsDisassembleRequest = obj['supportsDisassembleRequest'] as bool?,
+        supportsEvaluateForHovers = obj['supportsEvaluateForHovers'] as bool?,
+        supportsExceptionFilterOptions =
+            obj['supportsExceptionFilterOptions'] as bool?,
+        supportsExceptionInfoRequest =
+            obj['supportsExceptionInfoRequest'] as bool?,
+        supportsExceptionOptions = obj['supportsExceptionOptions'] as bool?,
+        supportsFunctionBreakpoints =
+            obj['supportsFunctionBreakpoints'] as bool?,
+        supportsGotoTargetsRequest = obj['supportsGotoTargetsRequest'] as bool?,
+        supportsHitConditionalBreakpoints =
+            obj['supportsHitConditionalBreakpoints'] as bool?,
+        supportsInstructionBreakpoints =
+            obj['supportsInstructionBreakpoints'] as bool?,
+        supportsLoadedSourcesRequest =
+            obj['supportsLoadedSourcesRequest'] as bool?,
+        supportsLogPoints = obj['supportsLogPoints'] as bool?,
+        supportsModulesRequest = obj['supportsModulesRequest'] as bool?,
+        supportsReadMemoryRequest = obj['supportsReadMemoryRequest'] as bool?,
+        supportsRestartFrame = obj['supportsRestartFrame'] as bool?,
+        supportsRestartRequest = obj['supportsRestartRequest'] as bool?,
+        supportsSetExpression = obj['supportsSetExpression'] as bool?,
+        supportsSetVariable = obj['supportsSetVariable'] as bool?,
+        supportsStepBack = obj['supportsStepBack'] as bool?,
+        supportsStepInTargetsRequest =
+            obj['supportsStepInTargetsRequest'] as bool?,
+        supportsSteppingGranularity =
+            obj['supportsSteppingGranularity'] as bool?,
+        supportsTerminateRequest = obj['supportsTerminateRequest'] as bool?,
+        supportsTerminateThreadsRequest =
+            obj['supportsTerminateThreadsRequest'] as bool?,
+        supportsValueFormattingOptions =
+            obj['supportsValueFormattingOptions'] as bool?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['additionalModuleColumns'] is! List ||
+        (obj['additionalModuleColumns']
+            .any((item) => !ColumnDescriptor.canParse(item))))) {
+      return false;
+    }
+    if ((obj['completionTriggerCharacters'] is! List ||
+        (obj['completionTriggerCharacters'].any((item) => item is! String)))) {
+      return false;
+    }
+    if ((obj['exceptionBreakpointFilters'] is! List ||
+        (obj['exceptionBreakpointFilters']
+            .any((item) => !ExceptionBreakpointsFilter.canParse(item))))) {
+      return false;
+    }
+    if (obj['supportSuspendDebuggee'] is! bool?) {
+      return false;
+    }
+    if (obj['supportTerminateDebuggee'] is! bool?) {
+      return false;
+    }
+    if ((obj['supportedChecksumAlgorithms'] is! List ||
+        (obj['supportedChecksumAlgorithms']
+            .any((item) => !ChecksumAlgorithm.canParse(item))))) {
+      return false;
+    }
+    if (obj['supportsBreakpointLocationsRequest'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsCancelRequest'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsClipboardContext'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsCompletionsRequest'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsConditionalBreakpoints'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsConfigurationDoneRequest'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsDataBreakpoints'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsDelayedStackTraceLoading'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsDisassembleRequest'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsEvaluateForHovers'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsExceptionFilterOptions'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsExceptionInfoRequest'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsExceptionOptions'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsFunctionBreakpoints'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsGotoTargetsRequest'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsHitConditionalBreakpoints'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsInstructionBreakpoints'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsLoadedSourcesRequest'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsLogPoints'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsModulesRequest'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsReadMemoryRequest'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsRestartFrame'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsRestartRequest'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsSetExpression'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsSetVariable'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsStepBack'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsStepInTargetsRequest'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsSteppingGranularity'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsTerminateRequest'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsTerminateThreadsRequest'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsValueFormattingOptions'] is! bool?) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (additionalModuleColumns != null)
+          'additionalModuleColumns': additionalModuleColumns,
+        if (completionTriggerCharacters != null)
+          'completionTriggerCharacters': completionTriggerCharacters,
+        if (exceptionBreakpointFilters != null)
+          'exceptionBreakpointFilters': exceptionBreakpointFilters,
+        if (supportSuspendDebuggee != null)
+          'supportSuspendDebuggee': supportSuspendDebuggee,
+        if (supportTerminateDebuggee != null)
+          'supportTerminateDebuggee': supportTerminateDebuggee,
+        if (supportedChecksumAlgorithms != null)
+          'supportedChecksumAlgorithms': supportedChecksumAlgorithms,
+        if (supportsBreakpointLocationsRequest != null)
+          'supportsBreakpointLocationsRequest':
+              supportsBreakpointLocationsRequest,
+        if (supportsCancelRequest != null)
+          'supportsCancelRequest': supportsCancelRequest,
+        if (supportsClipboardContext != null)
+          'supportsClipboardContext': supportsClipboardContext,
+        if (supportsCompletionsRequest != null)
+          'supportsCompletionsRequest': supportsCompletionsRequest,
+        if (supportsConditionalBreakpoints != null)
+          'supportsConditionalBreakpoints': supportsConditionalBreakpoints,
+        if (supportsConfigurationDoneRequest != null)
+          'supportsConfigurationDoneRequest': supportsConfigurationDoneRequest,
+        if (supportsDataBreakpoints != null)
+          'supportsDataBreakpoints': supportsDataBreakpoints,
+        if (supportsDelayedStackTraceLoading != null)
+          'supportsDelayedStackTraceLoading': supportsDelayedStackTraceLoading,
+        if (supportsDisassembleRequest != null)
+          'supportsDisassembleRequest': supportsDisassembleRequest,
+        if (supportsEvaluateForHovers != null)
+          'supportsEvaluateForHovers': supportsEvaluateForHovers,
+        if (supportsExceptionFilterOptions != null)
+          'supportsExceptionFilterOptions': supportsExceptionFilterOptions,
+        if (supportsExceptionInfoRequest != null)
+          'supportsExceptionInfoRequest': supportsExceptionInfoRequest,
+        if (supportsExceptionOptions != null)
+          'supportsExceptionOptions': supportsExceptionOptions,
+        if (supportsFunctionBreakpoints != null)
+          'supportsFunctionBreakpoints': supportsFunctionBreakpoints,
+        if (supportsGotoTargetsRequest != null)
+          'supportsGotoTargetsRequest': supportsGotoTargetsRequest,
+        if (supportsHitConditionalBreakpoints != null)
+          'supportsHitConditionalBreakpoints':
+              supportsHitConditionalBreakpoints,
+        if (supportsInstructionBreakpoints != null)
+          'supportsInstructionBreakpoints': supportsInstructionBreakpoints,
+        if (supportsLoadedSourcesRequest != null)
+          'supportsLoadedSourcesRequest': supportsLoadedSourcesRequest,
+        if (supportsLogPoints != null) 'supportsLogPoints': supportsLogPoints,
+        if (supportsModulesRequest != null)
+          'supportsModulesRequest': supportsModulesRequest,
+        if (supportsReadMemoryRequest != null)
+          'supportsReadMemoryRequest': supportsReadMemoryRequest,
+        if (supportsRestartFrame != null)
+          'supportsRestartFrame': supportsRestartFrame,
+        if (supportsRestartRequest != null)
+          'supportsRestartRequest': supportsRestartRequest,
+        if (supportsSetExpression != null)
+          'supportsSetExpression': supportsSetExpression,
+        if (supportsSetVariable != null)
+          'supportsSetVariable': supportsSetVariable,
+        if (supportsStepBack != null) 'supportsStepBack': supportsStepBack,
+        if (supportsStepInTargetsRequest != null)
+          'supportsStepInTargetsRequest': supportsStepInTargetsRequest,
+        if (supportsSteppingGranularity != null)
+          'supportsSteppingGranularity': supportsSteppingGranularity,
+        if (supportsTerminateRequest != null)
+          'supportsTerminateRequest': supportsTerminateRequest,
+        if (supportsTerminateThreadsRequest != null)
+          'supportsTerminateThreadsRequest': supportsTerminateThreadsRequest,
+        if (supportsValueFormattingOptions != null)
+          'supportsValueFormattingOptions': supportsValueFormattingOptions,
+      };
+}
+
+/// The checksum of an item calculated by the specified algorithm.
+class Checksum {
+  /// The algorithm used to calculate this checksum.
+  final ChecksumAlgorithm algorithm;
+
+  /// Value of the checksum.
+  final String checksum;
+
+  static Checksum fromJson(Map<String, Object?> obj) => Checksum.fromMap(obj);
+
+  Checksum({
+    required this.algorithm,
+    required this.checksum,
+  });
+
+  Checksum.fromMap(Map<String, Object?> obj)
+      : algorithm = ChecksumAlgorithm.fromJson(
+            obj['algorithm'] as Map<String, Object?>),
+        checksum = obj['checksum'] as String;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (!ChecksumAlgorithm.canParse(obj['algorithm'])) {
+      return false;
+    }
+    if (obj['checksum'] is! String) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'algorithm': algorithm,
+        'checksum': checksum,
+      };
+}
+
+/// Names of checksum algorithms that may be supported by a debug adapter.
+class ChecksumAlgorithm {
+  static ChecksumAlgorithm fromJson(Map<String, Object?> obj) =>
+      ChecksumAlgorithm.fromMap(obj);
+
+  ChecksumAlgorithm();
+
+  ChecksumAlgorithm.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+/// A ColumnDescriptor specifies what module attribute to show in a column of
+/// the ModulesView, how to format it,
+/// and what the column's label should be.
+/// It is only used if the underlying UI actually supports this level of
+/// customization.
+class ColumnDescriptor {
+  /// Name of the attribute rendered in this column.
+  final String attributeName;
+
+  /// Format to use for the rendered values in this column. TBD how the format
+  /// strings looks like.
+  final String? format;
+
+  /// Header UI label of column.
+  final String label;
+
+  /// Datatype of values in this column.  Defaults to 'string' if not specified.
+  final String? type;
+
+  /// Width of this column in characters (hint only).
+  final int? width;
+
+  static ColumnDescriptor fromJson(Map<String, Object?> obj) =>
+      ColumnDescriptor.fromMap(obj);
+
+  ColumnDescriptor({
+    required this.attributeName,
+    this.format,
+    required this.label,
+    this.type,
+    this.width,
+  });
+
+  ColumnDescriptor.fromMap(Map<String, Object?> obj)
+      : attributeName = obj['attributeName'] as String,
+        format = obj['format'] as String?,
+        label = obj['label'] as String,
+        type = obj['type'] as String?,
+        width = obj['width'] as int?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['attributeName'] is! String) {
+      return false;
+    }
+    if (obj['format'] is! String?) {
+      return false;
+    }
+    if (obj['label'] is! String) {
+      return false;
+    }
+    if (obj['type'] is! String?) {
+      return false;
+    }
+    if (obj['width'] is! int?) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'attributeName': attributeName,
+        if (format != null) 'format': format,
+        'label': label,
+        if (type != null) 'type': type,
+        if (width != null) 'width': width,
+      };
+}
+
+/// CompletionItems are the suggestions returned from the CompletionsRequest.
+class CompletionItem {
+  /// The label of this completion item. By default this is also the text that
+  /// is inserted when selecting this completion.
+  final String label;
+
+  /// This value determines how many characters are overwritten by the
+  /// completion text.
+  /// If missing the value 0 is assumed which results in the completion text
+  /// being inserted.
+  final int? length;
+
+  /// Determines the length of the new selection after the text has been
+  /// inserted (or replaced).
+  /// The selection can not extend beyond the bounds of the completion text.
+  /// If omitted the length is assumed to be 0.
+  final int? selectionLength;
+
+  /// Determines the start of the new selection after the text has been inserted
+  /// (or replaced).
+  /// The start position must in the range 0 and length of the completion text.
+  /// If omitted the selection starts at the end of the completion text.
+  final int? selectionStart;
+
+  /// A string that should be used when comparing this item with other items.
+  /// When `falsy` the label is used.
+  final String? sortText;
+
+  /// This value determines the location (in the CompletionsRequest's 'text'
+  /// attribute) where the completion text is added.
+  /// If missing the text is added at the location specified by the
+  /// CompletionsRequest's 'column' attribute.
+  final int? start;
+
+  /// If text is not falsy then it is inserted instead of the label.
+  final String? text;
+
+  /// The item's type. Typically the client uses this information to render the
+  /// item in the UI with an icon.
+  final CompletionItemType? type;
+
+  static CompletionItem fromJson(Map<String, Object?> obj) =>
+      CompletionItem.fromMap(obj);
+
+  CompletionItem({
+    required this.label,
+    this.length,
+    this.selectionLength,
+    this.selectionStart,
+    this.sortText,
+    this.start,
+    this.text,
+    this.type,
+  });
+
+  CompletionItem.fromMap(Map<String, Object?> obj)
+      : label = obj['label'] as String,
+        length = obj['length'] as int?,
+        selectionLength = obj['selectionLength'] as int?,
+        selectionStart = obj['selectionStart'] as int?,
+        sortText = obj['sortText'] as String?,
+        start = obj['start'] as int?,
+        text = obj['text'] as String?,
+        type = obj['type'] == null
+            ? null
+            : CompletionItemType.fromJson(obj['type'] as Map<String, Object?>);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['label'] is! String) {
+      return false;
+    }
+    if (obj['length'] is! int?) {
+      return false;
+    }
+    if (obj['selectionLength'] is! int?) {
+      return false;
+    }
+    if (obj['selectionStart'] is! int?) {
+      return false;
+    }
+    if (obj['sortText'] is! String?) {
+      return false;
+    }
+    if (obj['start'] is! int?) {
+      return false;
+    }
+    if (obj['text'] is! String?) {
+      return false;
+    }
+    if (!CompletionItemType?.canParse(obj['type'])) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'label': label,
+        if (length != null) 'length': length,
+        if (selectionLength != null) 'selectionLength': selectionLength,
+        if (selectionStart != null) 'selectionStart': selectionStart,
+        if (sortText != null) 'sortText': sortText,
+        if (start != null) 'start': start,
+        if (text != null) 'text': text,
+        if (type != null) 'type': type,
+      };
+}
+
+/// Some predefined types for the CompletionItem. Please note that not all
+/// clients have specific icons for all of them.
+class CompletionItemType {
+  static CompletionItemType fromJson(Map<String, Object?> obj) =>
+      CompletionItemType.fromMap(obj);
+
+  CompletionItemType();
+
+  CompletionItemType.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+/// Arguments for 'completions' request.
+class CompletionsArguments extends RequestArguments {
+  /// The character position for which to determine the completion proposals.
+  final int column;
+
+  /// Returns completions in the scope of this stack frame. If not specified,
+  /// the completions are returned for the global scope.
+  final int? frameId;
+
+  /// An optional line for which to determine the completion proposals. If
+  /// missing the first line of the text is assumed.
+  final int? line;
+
+  /// One or more source lines. Typically this is the text a user has typed into
+  /// the debug console before he asked for completion.
+  final String text;
+
+  static CompletionsArguments fromJson(Map<String, Object?> obj) =>
+      CompletionsArguments.fromMap(obj);
+
+  CompletionsArguments({
+    required this.column,
+    this.frameId,
+    this.line,
+    required this.text,
+  });
+
+  CompletionsArguments.fromMap(Map<String, Object?> obj)
+      : column = obj['column'] as int,
+        frameId = obj['frameId'] as int?,
+        line = obj['line'] as int?,
+        text = obj['text'] as String;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['column'] is! int) {
+      return false;
+    }
+    if (obj['frameId'] is! int?) {
+      return false;
+    }
+    if (obj['line'] is! int?) {
+      return false;
+    }
+    if (obj['text'] is! String) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'column': column,
+        if (frameId != null) 'frameId': frameId,
+        if (line != null) 'line': line,
+        'text': text,
+      };
+}
+
+/// Response to 'completions' request.
+class CompletionsResponse extends Response {
+  static CompletionsResponse fromJson(Map<String, Object?> obj) =>
+      CompletionsResponse.fromMap(obj);
+
+  CompletionsResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  CompletionsResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Arguments for 'configurationDone' request.
+class ConfigurationDoneArguments extends RequestArguments {
+  static ConfigurationDoneArguments fromJson(Map<String, Object?> obj) =>
+      ConfigurationDoneArguments.fromMap(obj);
+
+  ConfigurationDoneArguments();
+
+  ConfigurationDoneArguments.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+/// Response to 'configurationDone' request. This is just an acknowledgement, so
+/// no body field is required.
+class ConfigurationDoneResponse extends Response {
+  static ConfigurationDoneResponse fromJson(Map<String, Object?> obj) =>
+      ConfigurationDoneResponse.fromMap(obj);
+
+  ConfigurationDoneResponse({
+    Object? body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  ConfigurationDoneResponse.fromMap(Map<String, Object?> obj)
+      : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Arguments for 'continue' request.
+class ContinueArguments extends RequestArguments {
+  /// Continue execution for the specified thread (if possible).
+  /// If the backend cannot continue on a single thread but will continue on all
+  /// threads, it should set the 'allThreadsContinued' attribute in the response
+  /// to true.
+  final int threadId;
+
+  static ContinueArguments fromJson(Map<String, Object?> obj) =>
+      ContinueArguments.fromMap(obj);
+
+  ContinueArguments({
+    required this.threadId,
+  });
+
+  ContinueArguments.fromMap(Map<String, Object?> obj)
+      : threadId = obj['threadId'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['threadId'] is! int) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'threadId': threadId,
+      };
+}
+
+/// Response to 'continue' request.
+class ContinueResponse extends Response {
+  static ContinueResponse fromJson(Map<String, Object?> obj) =>
+      ContinueResponse.fromMap(obj);
+
+  ContinueResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  ContinueResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Properties of a data breakpoint passed to the setDataBreakpoints request.
+class DataBreakpoint {
+  /// The access type of the data.
+  final DataBreakpointAccessType? accessType;
+
+  /// An optional expression for conditional breakpoints.
+  final String? condition;
+
+  /// An id representing the data. This id is returned from the
+  /// dataBreakpointInfo request.
+  final String dataId;
+
+  /// An optional expression that controls how many hits of the breakpoint are
+  /// ignored.
+  /// The backend is expected to interpret the expression as needed.
+  final String? hitCondition;
+
+  static DataBreakpoint fromJson(Map<String, Object?> obj) =>
+      DataBreakpoint.fromMap(obj);
+
+  DataBreakpoint({
+    this.accessType,
+    this.condition,
+    required this.dataId,
+    this.hitCondition,
+  });
+
+  DataBreakpoint.fromMap(Map<String, Object?> obj)
+      : accessType = obj['accessType'] == null
+            ? null
+            : DataBreakpointAccessType.fromJson(
+                obj['accessType'] as Map<String, Object?>),
+        condition = obj['condition'] as String?,
+        dataId = obj['dataId'] as String,
+        hitCondition = obj['hitCondition'] as String?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (!DataBreakpointAccessType?.canParse(obj['accessType'])) {
+      return false;
+    }
+    if (obj['condition'] is! String?) {
+      return false;
+    }
+    if (obj['dataId'] is! String) {
+      return false;
+    }
+    if (obj['hitCondition'] is! String?) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (accessType != null) 'accessType': accessType,
+        if (condition != null) 'condition': condition,
+        'dataId': dataId,
+        if (hitCondition != null) 'hitCondition': hitCondition,
+      };
+}
+
+/// This enumeration defines all possible access types for data breakpoints.
+class DataBreakpointAccessType {
+  static DataBreakpointAccessType fromJson(Map<String, Object?> obj) =>
+      DataBreakpointAccessType.fromMap(obj);
+
+  DataBreakpointAccessType();
+
+  DataBreakpointAccessType.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+/// Arguments for 'dataBreakpointInfo' request.
+class DataBreakpointInfoArguments extends RequestArguments {
+  /// The name of the Variable's child to obtain data breakpoint information
+  /// for.
+  /// If variablesReference isn’t provided, this can be an expression.
+  final String name;
+
+  /// Reference to the Variable container if the data breakpoint is requested
+  /// for a child of the container.
+  final int? variablesReference;
+
+  static DataBreakpointInfoArguments fromJson(Map<String, Object?> obj) =>
+      DataBreakpointInfoArguments.fromMap(obj);
+
+  DataBreakpointInfoArguments({
+    required this.name,
+    this.variablesReference,
+  });
+
+  DataBreakpointInfoArguments.fromMap(Map<String, Object?> obj)
+      : name = obj['name'] as String,
+        variablesReference = obj['variablesReference'] as int?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['name'] is! String) {
+      return false;
+    }
+    if (obj['variablesReference'] is! int?) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'name': name,
+        if (variablesReference != null)
+          'variablesReference': variablesReference,
+      };
+}
+
+/// Response to 'dataBreakpointInfo' request.
+class DataBreakpointInfoResponse extends Response {
+  static DataBreakpointInfoResponse fromJson(Map<String, Object?> obj) =>
+      DataBreakpointInfoResponse.fromMap(obj);
+
+  DataBreakpointInfoResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  DataBreakpointInfoResponse.fromMap(Map<String, Object?> obj)
+      : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Arguments for 'disassemble' request.
+class DisassembleArguments extends RequestArguments {
+  /// Number of instructions to disassemble starting at the specified location
+  /// and offset.
+  /// An adapter must return exactly this number of instructions - any
+  /// unavailable instructions should be replaced with an implementation-defined
+  /// 'invalid instruction' value.
+  final int instructionCount;
+
+  /// Optional offset (in instructions) to be applied after the byte offset (if
+  /// any) before disassembling. Can be negative.
+  final int? instructionOffset;
+
+  /// Memory reference to the base location containing the instructions to
+  /// disassemble.
+  final String memoryReference;
+
+  /// Optional offset (in bytes) to be applied to the reference location before
+  /// disassembling. Can be negative.
+  final int? offset;
+
+  /// If true, the adapter should attempt to resolve memory addresses and other
+  /// values to symbolic names.
+  final bool? resolveSymbols;
+
+  static DisassembleArguments fromJson(Map<String, Object?> obj) =>
+      DisassembleArguments.fromMap(obj);
+
+  DisassembleArguments({
+    required this.instructionCount,
+    this.instructionOffset,
+    required this.memoryReference,
+    this.offset,
+    this.resolveSymbols,
+  });
+
+  DisassembleArguments.fromMap(Map<String, Object?> obj)
+      : instructionCount = obj['instructionCount'] as int,
+        instructionOffset = obj['instructionOffset'] as int?,
+        memoryReference = obj['memoryReference'] as String,
+        offset = obj['offset'] as int?,
+        resolveSymbols = obj['resolveSymbols'] as bool?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['instructionCount'] is! int) {
+      return false;
+    }
+    if (obj['instructionOffset'] is! int?) {
+      return false;
+    }
+    if (obj['memoryReference'] is! String) {
+      return false;
+    }
+    if (obj['offset'] is! int?) {
+      return false;
+    }
+    if (obj['resolveSymbols'] is! bool?) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'instructionCount': instructionCount,
+        if (instructionOffset != null) 'instructionOffset': instructionOffset,
+        'memoryReference': memoryReference,
+        if (offset != null) 'offset': offset,
+        if (resolveSymbols != null) 'resolveSymbols': resolveSymbols,
+      };
+}
+
+/// Response to 'disassemble' request.
+class DisassembleResponse extends Response {
+  static DisassembleResponse fromJson(Map<String, Object?> obj) =>
+      DisassembleResponse.fromMap(obj);
+
+  DisassembleResponse({
+    Map<String, Object?>? body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  DisassembleResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>?) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Represents a single disassembled instruction.
+class DisassembledInstruction {
+  /// The address of the instruction. Treated as a hex value if prefixed with
+  /// '0x', or as a decimal value otherwise.
+  final String address;
+
+  /// The column within the line that corresponds to this instruction, if any.
+  final int? column;
+
+  /// The end column of the range that corresponds to this instruction, if any.
+  final int? endColumn;
+
+  /// The end line of the range that corresponds to this instruction, if any.
+  final int? endLine;
+
+  /// Text representing the instruction and its operands, in an
+  /// implementation-defined format.
+  final String instruction;
+
+  /// Optional raw bytes representing the instruction and its operands, in an
+  /// implementation-defined format.
+  final String? instructionBytes;
+
+  /// The line within the source location that corresponds to this instruction,
+  /// if any.
+  final int? line;
+
+  /// Source location that corresponds to this instruction, if any.
+  /// Should always be set (if available) on the first instruction returned,
+  /// but can be omitted afterwards if this instruction maps to the same source
+  /// file as the previous instruction.
+  final Source? location;
+
+  /// Name of the symbol that corresponds with the location of this instruction,
+  /// if any.
+  final String? symbol;
+
+  static DisassembledInstruction fromJson(Map<String, Object?> obj) =>
+      DisassembledInstruction.fromMap(obj);
+
+  DisassembledInstruction({
+    required this.address,
+    this.column,
+    this.endColumn,
+    this.endLine,
+    required this.instruction,
+    this.instructionBytes,
+    this.line,
+    this.location,
+    this.symbol,
+  });
+
+  DisassembledInstruction.fromMap(Map<String, Object?> obj)
+      : address = obj['address'] as String,
+        column = obj['column'] as int?,
+        endColumn = obj['endColumn'] as int?,
+        endLine = obj['endLine'] as int?,
+        instruction = obj['instruction'] as String,
+        instructionBytes = obj['instructionBytes'] as String?,
+        line = obj['line'] as int?,
+        location = obj['location'] == null
+            ? null
+            : Source.fromJson(obj['location'] as Map<String, Object?>),
+        symbol = obj['symbol'] as String?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['address'] is! String) {
+      return false;
+    }
+    if (obj['column'] is! int?) {
+      return false;
+    }
+    if (obj['endColumn'] is! int?) {
+      return false;
+    }
+    if (obj['endLine'] is! int?) {
+      return false;
+    }
+    if (obj['instruction'] is! String) {
+      return false;
+    }
+    if (obj['instructionBytes'] is! String?) {
+      return false;
+    }
+    if (obj['line'] is! int?) {
+      return false;
+    }
+    if (!Source?.canParse(obj['location'])) {
+      return false;
+    }
+    if (obj['symbol'] is! String?) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'address': address,
+        if (column != null) 'column': column,
+        if (endColumn != null) 'endColumn': endColumn,
+        if (endLine != null) 'endLine': endLine,
+        'instruction': instruction,
+        if (instructionBytes != null) 'instructionBytes': instructionBytes,
+        if (line != null) 'line': line,
+        if (location != null) 'location': location,
+        if (symbol != null) 'symbol': symbol,
+      };
+}
+
+/// Arguments for 'disconnect' request.
+class DisconnectArguments extends RequestArguments {
+  /// A value of true indicates that this 'disconnect' request is part of a
+  /// restart sequence.
+  final bool? restart;
+
+  /// Indicates whether the debuggee should stay suspended when the debugger is
+  /// disconnected.
+  /// If unspecified, the debuggee should resume execution.
+  /// The attribute is only honored by a debug adapter if the capability
+  /// 'supportSuspendDebuggee' is true.
+  final bool? suspendDebuggee;
+
+  /// Indicates whether the debuggee should be terminated when the debugger is
+  /// disconnected.
+  /// If unspecified, the debug adapter is free to do whatever it thinks is
+  /// best.
+  /// The attribute is only honored by a debug adapter if the capability
+  /// 'supportTerminateDebuggee' is true.
+  final bool? terminateDebuggee;
+
+  static DisconnectArguments fromJson(Map<String, Object?> obj) =>
+      DisconnectArguments.fromMap(obj);
+
+  DisconnectArguments({
+    this.restart,
+    this.suspendDebuggee,
+    this.terminateDebuggee,
+  });
+
+  DisconnectArguments.fromMap(Map<String, Object?> obj)
+      : restart = obj['restart'] as bool?,
+        suspendDebuggee = obj['suspendDebuggee'] as bool?,
+        terminateDebuggee = obj['terminateDebuggee'] as bool?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['restart'] is! bool?) {
+      return false;
+    }
+    if (obj['suspendDebuggee'] is! bool?) {
+      return false;
+    }
+    if (obj['terminateDebuggee'] is! bool?) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (restart != null) 'restart': restart,
+        if (suspendDebuggee != null) 'suspendDebuggee': suspendDebuggee,
+        if (terminateDebuggee != null) 'terminateDebuggee': terminateDebuggee,
+      };
+}
+
+/// Response to 'disconnect' request. This is just an acknowledgement, so no
+/// body field is required.
+class DisconnectResponse extends Response {
+  static DisconnectResponse fromJson(Map<String, Object?> obj) =>
+      DisconnectResponse.fromMap(obj);
+
+  DisconnectResponse({
+    Object? body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  DisconnectResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// On error (whenever 'success' is false), the body can provide more details.
+class ErrorResponse extends Response {
+  static ErrorResponse fromJson(Map<String, Object?> obj) =>
+      ErrorResponse.fromMap(obj);
+
+  ErrorResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  ErrorResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Arguments for 'evaluate' request.
+class EvaluateArguments extends RequestArguments {
+  /// The context in which the evaluate request is run.
+  final String? context;
+
+  /// The expression to evaluate.
+  final String expression;
+
+  /// Specifies details on how to format the Evaluate result.
+  /// The attribute is only honored by a debug adapter if the capability
+  /// 'supportsValueFormattingOptions' is true.
+  final ValueFormat? format;
+
+  /// Evaluate the expression in the scope of this stack frame. If not
+  /// specified, the expression is evaluated in the global scope.
+  final int? frameId;
+
+  static EvaluateArguments fromJson(Map<String, Object?> obj) =>
+      EvaluateArguments.fromMap(obj);
+
+  EvaluateArguments({
+    this.context,
+    required this.expression,
+    this.format,
+    this.frameId,
+  });
+
+  EvaluateArguments.fromMap(Map<String, Object?> obj)
+      : context = obj['context'] as String?,
+        expression = obj['expression'] as String,
+        format = obj['format'] == null
+            ? null
+            : ValueFormat.fromJson(obj['format'] as Map<String, Object?>),
+        frameId = obj['frameId'] as int?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['context'] is! String?) {
+      return false;
+    }
+    if (obj['expression'] is! String) {
+      return false;
+    }
+    if (!ValueFormat?.canParse(obj['format'])) {
+      return false;
+    }
+    if (obj['frameId'] is! int?) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (context != null) 'context': context,
+        'expression': expression,
+        if (format != null) 'format': format,
+        if (frameId != null) 'frameId': frameId,
+      };
+}
+
+/// Response to 'evaluate' request.
+class EvaluateResponse extends Response {
+  static EvaluateResponse fromJson(Map<String, Object?> obj) =>
+      EvaluateResponse.fromMap(obj);
+
+  EvaluateResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  EvaluateResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// A debug adapter initiated event.
+class Event extends ProtocolMessage {
+  /// Event-specific information.
+  final Object? body;
+
+  /// Type of event.
+  final String event;
+
+  static Event fromJson(Map<String, Object?> obj) => Event.fromMap(obj);
+
+  Event({
+    this.body,
+    required this.event,
+    required int seq,
+  }) : super(
+          seq: seq,
+          type: 'event',
+        );
+
+  Event.fromMap(Map<String, Object?> obj)
+      : body = obj['body'],
+        event = obj['event'] as String,
+        super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['event'] is! String) {
+      return false;
+    }
+    if (obj['type'] is! String) {
+      return false;
+    }
+    return ProtocolMessage.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+        if (body != null) 'body': body,
+        'event': event,
+      };
+}
+
+/// This enumeration defines all possible conditions when a thrown exception
+/// should result in a break.
+/// never: never breaks,
+/// always: always breaks,
+/// unhandled: breaks when exception unhandled,
+/// userUnhandled: breaks if the exception is not handled by user code.
+class ExceptionBreakMode {
+  static ExceptionBreakMode fromJson(Map<String, Object?> obj) =>
+      ExceptionBreakMode.fromMap(obj);
+
+  ExceptionBreakMode();
+
+  ExceptionBreakMode.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+/// An ExceptionBreakpointsFilter is shown in the UI as an filter option for
+/// configuring how exceptions are dealt with.
+class ExceptionBreakpointsFilter {
+  /// An optional help text providing information about the condition. This
+  /// string is shown as the placeholder text for a text box and must be
+  /// translated.
+  final String? conditionDescription;
+
+  /// Initial value of the filter option. If not specified a value 'false' is
+  /// assumed.
+  final bool? defaultValue;
+
+  /// An optional help text providing additional information about the exception
+  /// filter. This string is typically shown as a hover and must be translated.
+  final String? description;
+
+  /// The internal ID of the filter option. This value is passed to the
+  /// 'setExceptionBreakpoints' request.
+  final String filter;
+
+  /// The name of the filter option. This will be shown in the UI.
+  final String label;
+
+  /// Controls whether a condition can be specified for this filter option. If
+  /// false or missing, a condition can not be set.
+  final bool? supportsCondition;
+
+  static ExceptionBreakpointsFilter fromJson(Map<String, Object?> obj) =>
+      ExceptionBreakpointsFilter.fromMap(obj);
+
+  ExceptionBreakpointsFilter({
+    this.conditionDescription,
+    this.defaultValue,
+    this.description,
+    required this.filter,
+    required this.label,
+    this.supportsCondition,
+  });
+
+  ExceptionBreakpointsFilter.fromMap(Map<String, Object?> obj)
+      : conditionDescription = obj['conditionDescription'] as String?,
+        defaultValue = obj['default'] as bool?,
+        description = obj['description'] as String?,
+        filter = obj['filter'] as String,
+        label = obj['label'] as String,
+        supportsCondition = obj['supportsCondition'] as bool?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['conditionDescription'] is! String?) {
+      return false;
+    }
+    if (obj['default'] is! bool?) {
+      return false;
+    }
+    if (obj['description'] is! String?) {
+      return false;
+    }
+    if (obj['filter'] is! String) {
+      return false;
+    }
+    if (obj['label'] is! String) {
+      return false;
+    }
+    if (obj['supportsCondition'] is! bool?) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (conditionDescription != null)
+          'conditionDescription': conditionDescription,
+        if (defaultValue != null) 'default': defaultValue,
+        if (description != null) 'description': description,
+        'filter': filter,
+        'label': label,
+        if (supportsCondition != null) 'supportsCondition': supportsCondition,
+      };
+}
+
+/// Detailed information about an exception that has occurred.
+class ExceptionDetails {
+  /// Optional expression that can be evaluated in the current scope to obtain
+  /// the exception object.
+  final String? evaluateName;
+
+  /// Fully-qualified type name of the exception object.
+  final String? fullTypeName;
+
+  /// Details of the exception contained by this exception, if any.
+  final List<ExceptionDetails>? innerException;
+
+  /// Message contained in the exception.
+  final String? message;
+
+  /// Stack trace at the time the exception was thrown.
+  final String? stackTrace;
+
+  /// Short type name of the exception object.
+  final String? typeName;
+
+  static ExceptionDetails fromJson(Map<String, Object?> obj) =>
+      ExceptionDetails.fromMap(obj);
+
+  ExceptionDetails({
+    this.evaluateName,
+    this.fullTypeName,
+    this.innerException,
+    this.message,
+    this.stackTrace,
+    this.typeName,
+  });
+
+  ExceptionDetails.fromMap(Map<String, Object?> obj)
+      : evaluateName = obj['evaluateName'] as String?,
+        fullTypeName = obj['fullTypeName'] as String?,
+        innerException = (obj['innerException'] as List?)
+            ?.map((item) =>
+                ExceptionDetails.fromJson(item as Map<String, Object?>))
+            .toList(),
+        message = obj['message'] as String?,
+        stackTrace = obj['stackTrace'] as String?,
+        typeName = obj['typeName'] as String?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['evaluateName'] is! String?) {
+      return false;
+    }
+    if (obj['fullTypeName'] is! String?) {
+      return false;
+    }
+    if ((obj['innerException'] is! List ||
+        (obj['innerException']
+            .any((item) => !ExceptionDetails.canParse(item))))) {
+      return false;
+    }
+    if (obj['message'] is! String?) {
+      return false;
+    }
+    if (obj['stackTrace'] is! String?) {
+      return false;
+    }
+    if (obj['typeName'] is! String?) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (evaluateName != null) 'evaluateName': evaluateName,
+        if (fullTypeName != null) 'fullTypeName': fullTypeName,
+        if (innerException != null) 'innerException': innerException,
+        if (message != null) 'message': message,
+        if (stackTrace != null) 'stackTrace': stackTrace,
+        if (typeName != null) 'typeName': typeName,
+      };
+}
+
+/// An ExceptionFilterOptions is used to specify an exception filter together
+/// with a condition for the setExceptionsFilter request.
+class ExceptionFilterOptions {
+  /// An optional expression for conditional exceptions.
+  /// The exception will break into the debugger if the result of the condition
+  /// is true.
+  final String? condition;
+
+  /// ID of an exception filter returned by the 'exceptionBreakpointFilters'
+  /// capability.
+  final String filterId;
+
+  static ExceptionFilterOptions fromJson(Map<String, Object?> obj) =>
+      ExceptionFilterOptions.fromMap(obj);
+
+  ExceptionFilterOptions({
+    this.condition,
+    required this.filterId,
+  });
+
+  ExceptionFilterOptions.fromMap(Map<String, Object?> obj)
+      : condition = obj['condition'] as String?,
+        filterId = obj['filterId'] as String;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['condition'] is! String?) {
+      return false;
+    }
+    if (obj['filterId'] is! String) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (condition != null) 'condition': condition,
+        'filterId': filterId,
+      };
+}
+
+/// Arguments for 'exceptionInfo' request.
+class ExceptionInfoArguments extends RequestArguments {
+  /// Thread for which exception information should be retrieved.
+  final int threadId;
+
+  static ExceptionInfoArguments fromJson(Map<String, Object?> obj) =>
+      ExceptionInfoArguments.fromMap(obj);
+
+  ExceptionInfoArguments({
+    required this.threadId,
+  });
+
+  ExceptionInfoArguments.fromMap(Map<String, Object?> obj)
+      : threadId = obj['threadId'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['threadId'] is! int) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'threadId': threadId,
+      };
+}
+
+/// Response to 'exceptionInfo' request.
+class ExceptionInfoResponse extends Response {
+  static ExceptionInfoResponse fromJson(Map<String, Object?> obj) =>
+      ExceptionInfoResponse.fromMap(obj);
+
+  ExceptionInfoResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  ExceptionInfoResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// An ExceptionOptions assigns configuration options to a set of exceptions.
+class ExceptionOptions {
+  /// Condition when a thrown exception should result in a break.
+  final ExceptionBreakMode breakMode;
+
+  /// A path that selects a single or multiple exceptions in a tree. If 'path'
+  /// is missing, the whole tree is selected.
+  /// By convention the first segment of the path is a category that is used to
+  /// group exceptions in the UI.
+  final List<ExceptionPathSegment>? path;
+
+  static ExceptionOptions fromJson(Map<String, Object?> obj) =>
+      ExceptionOptions.fromMap(obj);
+
+  ExceptionOptions({
+    required this.breakMode,
+    this.path,
+  });
+
+  ExceptionOptions.fromMap(Map<String, Object?> obj)
+      : breakMode = ExceptionBreakMode.fromJson(
+            obj['breakMode'] as Map<String, Object?>),
+        path = (obj['path'] as List?)
+            ?.map((item) =>
+                ExceptionPathSegment.fromJson(item as Map<String, Object?>))
+            .toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (!ExceptionBreakMode.canParse(obj['breakMode'])) {
+      return false;
+    }
+    if ((obj['path'] is! List ||
+        (obj['path'].any((item) => !ExceptionPathSegment.canParse(item))))) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'breakMode': breakMode,
+        if (path != null) 'path': path,
+      };
+}
+
+/// An ExceptionPathSegment represents a segment in a path that is used to match
+/// leafs or nodes in a tree of exceptions.
+/// If a segment consists of more than one name, it matches the names provided
+/// if 'negate' is false or missing or
+/// it matches anything except the names provided if 'negate' is true.
+class ExceptionPathSegment {
+  /// Depending on the value of 'negate' the names that should match or not
+  /// match.
+  final List<String> names;
+
+  /// If false or missing this segment matches the names provided, otherwise it
+  /// matches anything except the names provided.
+  final bool? negate;
+
+  static ExceptionPathSegment fromJson(Map<String, Object?> obj) =>
+      ExceptionPathSegment.fromMap(obj);
+
+  ExceptionPathSegment({
+    required this.names,
+    this.negate,
+  });
+
+  ExceptionPathSegment.fromMap(Map<String, Object?> obj)
+      : names = (obj['names'] as List).map((item) => item as String).toList(),
+        negate = obj['negate'] as bool?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['names'] is! List ||
+        (obj['names'].any((item) => item is! String)))) {
+      return false;
+    }
+    if (obj['negate'] is! bool?) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'names': names,
+        if (negate != null) 'negate': negate,
+      };
+}
+
+/// Properties of a breakpoint passed to the setFunctionBreakpoints request.
+class FunctionBreakpoint {
+  /// An optional expression for conditional breakpoints.
+  /// It is only honored by a debug adapter if the capability
+  /// 'supportsConditionalBreakpoints' is true.
+  final String? condition;
+
+  /// An optional expression that controls how many hits of the breakpoint are
+  /// ignored.
+  /// The backend is expected to interpret the expression as needed.
+  /// The attribute is only honored by a debug adapter if the capability
+  /// 'supportsHitConditionalBreakpoints' is true.
+  final String? hitCondition;
+
+  /// The name of the function.
+  final String name;
+
+  static FunctionBreakpoint fromJson(Map<String, Object?> obj) =>
+      FunctionBreakpoint.fromMap(obj);
+
+  FunctionBreakpoint({
+    this.condition,
+    this.hitCondition,
+    required this.name,
+  });
+
+  FunctionBreakpoint.fromMap(Map<String, Object?> obj)
+      : condition = obj['condition'] as String?,
+        hitCondition = obj['hitCondition'] as String?,
+        name = obj['name'] as String;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['condition'] is! String?) {
+      return false;
+    }
+    if (obj['hitCondition'] is! String?) {
+      return false;
+    }
+    if (obj['name'] is! String) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (condition != null) 'condition': condition,
+        if (hitCondition != null) 'hitCondition': hitCondition,
+        'name': name,
+      };
+}
+
+/// Arguments for 'goto' request.
+class GotoArguments extends RequestArguments {
+  /// The location where the debuggee will continue to run.
+  final int targetId;
+
+  /// Set the goto target for this thread.
+  final int threadId;
+
+  static GotoArguments fromJson(Map<String, Object?> obj) =>
+      GotoArguments.fromMap(obj);
+
+  GotoArguments({
+    required this.targetId,
+    required this.threadId,
+  });
+
+  GotoArguments.fromMap(Map<String, Object?> obj)
+      : targetId = obj['targetId'] as int,
+        threadId = obj['threadId'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['targetId'] is! int) {
+      return false;
+    }
+    if (obj['threadId'] is! int) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'targetId': targetId,
+        'threadId': threadId,
+      };
+}
+
+/// Response to 'goto' request. This is just an acknowledgement, so no body
+/// field is required.
+class GotoResponse extends Response {
+  static GotoResponse fromJson(Map<String, Object?> obj) =>
+      GotoResponse.fromMap(obj);
+
+  GotoResponse({
+    Object? body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  GotoResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// A GotoTarget describes a code location that can be used as a target in the
+/// 'goto' request.
+/// The possible goto targets can be determined via the 'gotoTargets' request.
+class GotoTarget {
+  /// An optional column of the goto target.
+  final int? column;
+
+  /// An optional end column of the range covered by the goto target.
+  final int? endColumn;
+
+  /// An optional end line of the range covered by the goto target.
+  final int? endLine;
+
+  /// Unique identifier for a goto target. This is used in the goto request.
+  final int id;
+
+  /// Optional memory reference for the instruction pointer value represented by
+  /// this target.
+  final String? instructionPointerReference;
+
+  /// The name of the goto target (shown in the UI).
+  final String label;
+
+  /// The line of the goto target.
+  final int line;
+
+  static GotoTarget fromJson(Map<String, Object?> obj) =>
+      GotoTarget.fromMap(obj);
+
+  GotoTarget({
+    this.column,
+    this.endColumn,
+    this.endLine,
+    required this.id,
+    this.instructionPointerReference,
+    required this.label,
+    required this.line,
+  });
+
+  GotoTarget.fromMap(Map<String, Object?> obj)
+      : column = obj['column'] as int?,
+        endColumn = obj['endColumn'] as int?,
+        endLine = obj['endLine'] as int?,
+        id = obj['id'] as int,
+        instructionPointerReference =
+            obj['instructionPointerReference'] as String?,
+        label = obj['label'] as String,
+        line = obj['line'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['column'] is! int?) {
+      return false;
+    }
+    if (obj['endColumn'] is! int?) {
+      return false;
+    }
+    if (obj['endLine'] is! int?) {
+      return false;
+    }
+    if (obj['id'] is! int) {
+      return false;
+    }
+    if (obj['instructionPointerReference'] is! String?) {
+      return false;
+    }
+    if (obj['label'] is! String) {
+      return false;
+    }
+    if (obj['line'] is! int) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (column != null) 'column': column,
+        if (endColumn != null) 'endColumn': endColumn,
+        if (endLine != null) 'endLine': endLine,
+        'id': id,
+        if (instructionPointerReference != null)
+          'instructionPointerReference': instructionPointerReference,
+        'label': label,
+        'line': line,
+      };
+}
+
+/// Arguments for 'gotoTargets' request.
+class GotoTargetsArguments extends RequestArguments {
+  /// An optional column location for which the goto targets are determined.
+  final int? column;
+
+  /// The line location for which the goto targets are determined.
+  final int line;
+
+  /// The source location for which the goto targets are determined.
+  final Source source;
+
+  static GotoTargetsArguments fromJson(Map<String, Object?> obj) =>
+      GotoTargetsArguments.fromMap(obj);
+
+  GotoTargetsArguments({
+    this.column,
+    required this.line,
+    required this.source,
+  });
+
+  GotoTargetsArguments.fromMap(Map<String, Object?> obj)
+      : column = obj['column'] as int?,
+        line = obj['line'] as int,
+        source = Source.fromJson(obj['source'] as Map<String, Object?>);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['column'] is! int?) {
+      return false;
+    }
+    if (obj['line'] is! int) {
+      return false;
+    }
+    if (!Source.canParse(obj['source'])) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (column != null) 'column': column,
+        'line': line,
+        'source': source,
+      };
+}
+
+/// Response to 'gotoTargets' request.
+class GotoTargetsResponse extends Response {
+  static GotoTargetsResponse fromJson(Map<String, Object?> obj) =>
+      GotoTargetsResponse.fromMap(obj);
+
+  GotoTargetsResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  GotoTargetsResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Arguments for 'initialize' request.
+class InitializeRequestArguments extends RequestArguments {
+  /// The ID of the debug adapter.
+  final String adapterID;
+
+  /// The ID of the (frontend) client using this adapter.
+  final String? clientID;
+
+  /// The human readable name of the (frontend) client using this adapter.
+  final String? clientName;
+
+  /// If true all column numbers are 1-based (default).
+  final bool? columnsStartAt1;
+
+  /// If true all line numbers are 1-based (default).
+  final bool? linesStartAt1;
+
+  /// The ISO-639 locale of the (frontend) client using this adapter, e.g. en-US
+  /// or de-CH.
+  final String? locale;
+
+  /// Determines in what format paths are specified. The default is 'path',
+  /// which is the native format.
+  final String? pathFormat;
+
+  /// Client supports the invalidated event.
+  final bool? supportsInvalidatedEvent;
+
+  /// Client supports memory references.
+  final bool? supportsMemoryReferences;
+
+  /// Client supports progress reporting.
+  final bool? supportsProgressReporting;
+
+  /// Client supports the runInTerminal request.
+  final bool? supportsRunInTerminalRequest;
+
+  /// Client supports the paging of variables.
+  final bool? supportsVariablePaging;
+
+  /// Client supports the optional type attribute for variables.
+  final bool? supportsVariableType;
+
+  static InitializeRequestArguments fromJson(Map<String, Object?> obj) =>
+      InitializeRequestArguments.fromMap(obj);
+
+  InitializeRequestArguments({
+    required this.adapterID,
+    this.clientID,
+    this.clientName,
+    this.columnsStartAt1,
+    this.linesStartAt1,
+    this.locale,
+    this.pathFormat,
+    this.supportsInvalidatedEvent,
+    this.supportsMemoryReferences,
+    this.supportsProgressReporting,
+    this.supportsRunInTerminalRequest,
+    this.supportsVariablePaging,
+    this.supportsVariableType,
+  });
+
+  InitializeRequestArguments.fromMap(Map<String, Object?> obj)
+      : adapterID = obj['adapterID'] as String,
+        clientID = obj['clientID'] as String?,
+        clientName = obj['clientName'] as String?,
+        columnsStartAt1 = obj['columnsStartAt1'] as bool?,
+        linesStartAt1 = obj['linesStartAt1'] as bool?,
+        locale = obj['locale'] as String?,
+        pathFormat = obj['pathFormat'] as String?,
+        supportsInvalidatedEvent = obj['supportsInvalidatedEvent'] as bool?,
+        supportsMemoryReferences = obj['supportsMemoryReferences'] as bool?,
+        supportsProgressReporting = obj['supportsProgressReporting'] as bool?,
+        supportsRunInTerminalRequest =
+            obj['supportsRunInTerminalRequest'] as bool?,
+        supportsVariablePaging = obj['supportsVariablePaging'] as bool?,
+        supportsVariableType = obj['supportsVariableType'] as bool?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['adapterID'] is! String) {
+      return false;
+    }
+    if (obj['clientID'] is! String?) {
+      return false;
+    }
+    if (obj['clientName'] is! String?) {
+      return false;
+    }
+    if (obj['columnsStartAt1'] is! bool?) {
+      return false;
+    }
+    if (obj['linesStartAt1'] is! bool?) {
+      return false;
+    }
+    if (obj['locale'] is! String?) {
+      return false;
+    }
+    if (obj['pathFormat'] is! String?) {
+      return false;
+    }
+    if (obj['supportsInvalidatedEvent'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsMemoryReferences'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsProgressReporting'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsRunInTerminalRequest'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsVariablePaging'] is! bool?) {
+      return false;
+    }
+    if (obj['supportsVariableType'] is! bool?) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'adapterID': adapterID,
+        if (clientID != null) 'clientID': clientID,
+        if (clientName != null) 'clientName': clientName,
+        if (columnsStartAt1 != null) 'columnsStartAt1': columnsStartAt1,
+        if (linesStartAt1 != null) 'linesStartAt1': linesStartAt1,
+        if (locale != null) 'locale': locale,
+        if (pathFormat != null) 'pathFormat': pathFormat,
+        if (supportsInvalidatedEvent != null)
+          'supportsInvalidatedEvent': supportsInvalidatedEvent,
+        if (supportsMemoryReferences != null)
+          'supportsMemoryReferences': supportsMemoryReferences,
+        if (supportsProgressReporting != null)
+          'supportsProgressReporting': supportsProgressReporting,
+        if (supportsRunInTerminalRequest != null)
+          'supportsRunInTerminalRequest': supportsRunInTerminalRequest,
+        if (supportsVariablePaging != null)
+          'supportsVariablePaging': supportsVariablePaging,
+        if (supportsVariableType != null)
+          'supportsVariableType': supportsVariableType,
+      };
+}
+
+/// Response to 'initialize' request.
+class InitializeResponse extends Response {
+  static InitializeResponse fromJson(Map<String, Object?> obj) =>
+      InitializeResponse.fromMap(obj);
+
+  InitializeResponse({
+    Capabilities? body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  InitializeResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (!Capabilities?.canParse(obj['body'])) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Properties of a breakpoint passed to the setInstructionBreakpoints request
+class InstructionBreakpoint {
+  /// An optional expression for conditional breakpoints.
+  /// It is only honored by a debug adapter if the capability
+  /// 'supportsConditionalBreakpoints' is true.
+  final String? condition;
+
+  /// An optional expression that controls how many hits of the breakpoint are
+  /// ignored.
+  /// The backend is expected to interpret the expression as needed.
+  /// The attribute is only honored by a debug adapter if the capability
+  /// 'supportsHitConditionalBreakpoints' is true.
+  final String? hitCondition;
+
+  /// The instruction reference of the breakpoint.
+  /// This should be a memory or instruction pointer reference from an
+  /// EvaluateResponse, Variable, StackFrame, GotoTarget, or Breakpoint.
+  final String instructionReference;
+
+  /// An optional offset from the instruction reference.
+  /// This can be negative.
+  final int? offset;
+
+  static InstructionBreakpoint fromJson(Map<String, Object?> obj) =>
+      InstructionBreakpoint.fromMap(obj);
+
+  InstructionBreakpoint({
+    this.condition,
+    this.hitCondition,
+    required this.instructionReference,
+    this.offset,
+  });
+
+  InstructionBreakpoint.fromMap(Map<String, Object?> obj)
+      : condition = obj['condition'] as String?,
+        hitCondition = obj['hitCondition'] as String?,
+        instructionReference = obj['instructionReference'] as String,
+        offset = obj['offset'] as int?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['condition'] is! String?) {
+      return false;
+    }
+    if (obj['hitCondition'] is! String?) {
+      return false;
+    }
+    if (obj['instructionReference'] is! String) {
+      return false;
+    }
+    if (obj['offset'] is! int?) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (condition != null) 'condition': condition,
+        if (hitCondition != null) 'hitCondition': hitCondition,
+        'instructionReference': instructionReference,
+        if (offset != null) 'offset': offset,
+      };
+}
+
+/// Logical areas that can be invalidated by the 'invalidated' event.
+class InvalidatedAreas {
+  static InvalidatedAreas fromJson(Map<String, Object?> obj) =>
+      InvalidatedAreas.fromMap(obj);
+
+  InvalidatedAreas();
+
+  InvalidatedAreas.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+/// Arguments for 'launch' request. Additional attributes are implementation
+/// specific.
+class LaunchRequestArguments extends RequestArguments {
+  /// Optional data from the previous, restarted session.
+  /// The data is sent as the 'restart' attribute of the 'terminated' event.
+  /// The client should leave the data intact.
+  final Object? restart;
+
+  /// If noDebug is true the launch request should launch the program without
+  /// enabling debugging.
+  final bool? noDebug;
+
+  static LaunchRequestArguments fromJson(Map<String, Object?> obj) =>
+      LaunchRequestArguments.fromMap(obj);
+
+  LaunchRequestArguments({
+    this.restart,
+    this.noDebug,
+  });
+
+  LaunchRequestArguments.fromMap(Map<String, Object?> obj)
+      : restart = obj['__restart'],
+        noDebug = obj['noDebug'] as bool?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['noDebug'] is! bool?) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (restart != null) '__restart': restart,
+        if (noDebug != null) 'noDebug': noDebug,
+      };
+}
+
+/// Response to 'launch' request. This is just an acknowledgement, so no body
+/// field is required.
+class LaunchResponse extends Response {
+  static LaunchResponse fromJson(Map<String, Object?> obj) =>
+      LaunchResponse.fromMap(obj);
+
+  LaunchResponse({
+    Object? body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  LaunchResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Arguments for 'loadedSources' request.
+class LoadedSourcesArguments extends RequestArguments {
+  static LoadedSourcesArguments fromJson(Map<String, Object?> obj) =>
+      LoadedSourcesArguments.fromMap(obj);
+
+  LoadedSourcesArguments();
+
+  LoadedSourcesArguments.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+/// Response to 'loadedSources' request.
+class LoadedSourcesResponse extends Response {
+  static LoadedSourcesResponse fromJson(Map<String, Object?> obj) =>
+      LoadedSourcesResponse.fromMap(obj);
+
+  LoadedSourcesResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  LoadedSourcesResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// A structured message object. Used to return errors from requests.
+class Message {
+  /// A format string for the message. Embedded variables have the form
+  /// '{name}'.
+  /// If variable name starts with an underscore character, the variable does
+  /// not contain user data (PII) and can be safely used for telemetry purposes.
+  final String format;
+
+  /// Unique identifier for the message.
+  final int id;
+
+  /// If true send to telemetry.
+  final bool? sendTelemetry;
+
+  /// If true show user.
+  final bool? showUser;
+
+  /// An optional url where additional information about this message can be
+  /// found.
+  final String? url;
+
+  /// An optional label that is presented to the user as the UI for opening the
+  /// url.
+  final String? urlLabel;
+
+  /// An object used as a dictionary for looking up the variables in the format
+  /// string.
+  final Map<String, Object?>? variables;
+
+  static Message fromJson(Map<String, Object?> obj) => Message.fromMap(obj);
+
+  Message({
+    required this.format,
+    required this.id,
+    this.sendTelemetry,
+    this.showUser,
+    this.url,
+    this.urlLabel,
+    this.variables,
+  });
+
+  Message.fromMap(Map<String, Object?> obj)
+      : format = obj['format'] as String,
+        id = obj['id'] as int,
+        sendTelemetry = obj['sendTelemetry'] as bool?,
+        showUser = obj['showUser'] as bool?,
+        url = obj['url'] as String?,
+        urlLabel = obj['urlLabel'] as String?,
+        variables = obj['variables'] as Map<String, Object?>?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['format'] is! String) {
+      return false;
+    }
+    if (obj['id'] is! int) {
+      return false;
+    }
+    if (obj['sendTelemetry'] is! bool?) {
+      return false;
+    }
+    if (obj['showUser'] is! bool?) {
+      return false;
+    }
+    if (obj['url'] is! String?) {
+      return false;
+    }
+    if (obj['urlLabel'] is! String?) {
+      return false;
+    }
+    if (obj['variables'] is! Map<String, Object?>?) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'format': format,
+        'id': id,
+        if (sendTelemetry != null) 'sendTelemetry': sendTelemetry,
+        if (showUser != null) 'showUser': showUser,
+        if (url != null) 'url': url,
+        if (urlLabel != null) 'urlLabel': urlLabel,
+        if (variables != null) 'variables': variables,
+      };
+}
+
+/// A Module object represents a row in the modules view.
+/// Two attributes are mandatory: an id identifies a module in the modules view
+/// and is used in a ModuleEvent for identifying a module for adding, updating
+/// or deleting.
+/// The name is used to minimally render the module in the UI.
+///
+/// Additional attributes can be added to the module. They will show up in the
+/// module View if they have a corresponding ColumnDescriptor.
+///
+/// To avoid an unnecessary proliferation of additional attributes with similar
+/// semantics but different names
+/// we recommend to re-use attributes from the 'recommended' list below first,
+/// and only introduce new attributes if nothing appropriate could be found.
+class Module {
+  /// Address range covered by this module.
+  final String? addressRange;
+
+  /// Module created or modified.
+  final String? dateTimeStamp;
+
+  /// Unique identifier for the module.
+  final Either2<int, String> id;
+
+  /// True if the module is optimized.
+  final bool? isOptimized;
+
+  /// True if the module is considered 'user code' by a debugger that supports
+  /// 'Just My Code'.
+  final bool? isUserCode;
+
+  /// A name of the module.
+  final String name;
+
+  /// optional but recommended attributes.
+  /// always try to use these first before introducing additional attributes.
+  ///
+  /// Logical full path to the module. The exact definition is implementation
+  /// defined, but usually this would be a full path to the on-disk file for the
+  /// module.
+  final String? path;
+
+  /// Logical full path to the symbol file. The exact definition is
+  /// implementation defined.
+  final String? symbolFilePath;
+
+  /// User understandable description of if symbols were found for the module
+  /// (ex: 'Symbols Loaded', 'Symbols not found', etc.
+  final String? symbolStatus;
+
+  /// Version of Module.
+  final String? version;
+
+  static Module fromJson(Map<String, Object?> obj) => Module.fromMap(obj);
+
+  Module({
+    this.addressRange,
+    this.dateTimeStamp,
+    required this.id,
+    this.isOptimized,
+    this.isUserCode,
+    required this.name,
+    this.path,
+    this.symbolFilePath,
+    this.symbolStatus,
+    this.version,
+  });
+
+  Module.fromMap(Map<String, Object?> obj)
+      : addressRange = obj['addressRange'] as String?,
+        dateTimeStamp = obj['dateTimeStamp'] as String?,
+        id = obj['id'] is int
+            ? Either2<int, String>.t1(obj['id'] as int)
+            : Either2<int, String>.t2(obj['id'] as String),
+        isOptimized = obj['isOptimized'] as bool?,
+        isUserCode = obj['isUserCode'] as bool?,
+        name = obj['name'] as String,
+        path = obj['path'] as String?,
+        symbolFilePath = obj['symbolFilePath'] as String?,
+        symbolStatus = obj['symbolStatus'] as String?,
+        version = obj['version'] as String?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['addressRange'] is! String?) {
+      return false;
+    }
+    if (obj['dateTimeStamp'] is! String?) {
+      return false;
+    }
+    if ((obj['id'] is! int && obj['id'] is! String)) {
+      return false;
+    }
+    if (obj['isOptimized'] is! bool?) {
+      return false;
+    }
+    if (obj['isUserCode'] is! bool?) {
+      return false;
+    }
+    if (obj['name'] is! String) {
+      return false;
+    }
+    if (obj['path'] is! String?) {
+      return false;
+    }
+    if (obj['symbolFilePath'] is! String?) {
+      return false;
+    }
+    if (obj['symbolStatus'] is! String?) {
+      return false;
+    }
+    if (obj['version'] is! String?) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (addressRange != null) 'addressRange': addressRange,
+        if (dateTimeStamp != null) 'dateTimeStamp': dateTimeStamp,
+        'id': id,
+        if (isOptimized != null) 'isOptimized': isOptimized,
+        if (isUserCode != null) 'isUserCode': isUserCode,
+        'name': name,
+        if (path != null) 'path': path,
+        if (symbolFilePath != null) 'symbolFilePath': symbolFilePath,
+        if (symbolStatus != null) 'symbolStatus': symbolStatus,
+        if (version != null) 'version': version,
+      };
+}
+
+/// Arguments for 'modules' request.
+class ModulesArguments extends RequestArguments {
+  /// The number of modules to return. If moduleCount is not specified or 0, all
+  /// modules are returned.
+  final int? moduleCount;
+
+  /// The index of the first module to return; if omitted modules start at 0.
+  final int? startModule;
+
+  static ModulesArguments fromJson(Map<String, Object?> obj) =>
+      ModulesArguments.fromMap(obj);
+
+  ModulesArguments({
+    this.moduleCount,
+    this.startModule,
+  });
+
+  ModulesArguments.fromMap(Map<String, Object?> obj)
+      : moduleCount = obj['moduleCount'] as int?,
+        startModule = obj['startModule'] as int?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['moduleCount'] is! int?) {
+      return false;
+    }
+    if (obj['startModule'] is! int?) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (moduleCount != null) 'moduleCount': moduleCount,
+        if (startModule != null) 'startModule': startModule,
+      };
+}
+
+/// Response to 'modules' request.
+class ModulesResponse extends Response {
+  static ModulesResponse fromJson(Map<String, Object?> obj) =>
+      ModulesResponse.fromMap(obj);
+
+  ModulesResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  ModulesResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// The ModulesViewDescriptor is the container for all declarative configuration
+/// options of a ModuleView.
+/// For now it only specifies the columns to be shown in the modules view.
+class ModulesViewDescriptor {
+  final List<ColumnDescriptor> columns;
+
+  static ModulesViewDescriptor fromJson(Map<String, Object?> obj) =>
+      ModulesViewDescriptor.fromMap(obj);
+
+  ModulesViewDescriptor({
+    required this.columns,
+  });
+
+  ModulesViewDescriptor.fromMap(Map<String, Object?> obj)
+      : columns = (obj['columns'] as List)
+            .map((item) =>
+                ColumnDescriptor.fromJson(item as Map<String, Object?>))
+            .toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['columns'] is! List ||
+        (obj['columns'].any((item) => !ColumnDescriptor.canParse(item))))) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'columns': columns,
+      };
+}
+
+/// Arguments for 'next' request.
+class NextArguments extends RequestArguments {
+  /// Optional granularity to step. If no granularity is specified, a
+  /// granularity of 'statement' is assumed.
+  final SteppingGranularity? granularity;
+
+  /// Execute 'next' for this thread.
+  final int threadId;
+
+  static NextArguments fromJson(Map<String, Object?> obj) =>
+      NextArguments.fromMap(obj);
+
+  NextArguments({
+    this.granularity,
+    required this.threadId,
+  });
+
+  NextArguments.fromMap(Map<String, Object?> obj)
+      : granularity = obj['granularity'] == null
+            ? null
+            : SteppingGranularity.fromJson(
+                obj['granularity'] as Map<String, Object?>),
+        threadId = obj['threadId'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (!SteppingGranularity?.canParse(obj['granularity'])) {
+      return false;
+    }
+    if (obj['threadId'] is! int) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (granularity != null) 'granularity': granularity,
+        'threadId': threadId,
+      };
+}
+
+/// Response to 'next' request. This is just an acknowledgement, so no body
+/// field is required.
+class NextResponse extends Response {
+  static NextResponse fromJson(Map<String, Object?> obj) =>
+      NextResponse.fromMap(obj);
+
+  NextResponse({
+    Object? body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  NextResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Arguments for 'pause' request.
+class PauseArguments extends RequestArguments {
+  /// Pause execution for this thread.
+  final int threadId;
+
+  static PauseArguments fromJson(Map<String, Object?> obj) =>
+      PauseArguments.fromMap(obj);
+
+  PauseArguments({
+    required this.threadId,
+  });
+
+  PauseArguments.fromMap(Map<String, Object?> obj)
+      : threadId = obj['threadId'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['threadId'] is! int) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'threadId': threadId,
+      };
+}
+
+/// Response to 'pause' request. This is just an acknowledgement, so no body
+/// field is required.
+class PauseResponse extends Response {
+  static PauseResponse fromJson(Map<String, Object?> obj) =>
+      PauseResponse.fromMap(obj);
+
+  PauseResponse({
+    Object? body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  PauseResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Base class of requests, responses, and events.
+class ProtocolMessage {
+  /// Sequence number (also known as message ID). For protocol messages of type
+  /// 'request' this ID can be used to cancel the request.
+  final int seq;
+
+  /// Message type.
+  final String type;
+
+  static ProtocolMessage fromJson(Map<String, Object?> obj) =>
+      ProtocolMessage.fromMap(obj);
+
+  ProtocolMessage({
+    required this.seq,
+    required this.type,
+  });
+
+  ProtocolMessage.fromMap(Map<String, Object?> obj)
+      : seq = obj['seq'] as int,
+        type = obj['type'] as String;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['seq'] is! int) {
+      return false;
+    }
+    if (obj['type'] is! String) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'seq': seq,
+        'type': type,
+      };
+}
+
+/// Arguments for 'readMemory' request.
+class ReadMemoryArguments extends RequestArguments {
+  /// Number of bytes to read at the specified location and offset.
+  final int count;
+
+  /// Memory reference to the base location from which data should be read.
+  final String memoryReference;
+
+  /// Optional offset (in bytes) to be applied to the reference location before
+  /// reading data. Can be negative.
+  final int? offset;
+
+  static ReadMemoryArguments fromJson(Map<String, Object?> obj) =>
+      ReadMemoryArguments.fromMap(obj);
+
+  ReadMemoryArguments({
+    required this.count,
+    required this.memoryReference,
+    this.offset,
+  });
+
+  ReadMemoryArguments.fromMap(Map<String, Object?> obj)
+      : count = obj['count'] as int,
+        memoryReference = obj['memoryReference'] as String,
+        offset = obj['offset'] as int?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['count'] is! int) {
+      return false;
+    }
+    if (obj['memoryReference'] is! String) {
+      return false;
+    }
+    if (obj['offset'] is! int?) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'count': count,
+        'memoryReference': memoryReference,
+        if (offset != null) 'offset': offset,
+      };
+}
+
+/// Response to 'readMemory' request.
+class ReadMemoryResponse extends Response {
+  static ReadMemoryResponse fromJson(Map<String, Object?> obj) =>
+      ReadMemoryResponse.fromMap(obj);
+
+  ReadMemoryResponse({
+    Map<String, Object?>? body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  ReadMemoryResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>?) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// A client or debug adapter initiated request.
+class Request extends ProtocolMessage {
+  /// Object containing arguments for the command.
+  final Object? arguments;
+
+  /// The command to execute.
+  final String command;
+
+  static Request fromJson(Map<String, Object?> obj) => Request.fromMap(obj);
+
+  Request({
+    this.arguments,
+    required this.command,
+    required int seq,
+  }) : super(
+          seq: seq,
+          type: 'request',
+        );
+
+  Request.fromMap(Map<String, Object?> obj)
+      : arguments = obj['arguments'],
+        command = obj['command'] as String,
+        super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['command'] is! String) {
+      return false;
+    }
+    if (obj['type'] is! String) {
+      return false;
+    }
+    return ProtocolMessage.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+        if (arguments != null) 'arguments': arguments,
+        'command': command,
+      };
+}
+
+/// Response for a request.
+class Response extends ProtocolMessage {
+  /// Contains request result if success is true and optional error details if
+  /// success is false.
+  final Object? body;
+
+  /// The command requested.
+  final String command;
+
+  /// Contains the raw error in short form if 'success' is false.
+  /// This raw error might be interpreted by the frontend and is not shown in
+  /// the UI.
+  /// Some predefined values exist.
+  final String? message;
+
+  /// Sequence number of the corresponding request.
+  final int requestSeq;
+
+  /// Outcome of the request.
+  /// If true, the request was successful and the 'body' attribute may contain
+  /// the result of the request.
+  /// If the value is false, the attribute 'message' contains the error in short
+  /// form and the 'body' may contain additional information (see
+  /// 'ErrorResponse.body.error').
+  final bool success;
+
+  static Response fromJson(Map<String, Object?> obj) => Response.fromMap(obj);
+
+  Response({
+    this.body,
+    required this.command,
+    this.message,
+    required this.requestSeq,
+    required this.success,
+    required int seq,
+  }) : super(
+          seq: seq,
+          type: 'response',
+        );
+
+  Response.fromMap(Map<String, Object?> obj)
+      : body = obj['body'],
+        command = obj['command'] as String,
+        message = obj['message'] as String?,
+        requestSeq = obj['request_seq'] as int,
+        success = obj['success'] as bool,
+        super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['command'] is! String) {
+      return false;
+    }
+    if (obj['message'] is! String?) {
+      return false;
+    }
+    if (obj['request_seq'] is! int) {
+      return false;
+    }
+    if (obj['success'] is! bool) {
+      return false;
+    }
+    if (obj['type'] is! String) {
+      return false;
+    }
+    return ProtocolMessage.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+        if (body != null) 'body': body,
+        'command': command,
+        if (message != null) 'message': message,
+        'request_seq': requestSeq,
+        'success': success,
+      };
+}
+
+/// Arguments for 'restart' request.
+class RestartArguments extends RequestArguments {
+  /// The latest version of the 'launch' or 'attach' configuration.
+  final Either2<LaunchRequestArguments, AttachRequestArguments>? arguments;
+
+  static RestartArguments fromJson(Map<String, Object?> obj) =>
+      RestartArguments.fromMap(obj);
+
+  RestartArguments({
+    this.arguments,
+  });
+
+  RestartArguments.fromMap(Map<String, Object?> obj)
+      : arguments = LaunchRequestArguments.canParse(obj['arguments'])
+            ? Either2<LaunchRequestArguments, AttachRequestArguments>.t1(
+                LaunchRequestArguments.fromJson(
+                    obj['arguments'] as Map<String, Object?>))
+            : AttachRequestArguments.canParse(obj['arguments'])
+                ? Either2<LaunchRequestArguments, AttachRequestArguments>.t2(
+                    AttachRequestArguments.fromJson(
+                        obj['arguments'] as Map<String, Object?>))
+                : null;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((!LaunchRequestArguments.canParse(obj['arguments']) &&
+        !AttachRequestArguments.canParse(obj['arguments']) &&
+        obj['arguments'] != null)) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (arguments != null) 'arguments': arguments,
+      };
+}
+
+/// Arguments for 'restartFrame' request.
+class RestartFrameArguments extends RequestArguments {
+  /// Restart this stackframe.
+  final int frameId;
+
+  static RestartFrameArguments fromJson(Map<String, Object?> obj) =>
+      RestartFrameArguments.fromMap(obj);
+
+  RestartFrameArguments({
+    required this.frameId,
+  });
+
+  RestartFrameArguments.fromMap(Map<String, Object?> obj)
+      : frameId = obj['frameId'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['frameId'] is! int) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'frameId': frameId,
+      };
+}
+
+/// Response to 'restartFrame' request. This is just an acknowledgement, so no
+/// body field is required.
+class RestartFrameResponse extends Response {
+  static RestartFrameResponse fromJson(Map<String, Object?> obj) =>
+      RestartFrameResponse.fromMap(obj);
+
+  RestartFrameResponse({
+    Object? body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  RestartFrameResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Response to 'restart' request. This is just an acknowledgement, so no body
+/// field is required.
+class RestartResponse extends Response {
+  static RestartResponse fromJson(Map<String, Object?> obj) =>
+      RestartResponse.fromMap(obj);
+
+  RestartResponse({
+    Object? body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  RestartResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Arguments for 'reverseContinue' request.
+class ReverseContinueArguments extends RequestArguments {
+  /// Execute 'reverseContinue' for this thread.
+  final int threadId;
+
+  static ReverseContinueArguments fromJson(Map<String, Object?> obj) =>
+      ReverseContinueArguments.fromMap(obj);
+
+  ReverseContinueArguments({
+    required this.threadId,
+  });
+
+  ReverseContinueArguments.fromMap(Map<String, Object?> obj)
+      : threadId = obj['threadId'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['threadId'] is! int) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'threadId': threadId,
+      };
+}
+
+/// Response to 'reverseContinue' request. This is just an acknowledgement, so
+/// no body field is required.
+class ReverseContinueResponse extends Response {
+  static ReverseContinueResponse fromJson(Map<String, Object?> obj) =>
+      ReverseContinueResponse.fromMap(obj);
+
+  ReverseContinueResponse({
+    Object? body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  ReverseContinueResponse.fromMap(Map<String, Object?> obj)
+      : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Arguments for 'runInTerminal' request.
+class RunInTerminalRequestArguments extends RequestArguments {
+  /// List of arguments. The first argument is the command to run.
+  final List<String> args;
+
+  /// Working directory for the command. For non-empty, valid paths this
+  /// typically results in execution of a change directory command.
+  final String cwd;
+
+  /// Environment key-value pairs that are added to or removed from the default
+  /// environment.
+  final Map<String, Object?>? env;
+
+  /// What kind of terminal to launch.
+  final String? kind;
+
+  /// Optional title of the terminal.
+  final String? title;
+
+  static RunInTerminalRequestArguments fromJson(Map<String, Object?> obj) =>
+      RunInTerminalRequestArguments.fromMap(obj);
+
+  RunInTerminalRequestArguments({
+    required this.args,
+    required this.cwd,
+    this.env,
+    this.kind,
+    this.title,
+  });
+
+  RunInTerminalRequestArguments.fromMap(Map<String, Object?> obj)
+      : args = (obj['args'] as List).map((item) => item as String).toList(),
+        cwd = obj['cwd'] as String,
+        env = obj['env'] as Map<String, Object?>?,
+        kind = obj['kind'] as String?,
+        title = obj['title'] as String?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['args'] is! List ||
+        (obj['args'].any((item) => item is! String)))) {
+      return false;
+    }
+    if (obj['cwd'] is! String) {
+      return false;
+    }
+    if (obj['env'] is! Map<String, Object?>?) {
+      return false;
+    }
+    if (obj['kind'] is! String?) {
+      return false;
+    }
+    if (obj['title'] is! String?) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'args': args,
+        'cwd': cwd,
+        if (env != null) 'env': env,
+        if (kind != null) 'kind': kind,
+        if (title != null) 'title': title,
+      };
+}
+
+/// Response to 'runInTerminal' request.
+class RunInTerminalResponse extends Response {
+  static RunInTerminalResponse fromJson(Map<String, Object?> obj) =>
+      RunInTerminalResponse.fromMap(obj);
+
+  RunInTerminalResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  RunInTerminalResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// A Scope is a named container for variables. Optionally a scope can map to a
+/// source or a range within a source.
+class Scope {
+  /// Optional start column of the range covered by this scope.
+  final int? column;
+
+  /// Optional end column of the range covered by this scope.
+  final int? endColumn;
+
+  /// Optional end line of the range covered by this scope.
+  final int? endLine;
+
+  /// If true, the number of variables in this scope is large or expensive to
+  /// retrieve.
+  final bool expensive;
+
+  /// The number of indexed variables in this scope.
+  /// The client can use this optional information to present the variables in a
+  /// paged UI and fetch them in chunks.
+  final int? indexedVariables;
+
+  /// Optional start line of the range covered by this scope.
+  final int? line;
+
+  /// Name of the scope such as 'Arguments', 'Locals', or 'Registers'. This
+  /// string is shown in the UI as is and can be translated.
+  final String name;
+
+  /// The number of named variables in this scope.
+  /// The client can use this optional information to present the variables in a
+  /// paged UI and fetch them in chunks.
+  final int? namedVariables;
+
+  /// An optional hint for how to present this scope in the UI. If this
+  /// attribute is missing, the scope is shown with a generic UI.
+  final String? presentationHint;
+
+  /// Optional source for this scope.
+  final Source? source;
+
+  /// The variables of this scope can be retrieved by passing the value of
+  /// variablesReference to the VariablesRequest.
+  final int variablesReference;
+
+  static Scope fromJson(Map<String, Object?> obj) => Scope.fromMap(obj);
+
+  Scope({
+    this.column,
+    this.endColumn,
+    this.endLine,
+    required this.expensive,
+    this.indexedVariables,
+    this.line,
+    required this.name,
+    this.namedVariables,
+    this.presentationHint,
+    this.source,
+    required this.variablesReference,
+  });
+
+  Scope.fromMap(Map<String, Object?> obj)
+      : column = obj['column'] as int?,
+        endColumn = obj['endColumn'] as int?,
+        endLine = obj['endLine'] as int?,
+        expensive = obj['expensive'] as bool,
+        indexedVariables = obj['indexedVariables'] as int?,
+        line = obj['line'] as int?,
+        name = obj['name'] as String,
+        namedVariables = obj['namedVariables'] as int?,
+        presentationHint = obj['presentationHint'] as String?,
+        source = obj['source'] == null
+            ? null
+            : Source.fromJson(obj['source'] as Map<String, Object?>),
+        variablesReference = obj['variablesReference'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['column'] is! int?) {
+      return false;
+    }
+    if (obj['endColumn'] is! int?) {
+      return false;
+    }
+    if (obj['endLine'] is! int?) {
+      return false;
+    }
+    if (obj['expensive'] is! bool) {
+      return false;
+    }
+    if (obj['indexedVariables'] is! int?) {
+      return false;
+    }
+    if (obj['line'] is! int?) {
+      return false;
+    }
+    if (obj['name'] is! String) {
+      return false;
+    }
+    if (obj['namedVariables'] is! int?) {
+      return false;
+    }
+    if (obj['presentationHint'] is! String?) {
+      return false;
+    }
+    if (!Source?.canParse(obj['source'])) {
+      return false;
+    }
+    if (obj['variablesReference'] is! int) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (column != null) 'column': column,
+        if (endColumn != null) 'endColumn': endColumn,
+        if (endLine != null) 'endLine': endLine,
+        'expensive': expensive,
+        if (indexedVariables != null) 'indexedVariables': indexedVariables,
+        if (line != null) 'line': line,
+        'name': name,
+        if (namedVariables != null) 'namedVariables': namedVariables,
+        if (presentationHint != null) 'presentationHint': presentationHint,
+        if (source != null) 'source': source,
+        'variablesReference': variablesReference,
+      };
+}
+
+/// Arguments for 'scopes' request.
+class ScopesArguments extends RequestArguments {
+  /// Retrieve the scopes for this stackframe.
+  final int frameId;
+
+  static ScopesArguments fromJson(Map<String, Object?> obj) =>
+      ScopesArguments.fromMap(obj);
+
+  ScopesArguments({
+    required this.frameId,
+  });
+
+  ScopesArguments.fromMap(Map<String, Object?> obj)
+      : frameId = obj['frameId'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['frameId'] is! int) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'frameId': frameId,
+      };
+}
+
+/// Response to 'scopes' request.
+class ScopesResponse extends Response {
+  static ScopesResponse fromJson(Map<String, Object?> obj) =>
+      ScopesResponse.fromMap(obj);
+
+  ScopesResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  ScopesResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Arguments for 'setBreakpoints' request.
+class SetBreakpointsArguments extends RequestArguments {
+  /// The code locations of the breakpoints.
+  final List<SourceBreakpoint>? breakpoints;
+
+  /// Deprecated: The code locations of the breakpoints.
+  final List<int>? lines;
+
+  /// The source location of the breakpoints; either 'source.path' or
+  /// 'source.reference' must be specified.
+  final Source source;
+
+  /// A value of true indicates that the underlying source has been modified
+  /// which results in new breakpoint locations.
+  final bool? sourceModified;
+
+  static SetBreakpointsArguments fromJson(Map<String, Object?> obj) =>
+      SetBreakpointsArguments.fromMap(obj);
+
+  SetBreakpointsArguments({
+    this.breakpoints,
+    this.lines,
+    required this.source,
+    this.sourceModified,
+  });
+
+  SetBreakpointsArguments.fromMap(Map<String, Object?> obj)
+      : breakpoints = (obj['breakpoints'] as List?)
+            ?.map((item) =>
+                SourceBreakpoint.fromJson(item as Map<String, Object?>))
+            .toList(),
+        lines = (obj['lines'] as List?)?.map((item) => item as int).toList(),
+        source = Source.fromJson(obj['source'] as Map<String, Object?>),
+        sourceModified = obj['sourceModified'] as bool?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['breakpoints'] is! List ||
+        (obj['breakpoints'].any((item) => !SourceBreakpoint.canParse(item))))) {
+      return false;
+    }
+    if ((obj['lines'] is! List || (obj['lines'].any((item) => item is! int)))) {
+      return false;
+    }
+    if (!Source.canParse(obj['source'])) {
+      return false;
+    }
+    if (obj['sourceModified'] is! bool?) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (breakpoints != null) 'breakpoints': breakpoints,
+        if (lines != null) 'lines': lines,
+        'source': source,
+        if (sourceModified != null) 'sourceModified': sourceModified,
+      };
+}
+
+/// Response to 'setBreakpoints' request.
+/// Returned is information about each breakpoint created by this request.
+/// This includes the actual code location and whether the breakpoint could be
+/// verified.
+/// The breakpoints returned are in the same order as the elements of the
+/// 'breakpoints'
+/// (or the deprecated 'lines') array in the arguments.
+class SetBreakpointsResponse extends Response {
+  static SetBreakpointsResponse fromJson(Map<String, Object?> obj) =>
+      SetBreakpointsResponse.fromMap(obj);
+
+  SetBreakpointsResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  SetBreakpointsResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Arguments for 'setDataBreakpoints' request.
+class SetDataBreakpointsArguments extends RequestArguments {
+  /// The contents of this array replaces all existing data breakpoints. An
+  /// empty array clears all data breakpoints.
+  final List<DataBreakpoint> breakpoints;
+
+  static SetDataBreakpointsArguments fromJson(Map<String, Object?> obj) =>
+      SetDataBreakpointsArguments.fromMap(obj);
+
+  SetDataBreakpointsArguments({
+    required this.breakpoints,
+  });
+
+  SetDataBreakpointsArguments.fromMap(Map<String, Object?> obj)
+      : breakpoints = (obj['breakpoints'] as List)
+            .map(
+                (item) => DataBreakpoint.fromJson(item as Map<String, Object?>))
+            .toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['breakpoints'] is! List ||
+        (obj['breakpoints'].any((item) => !DataBreakpoint.canParse(item))))) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'breakpoints': breakpoints,
+      };
+}
+
+/// Response to 'setDataBreakpoints' request.
+/// Returned is information about each breakpoint created by this request.
+class SetDataBreakpointsResponse extends Response {
+  static SetDataBreakpointsResponse fromJson(Map<String, Object?> obj) =>
+      SetDataBreakpointsResponse.fromMap(obj);
+
+  SetDataBreakpointsResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  SetDataBreakpointsResponse.fromMap(Map<String, Object?> obj)
+      : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Arguments for 'setExceptionBreakpoints' request.
+class SetExceptionBreakpointsArguments extends RequestArguments {
+  /// Configuration options for selected exceptions.
+  /// The attribute is only honored by a debug adapter if the capability
+  /// 'supportsExceptionOptions' is true.
+  final List<ExceptionOptions>? exceptionOptions;
+
+  /// Set of exception filters and their options. The set of all possible
+  /// exception filters is defined by the 'exceptionBreakpointFilters'
+  /// capability. This attribute is only honored by a debug adapter if the
+  /// capability 'supportsExceptionFilterOptions' is true. The 'filter' and
+  /// 'filterOptions' sets are additive.
+  final List<ExceptionFilterOptions>? filterOptions;
+
+  /// Set of exception filters specified by their ID. The set of all possible
+  /// exception filters is defined by the 'exceptionBreakpointFilters'
+  /// capability. The 'filter' and 'filterOptions' sets are additive.
+  final List<String> filters;
+
+  static SetExceptionBreakpointsArguments fromJson(Map<String, Object?> obj) =>
+      SetExceptionBreakpointsArguments.fromMap(obj);
+
+  SetExceptionBreakpointsArguments({
+    this.exceptionOptions,
+    this.filterOptions,
+    required this.filters,
+  });
+
+  SetExceptionBreakpointsArguments.fromMap(Map<String, Object?> obj)
+      : exceptionOptions = (obj['exceptionOptions'] as List?)
+            ?.map((item) =>
+                ExceptionOptions.fromJson(item as Map<String, Object?>))
+            .toList(),
+        filterOptions = (obj['filterOptions'] as List?)
+            ?.map((item) =>
+                ExceptionFilterOptions.fromJson(item as Map<String, Object?>))
+            .toList(),
+        filters =
+            (obj['filters'] as List).map((item) => item as String).toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['exceptionOptions'] is! List ||
+        (obj['exceptionOptions']
+            .any((item) => !ExceptionOptions.canParse(item))))) {
+      return false;
+    }
+    if ((obj['filterOptions'] is! List ||
+        (obj['filterOptions']
+            .any((item) => !ExceptionFilterOptions.canParse(item))))) {
+      return false;
+    }
+    if ((obj['filters'] is! List ||
+        (obj['filters'].any((item) => item is! String)))) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (exceptionOptions != null) 'exceptionOptions': exceptionOptions,
+        if (filterOptions != null) 'filterOptions': filterOptions,
+        'filters': filters,
+      };
+}
+
+/// Response to 'setExceptionBreakpoints' request.
+/// The response contains an array of Breakpoint objects with information about
+/// each exception breakpoint or filter. The Breakpoint objects are in the same
+/// order as the elements of the 'filters', 'filterOptions', 'exceptionOptions'
+/// arrays given as arguments. If both 'filters' and 'filterOptions' are given,
+/// the returned array must start with 'filters' information first, followed by
+/// 'filterOptions' information.
+/// The mandatory 'verified' property of a Breakpoint object signals whether the
+/// exception breakpoint or filter could be successfully created and whether the
+/// optional condition or hit count expressions are valid. In case of an error
+/// the 'message' property explains the problem. An optional 'id' property can
+/// be used to introduce a unique ID for the exception breakpoint or filter so
+/// that it can be updated subsequently by sending breakpoint events.
+/// For backward compatibility both the 'breakpoints' array and the enclosing
+/// 'body' are optional. If these elements are missing a client will not be able
+/// to show problems for individual exception breakpoints or filters.
+class SetExceptionBreakpointsResponse extends Response {
+  static SetExceptionBreakpointsResponse fromJson(Map<String, Object?> obj) =>
+      SetExceptionBreakpointsResponse.fromMap(obj);
+
+  SetExceptionBreakpointsResponse({
+    Map<String, Object?>? body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  SetExceptionBreakpointsResponse.fromMap(Map<String, Object?> obj)
+      : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>?) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Arguments for 'setExpression' request.
+class SetExpressionArguments extends RequestArguments {
+  /// The l-value expression to assign to.
+  final String expression;
+
+  /// Specifies how the resulting value should be formatted.
+  final ValueFormat? format;
+
+  /// Evaluate the expressions in the scope of this stack frame. If not
+  /// specified, the expressions are evaluated in the global scope.
+  final int? frameId;
+
+  /// The value expression to assign to the l-value expression.
+  final String value;
+
+  static SetExpressionArguments fromJson(Map<String, Object?> obj) =>
+      SetExpressionArguments.fromMap(obj);
+
+  SetExpressionArguments({
+    required this.expression,
+    this.format,
+    this.frameId,
+    required this.value,
+  });
+
+  SetExpressionArguments.fromMap(Map<String, Object?> obj)
+      : expression = obj['expression'] as String,
+        format = obj['format'] == null
+            ? null
+            : ValueFormat.fromJson(obj['format'] as Map<String, Object?>),
+        frameId = obj['frameId'] as int?,
+        value = obj['value'] as String;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['expression'] is! String) {
+      return false;
+    }
+    if (!ValueFormat?.canParse(obj['format'])) {
+      return false;
+    }
+    if (obj['frameId'] is! int?) {
+      return false;
+    }
+    if (obj['value'] is! String) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'expression': expression,
+        if (format != null) 'format': format,
+        if (frameId != null) 'frameId': frameId,
+        'value': value,
+      };
+}
+
+/// Response to 'setExpression' request.
+class SetExpressionResponse extends Response {
+  static SetExpressionResponse fromJson(Map<String, Object?> obj) =>
+      SetExpressionResponse.fromMap(obj);
+
+  SetExpressionResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  SetExpressionResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Arguments for 'setFunctionBreakpoints' request.
+class SetFunctionBreakpointsArguments extends RequestArguments {
+  /// The function names of the breakpoints.
+  final List<FunctionBreakpoint> breakpoints;
+
+  static SetFunctionBreakpointsArguments fromJson(Map<String, Object?> obj) =>
+      SetFunctionBreakpointsArguments.fromMap(obj);
+
+  SetFunctionBreakpointsArguments({
+    required this.breakpoints,
+  });
+
+  SetFunctionBreakpointsArguments.fromMap(Map<String, Object?> obj)
+      : breakpoints = (obj['breakpoints'] as List)
+            .map((item) =>
+                FunctionBreakpoint.fromJson(item as Map<String, Object?>))
+            .toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['breakpoints'] is! List ||
+        (obj['breakpoints']
+            .any((item) => !FunctionBreakpoint.canParse(item))))) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'breakpoints': breakpoints,
+      };
+}
+
+/// Response to 'setFunctionBreakpoints' request.
+/// Returned is information about each breakpoint created by this request.
+class SetFunctionBreakpointsResponse extends Response {
+  static SetFunctionBreakpointsResponse fromJson(Map<String, Object?> obj) =>
+      SetFunctionBreakpointsResponse.fromMap(obj);
+
+  SetFunctionBreakpointsResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  SetFunctionBreakpointsResponse.fromMap(Map<String, Object?> obj)
+      : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Arguments for 'setInstructionBreakpoints' request
+class SetInstructionBreakpointsArguments extends RequestArguments {
+  /// The instruction references of the breakpoints
+  final List<InstructionBreakpoint> breakpoints;
+
+  static SetInstructionBreakpointsArguments fromJson(
+          Map<String, Object?> obj) =>
+      SetInstructionBreakpointsArguments.fromMap(obj);
+
+  SetInstructionBreakpointsArguments({
+    required this.breakpoints,
+  });
+
+  SetInstructionBreakpointsArguments.fromMap(Map<String, Object?> obj)
+      : breakpoints = (obj['breakpoints'] as List)
+            .map((item) =>
+                InstructionBreakpoint.fromJson(item as Map<String, Object?>))
+            .toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['breakpoints'] is! List ||
+        (obj['breakpoints']
+            .any((item) => !InstructionBreakpoint.canParse(item))))) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'breakpoints': breakpoints,
+      };
+}
+
+/// Response to 'setInstructionBreakpoints' request
+class SetInstructionBreakpointsResponse extends Response {
+  static SetInstructionBreakpointsResponse fromJson(Map<String, Object?> obj) =>
+      SetInstructionBreakpointsResponse.fromMap(obj);
+
+  SetInstructionBreakpointsResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  SetInstructionBreakpointsResponse.fromMap(Map<String, Object?> obj)
+      : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Arguments for 'setVariable' request.
+class SetVariableArguments extends RequestArguments {
+  /// Specifies details on how to format the response value.
+  final ValueFormat? format;
+
+  /// The name of the variable in the container.
+  final String name;
+
+  /// The value of the variable.
+  final String value;
+
+  /// The reference of the variable container.
+  final int variablesReference;
+
+  static SetVariableArguments fromJson(Map<String, Object?> obj) =>
+      SetVariableArguments.fromMap(obj);
+
+  SetVariableArguments({
+    this.format,
+    required this.name,
+    required this.value,
+    required this.variablesReference,
+  });
+
+  SetVariableArguments.fromMap(Map<String, Object?> obj)
+      : format = obj['format'] == null
+            ? null
+            : ValueFormat.fromJson(obj['format'] as Map<String, Object?>),
+        name = obj['name'] as String,
+        value = obj['value'] as String,
+        variablesReference = obj['variablesReference'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (!ValueFormat?.canParse(obj['format'])) {
+      return false;
+    }
+    if (obj['name'] is! String) {
+      return false;
+    }
+    if (obj['value'] is! String) {
+      return false;
+    }
+    if (obj['variablesReference'] is! int) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (format != null) 'format': format,
+        'name': name,
+        'value': value,
+        'variablesReference': variablesReference,
+      };
+}
+
+/// Response to 'setVariable' request.
+class SetVariableResponse extends Response {
+  static SetVariableResponse fromJson(Map<String, Object?> obj) =>
+      SetVariableResponse.fromMap(obj);
+
+  SetVariableResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  SetVariableResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// A Source is a descriptor for source code.
+/// It is returned from the debug adapter as part of a StackFrame and it is used
+/// by clients when specifying breakpoints.
+class Source {
+  /// Optional data that a debug adapter might want to loop through the client.
+  /// The client should leave the data intact and persist it across sessions.
+  /// The client should not interpret the data.
+  final Object? adapterData;
+
+  /// The checksums associated with this file.
+  final List<Checksum>? checksums;
+
+  /// The short name of the source. Every source returned from the debug adapter
+  /// has a name.
+  /// When sending a source to the debug adapter this name is optional.
+  final String? name;
+
+  /// The (optional) origin of this source: possible values 'internal module',
+  /// 'inlined content from source map', etc.
+  final String? origin;
+
+  /// The path of the source to be shown in the UI.
+  /// It is only used to locate and load the content of the source if no
+  /// sourceReference is specified (or its value is 0).
+  final String? path;
+
+  /// An optional hint for how to present the source in the UI.
+  /// A value of 'deemphasize' can be used to indicate that the source is not
+  /// available or that it is skipped on stepping.
+  final String? presentationHint;
+
+  /// If sourceReference > 0 the contents of the source must be retrieved
+  /// through the SourceRequest (even if a path is specified).
+  /// A sourceReference is only valid for a session, so it must not be used to
+  /// persist a source.
+  /// The value should be less than or equal to 2147483647 (2^31-1).
+  final int? sourceReference;
+
+  /// An optional list of sources that are related to this source. These may be
+  /// the source that generated this source.
+  final List<Source>? sources;
+
+  static Source fromJson(Map<String, Object?> obj) => Source.fromMap(obj);
+
+  Source({
+    this.adapterData,
+    this.checksums,
+    this.name,
+    this.origin,
+    this.path,
+    this.presentationHint,
+    this.sourceReference,
+    this.sources,
+  });
+
+  Source.fromMap(Map<String, Object?> obj)
+      : adapterData = obj['adapterData'],
+        checksums = (obj['checksums'] as List?)
+            ?.map((item) => Checksum.fromJson(item as Map<String, Object?>))
+            .toList(),
+        name = obj['name'] as String?,
+        origin = obj['origin'] as String?,
+        path = obj['path'] as String?,
+        presentationHint = obj['presentationHint'] as String?,
+        sourceReference = obj['sourceReference'] as int?,
+        sources = (obj['sources'] as List?)
+            ?.map((item) => Source.fromJson(item as Map<String, Object?>))
+            .toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['checksums'] is! List ||
+        (obj['checksums'].any((item) => !Checksum.canParse(item))))) {
+      return false;
+    }
+    if (obj['name'] is! String?) {
+      return false;
+    }
+    if (obj['origin'] is! String?) {
+      return false;
+    }
+    if (obj['path'] is! String?) {
+      return false;
+    }
+    if (obj['presentationHint'] is! String?) {
+      return false;
+    }
+    if (obj['sourceReference'] is! int?) {
+      return false;
+    }
+    if ((obj['sources'] is! List ||
+        (obj['sources'].any((item) => !Source.canParse(item))))) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (adapterData != null) 'adapterData': adapterData,
+        if (checksums != null) 'checksums': checksums,
+        if (name != null) 'name': name,
+        if (origin != null) 'origin': origin,
+        if (path != null) 'path': path,
+        if (presentationHint != null) 'presentationHint': presentationHint,
+        if (sourceReference != null) 'sourceReference': sourceReference,
+        if (sources != null) 'sources': sources,
+      };
+}
+
+/// Arguments for 'source' request.
+class SourceArguments extends RequestArguments {
+  /// Specifies the source content to load. Either source.path or
+  /// source.sourceReference must be specified.
+  final Source? source;
+
+  /// The reference to the source. This is the same as source.sourceReference.
+  /// This is provided for backward compatibility since old backends do not
+  /// understand the 'source' attribute.
+  final int sourceReference;
+
+  static SourceArguments fromJson(Map<String, Object?> obj) =>
+      SourceArguments.fromMap(obj);
+
+  SourceArguments({
+    this.source,
+    required this.sourceReference,
+  });
+
+  SourceArguments.fromMap(Map<String, Object?> obj)
+      : source = obj['source'] == null
+            ? null
+            : Source.fromJson(obj['source'] as Map<String, Object?>),
+        sourceReference = obj['sourceReference'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (!Source?.canParse(obj['source'])) {
+      return false;
+    }
+    if (obj['sourceReference'] is! int) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (source != null) 'source': source,
+        'sourceReference': sourceReference,
+      };
+}
+
+/// Properties of a breakpoint or logpoint passed to the setBreakpoints request.
+class SourceBreakpoint {
+  /// An optional source column of the breakpoint.
+  final int? column;
+
+  /// An optional expression for conditional breakpoints.
+  /// It is only honored by a debug adapter if the capability
+  /// 'supportsConditionalBreakpoints' is true.
+  final String? condition;
+
+  /// An optional expression that controls how many hits of the breakpoint are
+  /// ignored.
+  /// The backend is expected to interpret the expression as needed.
+  /// The attribute is only honored by a debug adapter if the capability
+  /// 'supportsHitConditionalBreakpoints' is true.
+  final String? hitCondition;
+
+  /// The source line of the breakpoint or logpoint.
+  final int line;
+
+  /// If this attribute exists and is non-empty, the backend must not 'break'
+  /// (stop)
+  /// but log the message instead. Expressions within {} are interpolated.
+  /// The attribute is only honored by a debug adapter if the capability
+  /// 'supportsLogPoints' is true.
+  final String? logMessage;
+
+  static SourceBreakpoint fromJson(Map<String, Object?> obj) =>
+      SourceBreakpoint.fromMap(obj);
+
+  SourceBreakpoint({
+    this.column,
+    this.condition,
+    this.hitCondition,
+    required this.line,
+    this.logMessage,
+  });
+
+  SourceBreakpoint.fromMap(Map<String, Object?> obj)
+      : column = obj['column'] as int?,
+        condition = obj['condition'] as String?,
+        hitCondition = obj['hitCondition'] as String?,
+        line = obj['line'] as int,
+        logMessage = obj['logMessage'] as String?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['column'] is! int?) {
+      return false;
+    }
+    if (obj['condition'] is! String?) {
+      return false;
+    }
+    if (obj['hitCondition'] is! String?) {
+      return false;
+    }
+    if (obj['line'] is! int) {
+      return false;
+    }
+    if (obj['logMessage'] is! String?) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (column != null) 'column': column,
+        if (condition != null) 'condition': condition,
+        if (hitCondition != null) 'hitCondition': hitCondition,
+        'line': line,
+        if (logMessage != null) 'logMessage': logMessage,
+      };
+}
+
+/// Response to 'source' request.
+class SourceResponse extends Response {
+  static SourceResponse fromJson(Map<String, Object?> obj) =>
+      SourceResponse.fromMap(obj);
+
+  SourceResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  SourceResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// A Stackframe contains the source location.
+class StackFrame {
+  /// Indicates whether this frame can be restarted with the 'restart' request.
+  /// Clients should only use this if the debug adapter supports the 'restart'
+  /// request (capability 'supportsRestartRequest' is true).
+  final bool? canRestart;
+
+  /// The column within the line. If source is null or doesn't exist, column is
+  /// 0 and must be ignored.
+  final int column;
+
+  /// An optional end column of the range covered by the stack frame.
+  final int? endColumn;
+
+  /// An optional end line of the range covered by the stack frame.
+  final int? endLine;
+
+  /// An identifier for the stack frame. It must be unique across all threads.
+  /// This id can be used to retrieve the scopes of the frame with the
+  /// 'scopesRequest' or to restart the execution of a stackframe.
+  final int id;
+
+  /// Optional memory reference for the current instruction pointer in this
+  /// frame.
+  final String? instructionPointerReference;
+
+  /// The line within the file of the frame. If source is null or doesn't exist,
+  /// line is 0 and must be ignored.
+  final int line;
+
+  /// The module associated with this frame, if any.
+  final Either2<int, String>? moduleId;
+
+  /// The name of the stack frame, typically a method name.
+  final String name;
+
+  /// An optional hint for how to present this frame in the UI.
+  /// A value of 'label' can be used to indicate that the frame is an artificial
+  /// frame that is used as a visual label or separator. A value of 'subtle' can
+  /// be used to change the appearance of a frame in a 'subtle' way.
+  final String? presentationHint;
+
+  /// The optional source of the frame.
+  final Source? source;
+
+  static StackFrame fromJson(Map<String, Object?> obj) =>
+      StackFrame.fromMap(obj);
+
+  StackFrame({
+    this.canRestart,
+    required this.column,
+    this.endColumn,
+    this.endLine,
+    required this.id,
+    this.instructionPointerReference,
+    required this.line,
+    this.moduleId,
+    required this.name,
+    this.presentationHint,
+    this.source,
+  });
+
+  StackFrame.fromMap(Map<String, Object?> obj)
+      : canRestart = obj['canRestart'] as bool?,
+        column = obj['column'] as int,
+        endColumn = obj['endColumn'] as int?,
+        endLine = obj['endLine'] as int?,
+        id = obj['id'] as int,
+        instructionPointerReference =
+            obj['instructionPointerReference'] as String?,
+        line = obj['line'] as int,
+        moduleId = obj['moduleId'] is int
+            ? Either2<int, String>.t1(obj['moduleId'] as int)
+            : obj['moduleId'] is String
+                ? Either2<int, String>.t2(obj['moduleId'] as String)
+                : null,
+        name = obj['name'] as String,
+        presentationHint = obj['presentationHint'] as String?,
+        source = obj['source'] == null
+            ? null
+            : Source.fromJson(obj['source'] as Map<String, Object?>);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['canRestart'] is! bool?) {
+      return false;
+    }
+    if (obj['column'] is! int) {
+      return false;
+    }
+    if (obj['endColumn'] is! int?) {
+      return false;
+    }
+    if (obj['endLine'] is! int?) {
+      return false;
+    }
+    if (obj['id'] is! int) {
+      return false;
+    }
+    if (obj['instructionPointerReference'] is! String?) {
+      return false;
+    }
+    if (obj['line'] is! int) {
+      return false;
+    }
+    if ((obj['moduleId'] is! int &&
+        obj['moduleId'] is! String &&
+        obj['moduleId'] != null)) {
+      return false;
+    }
+    if (obj['name'] is! String) {
+      return false;
+    }
+    if (obj['presentationHint'] is! String?) {
+      return false;
+    }
+    if (!Source?.canParse(obj['source'])) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (canRestart != null) 'canRestart': canRestart,
+        'column': column,
+        if (endColumn != null) 'endColumn': endColumn,
+        if (endLine != null) 'endLine': endLine,
+        'id': id,
+        if (instructionPointerReference != null)
+          'instructionPointerReference': instructionPointerReference,
+        'line': line,
+        if (moduleId != null) 'moduleId': moduleId,
+        'name': name,
+        if (presentationHint != null) 'presentationHint': presentationHint,
+        if (source != null) 'source': source,
+      };
+}
+
+/// Provides formatting information for a stack frame.
+class StackFrameFormat extends ValueFormat {
+  /// Includes all stack frames, including those the debug adapter might
+  /// otherwise hide.
+  final bool? includeAll;
+
+  /// Displays the line number of the stack frame.
+  final bool? line;
+
+  /// Displays the module of the stack frame.
+  final bool? module;
+
+  /// Displays the names of parameters for the stack frame.
+  final bool? parameterNames;
+
+  /// Displays the types of parameters for the stack frame.
+  final bool? parameterTypes;
+
+  /// Displays the values of parameters for the stack frame.
+  final bool? parameterValues;
+
+  /// Displays parameters for the stack frame.
+  final bool? parameters;
+
+  static StackFrameFormat fromJson(Map<String, Object?> obj) =>
+      StackFrameFormat.fromMap(obj);
+
+  StackFrameFormat({
+    this.includeAll,
+    this.line,
+    this.module,
+    this.parameterNames,
+    this.parameterTypes,
+    this.parameterValues,
+    this.parameters,
+    bool? hex,
+  }) : super(
+          hex: hex,
+        );
+
+  StackFrameFormat.fromMap(Map<String, Object?> obj)
+      : includeAll = obj['includeAll'] as bool?,
+        line = obj['line'] as bool?,
+        module = obj['module'] as bool?,
+        parameterNames = obj['parameterNames'] as bool?,
+        parameterTypes = obj['parameterTypes'] as bool?,
+        parameterValues = obj['parameterValues'] as bool?,
+        parameters = obj['parameters'] as bool?,
+        super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['includeAll'] is! bool?) {
+      return false;
+    }
+    if (obj['line'] is! bool?) {
+      return false;
+    }
+    if (obj['module'] is! bool?) {
+      return false;
+    }
+    if (obj['parameterNames'] is! bool?) {
+      return false;
+    }
+    if (obj['parameterTypes'] is! bool?) {
+      return false;
+    }
+    if (obj['parameterValues'] is! bool?) {
+      return false;
+    }
+    if (obj['parameters'] is! bool?) {
+      return false;
+    }
+    return ValueFormat.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+        if (includeAll != null) 'includeAll': includeAll,
+        if (line != null) 'line': line,
+        if (module != null) 'module': module,
+        if (parameterNames != null) 'parameterNames': parameterNames,
+        if (parameterTypes != null) 'parameterTypes': parameterTypes,
+        if (parameterValues != null) 'parameterValues': parameterValues,
+        if (parameters != null) 'parameters': parameters,
+      };
+}
+
+/// Arguments for 'stackTrace' request.
+class StackTraceArguments extends RequestArguments {
+  /// Specifies details on how to format the stack frames.
+  /// The attribute is only honored by a debug adapter if the capability
+  /// 'supportsValueFormattingOptions' is true.
+  final StackFrameFormat? format;
+
+  /// The maximum number of frames to return. If levels is not specified or 0,
+  /// all frames are returned.
+  final int? levels;
+
+  /// The index of the first frame to return; if omitted frames start at 0.
+  final int? startFrame;
+
+  /// Retrieve the stacktrace for this thread.
+  final int threadId;
+
+  static StackTraceArguments fromJson(Map<String, Object?> obj) =>
+      StackTraceArguments.fromMap(obj);
+
+  StackTraceArguments({
+    this.format,
+    this.levels,
+    this.startFrame,
+    required this.threadId,
+  });
+
+  StackTraceArguments.fromMap(Map<String, Object?> obj)
+      : format = obj['format'] == null
+            ? null
+            : StackFrameFormat.fromJson(obj['format'] as Map<String, Object?>),
+        levels = obj['levels'] as int?,
+        startFrame = obj['startFrame'] as int?,
+        threadId = obj['threadId'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (!StackFrameFormat?.canParse(obj['format'])) {
+      return false;
+    }
+    if (obj['levels'] is! int?) {
+      return false;
+    }
+    if (obj['startFrame'] is! int?) {
+      return false;
+    }
+    if (obj['threadId'] is! int) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (format != null) 'format': format,
+        if (levels != null) 'levels': levels,
+        if (startFrame != null) 'startFrame': startFrame,
+        'threadId': threadId,
+      };
+}
+
+/// Response to 'stackTrace' request.
+class StackTraceResponse extends Response {
+  static StackTraceResponse fromJson(Map<String, Object?> obj) =>
+      StackTraceResponse.fromMap(obj);
+
+  StackTraceResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  StackTraceResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Arguments for 'stepBack' request.
+class StepBackArguments extends RequestArguments {
+  /// Optional granularity to step. If no granularity is specified, a
+  /// granularity of 'statement' is assumed.
+  final SteppingGranularity? granularity;
+
+  /// Execute 'stepBack' for this thread.
+  final int threadId;
+
+  static StepBackArguments fromJson(Map<String, Object?> obj) =>
+      StepBackArguments.fromMap(obj);
+
+  StepBackArguments({
+    this.granularity,
+    required this.threadId,
+  });
+
+  StepBackArguments.fromMap(Map<String, Object?> obj)
+      : granularity = obj['granularity'] == null
+            ? null
+            : SteppingGranularity.fromJson(
+                obj['granularity'] as Map<String, Object?>),
+        threadId = obj['threadId'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (!SteppingGranularity?.canParse(obj['granularity'])) {
+      return false;
+    }
+    if (obj['threadId'] is! int) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (granularity != null) 'granularity': granularity,
+        'threadId': threadId,
+      };
+}
+
+/// Response to 'stepBack' request. This is just an acknowledgement, so no body
+/// field is required.
+class StepBackResponse extends Response {
+  static StepBackResponse fromJson(Map<String, Object?> obj) =>
+      StepBackResponse.fromMap(obj);
+
+  StepBackResponse({
+    Object? body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  StepBackResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Arguments for 'stepIn' request.
+class StepInArguments extends RequestArguments {
+  /// Optional granularity to step. If no granularity is specified, a
+  /// granularity of 'statement' is assumed.
+  final SteppingGranularity? granularity;
+
+  /// Optional id of the target to step into.
+  final int? targetId;
+
+  /// Execute 'stepIn' for this thread.
+  final int threadId;
+
+  static StepInArguments fromJson(Map<String, Object?> obj) =>
+      StepInArguments.fromMap(obj);
+
+  StepInArguments({
+    this.granularity,
+    this.targetId,
+    required this.threadId,
+  });
+
+  StepInArguments.fromMap(Map<String, Object?> obj)
+      : granularity = obj['granularity'] == null
+            ? null
+            : SteppingGranularity.fromJson(
+                obj['granularity'] as Map<String, Object?>),
+        targetId = obj['targetId'] as int?,
+        threadId = obj['threadId'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (!SteppingGranularity?.canParse(obj['granularity'])) {
+      return false;
+    }
+    if (obj['targetId'] is! int?) {
+      return false;
+    }
+    if (obj['threadId'] is! int) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (granularity != null) 'granularity': granularity,
+        if (targetId != null) 'targetId': targetId,
+        'threadId': threadId,
+      };
+}
+
+/// Response to 'stepIn' request. This is just an acknowledgement, so no body
+/// field is required.
+class StepInResponse extends Response {
+  static StepInResponse fromJson(Map<String, Object?> obj) =>
+      StepInResponse.fromMap(obj);
+
+  StepInResponse({
+    Object? body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  StepInResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// A StepInTarget can be used in the 'stepIn' request and determines into which
+/// single target the stepIn request should step.
+class StepInTarget {
+  /// Unique identifier for a stepIn target.
+  final int id;
+
+  /// The name of the stepIn target (shown in the UI).
+  final String label;
+
+  static StepInTarget fromJson(Map<String, Object?> obj) =>
+      StepInTarget.fromMap(obj);
+
+  StepInTarget({
+    required this.id,
+    required this.label,
+  });
+
+  StepInTarget.fromMap(Map<String, Object?> obj)
+      : id = obj['id'] as int,
+        label = obj['label'] as String;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['id'] is! int) {
+      return false;
+    }
+    if (obj['label'] is! String) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'id': id,
+        'label': label,
+      };
+}
+
+/// Arguments for 'stepInTargets' request.
+class StepInTargetsArguments extends RequestArguments {
+  /// The stack frame for which to retrieve the possible stepIn targets.
+  final int frameId;
+
+  static StepInTargetsArguments fromJson(Map<String, Object?> obj) =>
+      StepInTargetsArguments.fromMap(obj);
+
+  StepInTargetsArguments({
+    required this.frameId,
+  });
+
+  StepInTargetsArguments.fromMap(Map<String, Object?> obj)
+      : frameId = obj['frameId'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['frameId'] is! int) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'frameId': frameId,
+      };
+}
+
+/// Response to 'stepInTargets' request.
+class StepInTargetsResponse extends Response {
+  static StepInTargetsResponse fromJson(Map<String, Object?> obj) =>
+      StepInTargetsResponse.fromMap(obj);
+
+  StepInTargetsResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  StepInTargetsResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Arguments for 'stepOut' request.
+class StepOutArguments extends RequestArguments {
+  /// Optional granularity to step. If no granularity is specified, a
+  /// granularity of 'statement' is assumed.
+  final SteppingGranularity? granularity;
+
+  /// Execute 'stepOut' for this thread.
+  final int threadId;
+
+  static StepOutArguments fromJson(Map<String, Object?> obj) =>
+      StepOutArguments.fromMap(obj);
+
+  StepOutArguments({
+    this.granularity,
+    required this.threadId,
+  });
+
+  StepOutArguments.fromMap(Map<String, Object?> obj)
+      : granularity = obj['granularity'] == null
+            ? null
+            : SteppingGranularity.fromJson(
+                obj['granularity'] as Map<String, Object?>),
+        threadId = obj['threadId'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (!SteppingGranularity?.canParse(obj['granularity'])) {
+      return false;
+    }
+    if (obj['threadId'] is! int) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (granularity != null) 'granularity': granularity,
+        'threadId': threadId,
+      };
+}
+
+/// Response to 'stepOut' request. This is just an acknowledgement, so no body
+/// field is required.
+class StepOutResponse extends Response {
+  static StepOutResponse fromJson(Map<String, Object?> obj) =>
+      StepOutResponse.fromMap(obj);
+
+  StepOutResponse({
+    Object? body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  StepOutResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// The granularity of one 'step' in the stepping requests 'next', 'stepIn',
+/// 'stepOut', and 'stepBack'.
+class SteppingGranularity {
+  static SteppingGranularity fromJson(Map<String, Object?> obj) =>
+      SteppingGranularity.fromMap(obj);
+
+  SteppingGranularity();
+
+  SteppingGranularity.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+/// Arguments for 'terminate' request.
+class TerminateArguments extends RequestArguments {
+  /// A value of true indicates that this 'terminate' request is part of a
+  /// restart sequence.
+  final bool? restart;
+
+  static TerminateArguments fromJson(Map<String, Object?> obj) =>
+      TerminateArguments.fromMap(obj);
+
+  TerminateArguments({
+    this.restart,
+  });
+
+  TerminateArguments.fromMap(Map<String, Object?> obj)
+      : restart = obj['restart'] as bool?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['restart'] is! bool?) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (restart != null) 'restart': restart,
+      };
+}
+
+/// Response to 'terminate' request. This is just an acknowledgement, so no body
+/// field is required.
+class TerminateResponse extends Response {
+  static TerminateResponse fromJson(Map<String, Object?> obj) =>
+      TerminateResponse.fromMap(obj);
+
+  TerminateResponse({
+    Object? body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  TerminateResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Arguments for 'terminateThreads' request.
+class TerminateThreadsArguments extends RequestArguments {
+  /// Ids of threads to be terminated.
+  final List<int>? threadIds;
+
+  static TerminateThreadsArguments fromJson(Map<String, Object?> obj) =>
+      TerminateThreadsArguments.fromMap(obj);
+
+  TerminateThreadsArguments({
+    this.threadIds,
+  });
+
+  TerminateThreadsArguments.fromMap(Map<String, Object?> obj)
+      : threadIds =
+            (obj['threadIds'] as List?)?.map((item) => item as int).toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['threadIds'] is! List ||
+        (obj['threadIds'].any((item) => item is! int)))) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (threadIds != null) 'threadIds': threadIds,
+      };
+}
+
+/// Response to 'terminateThreads' request. This is just an acknowledgement, so
+/// no body field is required.
+class TerminateThreadsResponse extends Response {
+  static TerminateThreadsResponse fromJson(Map<String, Object?> obj) =>
+      TerminateThreadsResponse.fromMap(obj);
+
+  TerminateThreadsResponse({
+    Object? body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  TerminateThreadsResponse.fromMap(Map<String, Object?> obj)
+      : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// A Thread
+class Thread {
+  /// Unique identifier for the thread.
+  final int id;
+
+  /// A name of the thread.
+  final String name;
+
+  static Thread fromJson(Map<String, Object?> obj) => Thread.fromMap(obj);
+
+  Thread({
+    required this.id,
+    required this.name,
+  });
+
+  Thread.fromMap(Map<String, Object?> obj)
+      : id = obj['id'] as int,
+        name = obj['name'] as String;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['id'] is! int) {
+      return false;
+    }
+    if (obj['name'] is! String) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'id': id,
+        'name': name,
+      };
+}
+
+/// Response to 'threads' request.
+class ThreadsResponse extends Response {
+  static ThreadsResponse fromJson(Map<String, Object?> obj) =>
+      ThreadsResponse.fromMap(obj);
+
+  ThreadsResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  ThreadsResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Provides formatting information for a value.
+class ValueFormat {
+  /// Display the value in hex.
+  final bool? hex;
+
+  static ValueFormat fromJson(Map<String, Object?> obj) =>
+      ValueFormat.fromMap(obj);
+
+  ValueFormat({
+    this.hex,
+  });
+
+  ValueFormat.fromMap(Map<String, Object?> obj) : hex = obj['hex'] as bool?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['hex'] is! bool?) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (hex != null) 'hex': hex,
+      };
+}
+
+/// A Variable is a name/value pair.
+/// Optionally a variable can have a 'type' that is shown if space permits or
+/// when hovering over the variable's name.
+/// An optional 'kind' is used to render additional properties of the variable,
+/// e.g. different icons can be used to indicate that a variable is public or
+/// private.
+/// If the value is structured (has children), a handle is provided to retrieve
+/// the children with the VariablesRequest.
+/// If the number of named or indexed children is large, the numbers should be
+/// returned via the optional 'namedVariables' and 'indexedVariables'
+/// attributes.
+/// The client can use this optional information to present the children in a
+/// paged UI and fetch them in chunks.
+class Variable {
+  /// Optional evaluatable name of this variable which can be passed to the
+  /// 'EvaluateRequest' to fetch the variable's value.
+  final String? evaluateName;
+
+  /// The number of indexed child variables.
+  /// The client can use this optional information to present the children in a
+  /// paged UI and fetch them in chunks.
+  final int? indexedVariables;
+
+  /// Optional memory reference for the variable if the variable represents
+  /// executable code, such as a function pointer.
+  /// This attribute is only required if the client has passed the value true
+  /// for the 'supportsMemoryReferences' capability of the 'initialize' request.
+  final String? memoryReference;
+
+  /// The variable's name.
+  final String name;
+
+  /// The number of named child variables.
+  /// The client can use this optional information to present the children in a
+  /// paged UI and fetch them in chunks.
+  final int? namedVariables;
+
+  /// Properties of a variable that can be used to determine how to render the
+  /// variable in the UI.
+  final VariablePresentationHint? presentationHint;
+
+  /// The type of the variable's value. Typically shown in the UI when hovering
+  /// over the value.
+  /// This attribute should only be returned by a debug adapter if the client
+  /// has passed the value true for the 'supportsVariableType' capability of the
+  /// 'initialize' request.
+  final String? type;
+
+  /// The variable's value. This can be a multi-line text, e.g. for a function
+  /// the body of a function.
+  final String value;
+
+  /// If variablesReference is > 0, the variable is structured and its children
+  /// can be retrieved by passing variablesReference to the VariablesRequest.
+  final int variablesReference;
+
+  static Variable fromJson(Map<String, Object?> obj) => Variable.fromMap(obj);
+
+  Variable({
+    this.evaluateName,
+    this.indexedVariables,
+    this.memoryReference,
+    required this.name,
+    this.namedVariables,
+    this.presentationHint,
+    this.type,
+    required this.value,
+    required this.variablesReference,
+  });
+
+  Variable.fromMap(Map<String, Object?> obj)
+      : evaluateName = obj['evaluateName'] as String?,
+        indexedVariables = obj['indexedVariables'] as int?,
+        memoryReference = obj['memoryReference'] as String?,
+        name = obj['name'] as String,
+        namedVariables = obj['namedVariables'] as int?,
+        presentationHint = obj['presentationHint'] == null
+            ? null
+            : VariablePresentationHint.fromJson(
+                obj['presentationHint'] as Map<String, Object?>),
+        type = obj['type'] as String?,
+        value = obj['value'] as String,
+        variablesReference = obj['variablesReference'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['evaluateName'] is! String?) {
+      return false;
+    }
+    if (obj['indexedVariables'] is! int?) {
+      return false;
+    }
+    if (obj['memoryReference'] is! String?) {
+      return false;
+    }
+    if (obj['name'] is! String) {
+      return false;
+    }
+    if (obj['namedVariables'] is! int?) {
+      return false;
+    }
+    if (!VariablePresentationHint?.canParse(obj['presentationHint'])) {
+      return false;
+    }
+    if (obj['type'] is! String?) {
+      return false;
+    }
+    if (obj['value'] is! String) {
+      return false;
+    }
+    if (obj['variablesReference'] is! int) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (evaluateName != null) 'evaluateName': evaluateName,
+        if (indexedVariables != null) 'indexedVariables': indexedVariables,
+        if (memoryReference != null) 'memoryReference': memoryReference,
+        'name': name,
+        if (namedVariables != null) 'namedVariables': namedVariables,
+        if (presentationHint != null) 'presentationHint': presentationHint,
+        if (type != null) 'type': type,
+        'value': value,
+        'variablesReference': variablesReference,
+      };
+}
+
+/// Optional properties of a variable that can be used to determine how to
+/// render the variable in the UI.
+class VariablePresentationHint {
+  /// Set of attributes represented as an array of strings. Before introducing
+  /// additional values, try to use the listed values.
+  final List<String>? attributes;
+
+  /// The kind of variable. Before introducing additional values, try to use the
+  /// listed values.
+  final String? kind;
+
+  /// Visibility of variable. Before introducing additional values, try to use
+  /// the listed values.
+  final String? visibility;
+
+  static VariablePresentationHint fromJson(Map<String, Object?> obj) =>
+      VariablePresentationHint.fromMap(obj);
+
+  VariablePresentationHint({
+    this.attributes,
+    this.kind,
+    this.visibility,
+  });
+
+  VariablePresentationHint.fromMap(Map<String, Object?> obj)
+      : attributes = (obj['attributes'] as List?)
+            ?.map((item) => item as String)
+            .toList(),
+        kind = obj['kind'] as String?,
+        visibility = obj['visibility'] as String?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['attributes'] is! List ||
+        (obj['attributes'].any((item) => item is! String)))) {
+      return false;
+    }
+    if (obj['kind'] is! String?) {
+      return false;
+    }
+    if (obj['visibility'] is! String?) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (attributes != null) 'attributes': attributes,
+        if (kind != null) 'kind': kind,
+        if (visibility != null) 'visibility': visibility,
+      };
+}
+
+/// Arguments for 'variables' request.
+class VariablesArguments extends RequestArguments {
+  /// The number of variables to return. If count is missing or 0, all variables
+  /// are returned.
+  final int? count;
+
+  /// Optional filter to limit the child variables to either named or indexed.
+  /// If omitted, both types are fetched.
+  final String? filter;
+
+  /// Specifies details on how to format the Variable values.
+  /// The attribute is only honored by a debug adapter if the capability
+  /// 'supportsValueFormattingOptions' is true.
+  final ValueFormat? format;
+
+  /// The index of the first variable to return; if omitted children start at 0.
+  final int? start;
+
+  /// The Variable reference.
+  final int variablesReference;
+
+  static VariablesArguments fromJson(Map<String, Object?> obj) =>
+      VariablesArguments.fromMap(obj);
+
+  VariablesArguments({
+    this.count,
+    this.filter,
+    this.format,
+    this.start,
+    required this.variablesReference,
+  });
+
+  VariablesArguments.fromMap(Map<String, Object?> obj)
+      : count = obj['count'] as int?,
+        filter = obj['filter'] as String?,
+        format = obj['format'] == null
+            ? null
+            : ValueFormat.fromJson(obj['format'] as Map<String, Object?>),
+        start = obj['start'] as int?,
+        variablesReference = obj['variablesReference'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['count'] is! int?) {
+      return false;
+    }
+    if (obj['filter'] is! String?) {
+      return false;
+    }
+    if (!ValueFormat?.canParse(obj['format'])) {
+      return false;
+    }
+    if (obj['start'] is! int?) {
+      return false;
+    }
+    if (obj['variablesReference'] is! int) {
+      return false;
+    }
+    return RequestArguments.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (count != null) 'count': count,
+        if (filter != null) 'filter': filter,
+        if (format != null) 'format': format,
+        if (start != null) 'start': start,
+        'variablesReference': variablesReference,
+      };
+}
+
+/// Response to 'variables' request.
+class VariablesResponse extends Response {
+  static VariablesResponse fromJson(Map<String, Object?> obj) =>
+      VariablesResponse.fromMap(obj);
+
+  VariablesResponse({
+    required Map<String, Object?> body,
+    required String command,
+    String? message,
+    required int requestSeq,
+    required int seq,
+    required bool success,
+  }) : super(
+          seq: seq,
+          requestSeq: requestSeq,
+          success: success,
+          command: command,
+          message: message,
+          body: body,
+        );
+
+  VariablesResponse.fromMap(Map<String, Object?> obj) : super.fromMap(obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['body'] is! Map<String, Object?>) {
+      return false;
+    }
+    return Response.canParse(obj);
+  }
+
+  @override
+  Map<String, Object?> toJson() => {
+        ...super.toJson(),
+      };
+}
+
+/// Contains request result if success is true and optional error details if
+/// success is false.
+class AttachResponseBody {
+  static AttachResponseBody fromJson(Map<String, Object?> obj) =>
+      AttachResponseBody.fromMap(obj);
+
+  AttachResponseBody();
+
+  AttachResponseBody.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+class BreakpointEventBody extends EventBody {
+  /// The 'id' attribute is used to find the target breakpoint and the other
+  /// attributes are used as the new values.
+  final Breakpoint breakpoint;
+
+  /// The reason for the event.
+  final String reason;
+
+  static BreakpointEventBody fromJson(Map<String, Object?> obj) =>
+      BreakpointEventBody.fromMap(obj);
+
+  BreakpointEventBody({
+    required this.breakpoint,
+    required this.reason,
+  });
+
+  BreakpointEventBody.fromMap(Map<String, Object?> obj)
+      : breakpoint =
+            Breakpoint.fromJson(obj['breakpoint'] as Map<String, Object?>),
+        reason = obj['reason'] as String;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (!Breakpoint.canParse(obj['breakpoint'])) {
+      return false;
+    }
+    if (obj['reason'] is! String) {
+      return false;
+    }
+    return EventBody.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'breakpoint': breakpoint,
+        'reason': reason,
+      };
+}
+
+class BreakpointLocationsResponseBody {
+  /// Sorted set of possible breakpoint locations.
+  final List<BreakpointLocation> breakpoints;
+
+  static BreakpointLocationsResponseBody fromJson(Map<String, Object?> obj) =>
+      BreakpointLocationsResponseBody.fromMap(obj);
+
+  BreakpointLocationsResponseBody({
+    required this.breakpoints,
+  });
+
+  BreakpointLocationsResponseBody.fromMap(Map<String, Object?> obj)
+      : breakpoints = (obj['breakpoints'] as List)
+            .map((item) =>
+                BreakpointLocation.fromJson(item as Map<String, Object?>))
+            .toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['breakpoints'] is! List ||
+        (obj['breakpoints']
+            .any((item) => !BreakpointLocation.canParse(item))))) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'breakpoints': breakpoints,
+      };
+}
+
+/// Contains request result if success is true and optional error details if
+/// success is false.
+class CancelResponseBody {
+  static CancelResponseBody fromJson(Map<String, Object?> obj) =>
+      CancelResponseBody.fromMap(obj);
+
+  CancelResponseBody();
+
+  CancelResponseBody.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+class CapabilitiesEventBody extends EventBody {
+  /// The set of updated capabilities.
+  final Capabilities capabilities;
+
+  static CapabilitiesEventBody fromJson(Map<String, Object?> obj) =>
+      CapabilitiesEventBody.fromMap(obj);
+
+  CapabilitiesEventBody({
+    required this.capabilities,
+  });
+
+  CapabilitiesEventBody.fromMap(Map<String, Object?> obj)
+      : capabilities =
+            Capabilities.fromJson(obj['capabilities'] as Map<String, Object?>);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (!Capabilities.canParse(obj['capabilities'])) {
+      return false;
+    }
+    return EventBody.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'capabilities': capabilities,
+      };
+}
+
+class CompletionsResponseBody {
+  /// The possible completions for .
+  final List<CompletionItem> targets;
+
+  static CompletionsResponseBody fromJson(Map<String, Object?> obj) =>
+      CompletionsResponseBody.fromMap(obj);
+
+  CompletionsResponseBody({
+    required this.targets,
+  });
+
+  CompletionsResponseBody.fromMap(Map<String, Object?> obj)
+      : targets = (obj['targets'] as List)
+            .map(
+                (item) => CompletionItem.fromJson(item as Map<String, Object?>))
+            .toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['targets'] is! List ||
+        (obj['targets'].any((item) => !CompletionItem.canParse(item))))) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'targets': targets,
+      };
+}
+
+/// Contains request result if success is true and optional error details if
+/// success is false.
+class ConfigurationDoneResponseBody {
+  static ConfigurationDoneResponseBody fromJson(Map<String, Object?> obj) =>
+      ConfigurationDoneResponseBody.fromMap(obj);
+
+  ConfigurationDoneResponseBody();
+
+  ConfigurationDoneResponseBody.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+class ContinueResponseBody {
+  /// If true, the 'continue' request has ignored the specified thread and
+  /// continued all threads instead.
+  /// If this attribute is missing a value of 'true' is assumed for backward
+  /// compatibility.
+  final bool? allThreadsContinued;
+
+  static ContinueResponseBody fromJson(Map<String, Object?> obj) =>
+      ContinueResponseBody.fromMap(obj);
+
+  ContinueResponseBody({
+    this.allThreadsContinued,
+  });
+
+  ContinueResponseBody.fromMap(Map<String, Object?> obj)
+      : allThreadsContinued = obj['allThreadsContinued'] as bool?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['allThreadsContinued'] is! bool?) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (allThreadsContinued != null)
+          'allThreadsContinued': allThreadsContinued,
+      };
+}
+
+class ContinuedEventBody extends EventBody {
+  /// If 'allThreadsContinued' is true, a debug adapter can announce that all
+  /// threads have continued.
+  final bool? allThreadsContinued;
+
+  /// The thread which was continued.
+  final int threadId;
+
+  static ContinuedEventBody fromJson(Map<String, Object?> obj) =>
+      ContinuedEventBody.fromMap(obj);
+
+  ContinuedEventBody({
+    this.allThreadsContinued,
+    required this.threadId,
+  });
+
+  ContinuedEventBody.fromMap(Map<String, Object?> obj)
+      : allThreadsContinued = obj['allThreadsContinued'] as bool?,
+        threadId = obj['threadId'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['allThreadsContinued'] is! bool?) {
+      return false;
+    }
+    if (obj['threadId'] is! int) {
+      return false;
+    }
+    return EventBody.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (allThreadsContinued != null)
+          'allThreadsContinued': allThreadsContinued,
+        'threadId': threadId,
+      };
+}
+
+class DataBreakpointInfoResponseBody {
+  /// Optional attribute listing the available access types for a potential data
+  /// breakpoint. A UI frontend could surface this information.
+  final List<DataBreakpointAccessType>? accessTypes;
+
+  /// Optional attribute indicating that a potential data breakpoint could be
+  /// persisted across sessions.
+  final bool? canPersist;
+
+  /// An identifier for the data on which a data breakpoint can be registered
+  /// with the setDataBreakpoints request or null if no data breakpoint is
+  /// available.
+  final Either2<String, Null> dataId;
+
+  /// UI string that describes on what data the breakpoint is set on or why a
+  /// data breakpoint is not available.
+  final String description;
+
+  static DataBreakpointInfoResponseBody fromJson(Map<String, Object?> obj) =>
+      DataBreakpointInfoResponseBody.fromMap(obj);
+
+  DataBreakpointInfoResponseBody({
+    this.accessTypes,
+    this.canPersist,
+    required this.dataId,
+    required this.description,
+  });
+
+  DataBreakpointInfoResponseBody.fromMap(Map<String, Object?> obj)
+      : accessTypes = (obj['accessTypes'] as List?)
+            ?.map((item) =>
+                DataBreakpointAccessType.fromJson(item as Map<String, Object?>))
+            .toList(),
+        canPersist = obj['canPersist'] as bool?,
+        dataId = obj['dataId'] is String
+            ? Either2<String, Null>.t1(obj['dataId'] as String)
+            : Either2<String, Null>.t2(obj['dataId'] as Null),
+        description = obj['description'] as String;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['accessTypes'] is! List ||
+        (obj['accessTypes']
+            .any((item) => !DataBreakpointAccessType.canParse(item))))) {
+      return false;
+    }
+    if (obj['canPersist'] is! bool?) {
+      return false;
+    }
+    if ((obj['dataId'] is! String && obj['dataId'] != null)) {
+      return false;
+    }
+    if (obj['description'] is! String) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (accessTypes != null) 'accessTypes': accessTypes,
+        if (canPersist != null) 'canPersist': canPersist,
+        'dataId': dataId,
+        'description': description,
+      };
+}
+
+class DisassembleResponseBody {
+  /// The list of disassembled instructions.
+  final List<DisassembledInstruction> instructions;
+
+  static DisassembleResponseBody fromJson(Map<String, Object?> obj) =>
+      DisassembleResponseBody.fromMap(obj);
+
+  DisassembleResponseBody({
+    required this.instructions,
+  });
+
+  DisassembleResponseBody.fromMap(Map<String, Object?> obj)
+      : instructions = (obj['instructions'] as List)
+            .map((item) =>
+                DisassembledInstruction.fromJson(item as Map<String, Object?>))
+            .toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['instructions'] is! List ||
+        (obj['instructions']
+            .any((item) => !DisassembledInstruction.canParse(item))))) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'instructions': instructions,
+      };
+}
+
+/// Contains request result if success is true and optional error details if
+/// success is false.
+class DisconnectResponseBody {
+  static DisconnectResponseBody fromJson(Map<String, Object?> obj) =>
+      DisconnectResponseBody.fromMap(obj);
+
+  DisconnectResponseBody();
+
+  DisconnectResponseBody.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+class ErrorResponseBody {
+  /// An optional, structured error message.
+  final Message? error;
+
+  static ErrorResponseBody fromJson(Map<String, Object?> obj) =>
+      ErrorResponseBody.fromMap(obj);
+
+  ErrorResponseBody({
+    this.error,
+  });
+
+  ErrorResponseBody.fromMap(Map<String, Object?> obj)
+      : error = obj['error'] == null
+            ? null
+            : Message.fromJson(obj['error'] as Map<String, Object?>);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (!Message?.canParse(obj['error'])) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (error != null) 'error': error,
+      };
+}
+
+class EvaluateResponseBody {
+  /// The number of indexed child variables.
+  /// The client can use this optional information to present the variables in a
+  /// paged UI and fetch them in chunks.
+  /// The value should be less than or equal to 2147483647 (2^31-1).
+  final int? indexedVariables;
+
+  /// Optional memory reference to a location appropriate for this result.
+  /// For pointer type eval results, this is generally a reference to the memory
+  /// address contained in the pointer.
+  /// This attribute should be returned by a debug adapter if the client has
+  /// passed the value true for the 'supportsMemoryReferences' capability of the
+  /// 'initialize' request.
+  final String? memoryReference;
+
+  /// The number of named child variables.
+  /// The client can use this optional information to present the variables in a
+  /// paged UI and fetch them in chunks.
+  /// The value should be less than or equal to 2147483647 (2^31-1).
+  final int? namedVariables;
+
+  /// Properties of a evaluate result that can be used to determine how to
+  /// render the result in the UI.
+  final VariablePresentationHint? presentationHint;
+
+  /// The result of the evaluate request.
+  final String result;
+
+  /// The optional type of the evaluate result.
+  /// This attribute should only be returned by a debug adapter if the client
+  /// has passed the value true for the 'supportsVariableType' capability of the
+  /// 'initialize' request.
+  final String? type;
+
+  /// If variablesReference is > 0, the evaluate result is structured and its
+  /// children can be retrieved by passing variablesReference to the
+  /// VariablesRequest.
+  /// The value should be less than or equal to 2147483647 (2^31-1).
+  final int variablesReference;
+
+  static EvaluateResponseBody fromJson(Map<String, Object?> obj) =>
+      EvaluateResponseBody.fromMap(obj);
+
+  EvaluateResponseBody({
+    this.indexedVariables,
+    this.memoryReference,
+    this.namedVariables,
+    this.presentationHint,
+    required this.result,
+    this.type,
+    required this.variablesReference,
+  });
+
+  EvaluateResponseBody.fromMap(Map<String, Object?> obj)
+      : indexedVariables = obj['indexedVariables'] as int?,
+        memoryReference = obj['memoryReference'] as String?,
+        namedVariables = obj['namedVariables'] as int?,
+        presentationHint = obj['presentationHint'] == null
+            ? null
+            : VariablePresentationHint.fromJson(
+                obj['presentationHint'] as Map<String, Object?>),
+        result = obj['result'] as String,
+        type = obj['type'] as String?,
+        variablesReference = obj['variablesReference'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['indexedVariables'] is! int?) {
+      return false;
+    }
+    if (obj['memoryReference'] is! String?) {
+      return false;
+    }
+    if (obj['namedVariables'] is! int?) {
+      return false;
+    }
+    if (!VariablePresentationHint?.canParse(obj['presentationHint'])) {
+      return false;
+    }
+    if (obj['result'] is! String) {
+      return false;
+    }
+    if (obj['type'] is! String?) {
+      return false;
+    }
+    if (obj['variablesReference'] is! int) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (indexedVariables != null) 'indexedVariables': indexedVariables,
+        if (memoryReference != null) 'memoryReference': memoryReference,
+        if (namedVariables != null) 'namedVariables': namedVariables,
+        if (presentationHint != null) 'presentationHint': presentationHint,
+        'result': result,
+        if (type != null) 'type': type,
+        'variablesReference': variablesReference,
+      };
+}
+
+class ExceptionInfoResponseBody {
+  /// Mode that caused the exception notification to be raised.
+  final ExceptionBreakMode breakMode;
+
+  /// Descriptive text for the exception provided by the debug adapter.
+  final String? description;
+
+  /// Detailed information about the exception.
+  final ExceptionDetails? details;
+
+  /// ID of the exception that was thrown.
+  final String exceptionId;
+
+  static ExceptionInfoResponseBody fromJson(Map<String, Object?> obj) =>
+      ExceptionInfoResponseBody.fromMap(obj);
+
+  ExceptionInfoResponseBody({
+    required this.breakMode,
+    this.description,
+    this.details,
+    required this.exceptionId,
+  });
+
+  ExceptionInfoResponseBody.fromMap(Map<String, Object?> obj)
+      : breakMode = ExceptionBreakMode.fromJson(
+            obj['breakMode'] as Map<String, Object?>),
+        description = obj['description'] as String?,
+        details = obj['details'] == null
+            ? null
+            : ExceptionDetails.fromJson(obj['details'] as Map<String, Object?>),
+        exceptionId = obj['exceptionId'] as String;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (!ExceptionBreakMode.canParse(obj['breakMode'])) {
+      return false;
+    }
+    if (obj['description'] is! String?) {
+      return false;
+    }
+    if (!ExceptionDetails?.canParse(obj['details'])) {
+      return false;
+    }
+    if (obj['exceptionId'] is! String) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'breakMode': breakMode,
+        if (description != null) 'description': description,
+        if (details != null) 'details': details,
+        'exceptionId': exceptionId,
+      };
+}
+
+class ExitedEventBody extends EventBody {
+  /// The exit code returned from the debuggee.
+  final int exitCode;
+
+  static ExitedEventBody fromJson(Map<String, Object?> obj) =>
+      ExitedEventBody.fromMap(obj);
+
+  ExitedEventBody({
+    required this.exitCode,
+  });
+
+  ExitedEventBody.fromMap(Map<String, Object?> obj)
+      : exitCode = obj['exitCode'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['exitCode'] is! int) {
+      return false;
+    }
+    return EventBody.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'exitCode': exitCode,
+      };
+}
+
+/// Contains request result if success is true and optional error details if
+/// success is false.
+class GotoResponseBody {
+  static GotoResponseBody fromJson(Map<String, Object?> obj) =>
+      GotoResponseBody.fromMap(obj);
+
+  GotoResponseBody();
+
+  GotoResponseBody.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+class GotoTargetsResponseBody {
+  /// The possible goto targets of the specified location.
+  final List<GotoTarget> targets;
+
+  static GotoTargetsResponseBody fromJson(Map<String, Object?> obj) =>
+      GotoTargetsResponseBody.fromMap(obj);
+
+  GotoTargetsResponseBody({
+    required this.targets,
+  });
+
+  GotoTargetsResponseBody.fromMap(Map<String, Object?> obj)
+      : targets = (obj['targets'] as List)
+            .map((item) => GotoTarget.fromJson(item as Map<String, Object?>))
+            .toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['targets'] is! List ||
+        (obj['targets'].any((item) => !GotoTarget.canParse(item))))) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'targets': targets,
+      };
+}
+
+/// The capabilities of this debug adapter.
+class InitializeResponseBody {
+  static InitializeResponseBody fromJson(Map<String, Object?> obj) =>
+      InitializeResponseBody.fromMap(obj);
+
+  InitializeResponseBody();
+
+  InitializeResponseBody.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+/// Event-specific information.
+class InitializedEventBody extends EventBody {
+  static InitializedEventBody fromJson(Map<String, Object?> obj) =>
+      InitializedEventBody.fromMap(obj);
+
+  InitializedEventBody();
+
+  InitializedEventBody.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return EventBody.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+class InvalidatedEventBody extends EventBody {
+  /// Optional set of logical areas that got invalidated. This property has a
+  /// hint characteristic: a client can only be expected to make a 'best effort'
+  /// in honouring the areas but there are no guarantees. If this property is
+  /// missing, empty, or if values are not understand the client should assume a
+  /// single value 'all'.
+  final List<InvalidatedAreas>? areas;
+
+  /// If specified, the client only needs to refetch data related to this stack
+  /// frame (and the 'threadId' is ignored).
+  final int? stackFrameId;
+
+  /// If specified, the client only needs to refetch data related to this
+  /// thread.
+  final int? threadId;
+
+  static InvalidatedEventBody fromJson(Map<String, Object?> obj) =>
+      InvalidatedEventBody.fromMap(obj);
+
+  InvalidatedEventBody({
+    this.areas,
+    this.stackFrameId,
+    this.threadId,
+  });
+
+  InvalidatedEventBody.fromMap(Map<String, Object?> obj)
+      : areas = (obj['areas'] as List?)
+            ?.map((item) =>
+                InvalidatedAreas.fromJson(item as Map<String, Object?>))
+            .toList(),
+        stackFrameId = obj['stackFrameId'] as int?,
+        threadId = obj['threadId'] as int?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['areas'] is! List ||
+        (obj['areas'].any((item) => !InvalidatedAreas.canParse(item))))) {
+      return false;
+    }
+    if (obj['stackFrameId'] is! int?) {
+      return false;
+    }
+    if (obj['threadId'] is! int?) {
+      return false;
+    }
+    return EventBody.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (areas != null) 'areas': areas,
+        if (stackFrameId != null) 'stackFrameId': stackFrameId,
+        if (threadId != null) 'threadId': threadId,
+      };
+}
+
+/// Contains request result if success is true and optional error details if
+/// success is false.
+class LaunchResponseBody {
+  static LaunchResponseBody fromJson(Map<String, Object?> obj) =>
+      LaunchResponseBody.fromMap(obj);
+
+  LaunchResponseBody();
+
+  LaunchResponseBody.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+class LoadedSourceEventBody extends EventBody {
+  /// The reason for the event.
+  final String reason;
+
+  /// The new, changed, or removed source.
+  final Source source;
+
+  static LoadedSourceEventBody fromJson(Map<String, Object?> obj) =>
+      LoadedSourceEventBody.fromMap(obj);
+
+  LoadedSourceEventBody({
+    required this.reason,
+    required this.source,
+  });
+
+  LoadedSourceEventBody.fromMap(Map<String, Object?> obj)
+      : reason = obj['reason'] as String,
+        source = Source.fromJson(obj['source'] as Map<String, Object?>);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['reason'] is! String) {
+      return false;
+    }
+    if (!Source.canParse(obj['source'])) {
+      return false;
+    }
+    return EventBody.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'reason': reason,
+        'source': source,
+      };
+}
+
+class LoadedSourcesResponseBody {
+  /// Set of loaded sources.
+  final List<Source> sources;
+
+  static LoadedSourcesResponseBody fromJson(Map<String, Object?> obj) =>
+      LoadedSourcesResponseBody.fromMap(obj);
+
+  LoadedSourcesResponseBody({
+    required this.sources,
+  });
+
+  LoadedSourcesResponseBody.fromMap(Map<String, Object?> obj)
+      : sources = (obj['sources'] as List)
+            .map((item) => Source.fromJson(item as Map<String, Object?>))
+            .toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['sources'] is! List ||
+        (obj['sources'].any((item) => !Source.canParse(item))))) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'sources': sources,
+      };
+}
+
+class ModuleEventBody extends EventBody {
+  /// The new, changed, or removed module. In case of 'removed' only the module
+  /// id is used.
+  final Module module;
+
+  /// The reason for the event.
+  final String reason;
+
+  static ModuleEventBody fromJson(Map<String, Object?> obj) =>
+      ModuleEventBody.fromMap(obj);
+
+  ModuleEventBody({
+    required this.module,
+    required this.reason,
+  });
+
+  ModuleEventBody.fromMap(Map<String, Object?> obj)
+      : module = Module.fromJson(obj['module'] as Map<String, Object?>),
+        reason = obj['reason'] as String;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (!Module.canParse(obj['module'])) {
+      return false;
+    }
+    if (obj['reason'] is! String) {
+      return false;
+    }
+    return EventBody.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'module': module,
+        'reason': reason,
+      };
+}
+
+class ModulesResponseBody {
+  /// All modules or range of modules.
+  final List<Module> modules;
+
+  /// The total number of modules available.
+  final int? totalModules;
+
+  static ModulesResponseBody fromJson(Map<String, Object?> obj) =>
+      ModulesResponseBody.fromMap(obj);
+
+  ModulesResponseBody({
+    required this.modules,
+    this.totalModules,
+  });
+
+  ModulesResponseBody.fromMap(Map<String, Object?> obj)
+      : modules = (obj['modules'] as List)
+            .map((item) => Module.fromJson(item as Map<String, Object?>))
+            .toList(),
+        totalModules = obj['totalModules'] as int?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['modules'] is! List ||
+        (obj['modules'].any((item) => !Module.canParse(item))))) {
+      return false;
+    }
+    if (obj['totalModules'] is! int?) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'modules': modules,
+        if (totalModules != null) 'totalModules': totalModules,
+      };
+}
+
+/// Contains request result if success is true and optional error details if
+/// success is false.
+class NextResponseBody {
+  static NextResponseBody fromJson(Map<String, Object?> obj) =>
+      NextResponseBody.fromMap(obj);
+
+  NextResponseBody();
+
+  NextResponseBody.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+class OutputEventBody extends EventBody {
+  /// The output category. If not specified, 'console' is assumed.
+  final String? category;
+
+  /// An optional source location column where the output was produced.
+  final int? column;
+
+  /// Optional data to report. For the 'telemetry' category the data will be
+  /// sent to telemetry, for the other categories the data is shown in JSON
+  /// format.
+  final Object? data;
+
+  /// Support for keeping an output log organized by grouping related messages.
+  final String? group;
+
+  /// An optional source location line where the output was produced.
+  final int? line;
+
+  /// The output to report.
+  final String output;
+
+  /// An optional source location where the output was produced.
+  final Source? source;
+
+  /// If an attribute 'variablesReference' exists and its value is > 0, the
+  /// output contains objects which can be retrieved by passing
+  /// 'variablesReference' to the 'variables' request. The value should be less
+  /// than or equal to 2147483647 (2^31-1).
+  final int? variablesReference;
+
+  static OutputEventBody fromJson(Map<String, Object?> obj) =>
+      OutputEventBody.fromMap(obj);
+
+  OutputEventBody({
+    this.category,
+    this.column,
+    this.data,
+    this.group,
+    this.line,
+    required this.output,
+    this.source,
+    this.variablesReference,
+  });
+
+  OutputEventBody.fromMap(Map<String, Object?> obj)
+      : category = obj['category'] as String?,
+        column = obj['column'] as int?,
+        data = obj['data'],
+        group = obj['group'] as String?,
+        line = obj['line'] as int?,
+        output = obj['output'] as String,
+        source = obj['source'] == null
+            ? null
+            : Source.fromJson(obj['source'] as Map<String, Object?>),
+        variablesReference = obj['variablesReference'] as int?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['category'] is! String?) {
+      return false;
+    }
+    if (obj['column'] is! int?) {
+      return false;
+    }
+    if (obj['group'] is! String?) {
+      return false;
+    }
+    if (obj['line'] is! int?) {
+      return false;
+    }
+    if (obj['output'] is! String) {
+      return false;
+    }
+    if (!Source?.canParse(obj['source'])) {
+      return false;
+    }
+    if (obj['variablesReference'] is! int?) {
+      return false;
+    }
+    return EventBody.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (category != null) 'category': category,
+        if (column != null) 'column': column,
+        if (data != null) 'data': data,
+        if (group != null) 'group': group,
+        if (line != null) 'line': line,
+        'output': output,
+        if (source != null) 'source': source,
+        if (variablesReference != null)
+          'variablesReference': variablesReference,
+      };
+}
+
+/// Contains request result if success is true and optional error details if
+/// success is false.
+class PauseResponseBody {
+  static PauseResponseBody fromJson(Map<String, Object?> obj) =>
+      PauseResponseBody.fromMap(obj);
+
+  PauseResponseBody();
+
+  PauseResponseBody.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+class ProcessEventBody extends EventBody {
+  /// If true, the process is running on the same computer as the debug adapter.
+  final bool? isLocalProcess;
+
+  /// The logical name of the process. This is usually the full path to
+  /// process's executable file. Example: /home/example/myproj/program.js.
+  final String name;
+
+  /// The size of a pointer or address for this process, in bits. This value may
+  /// be used by clients when formatting addresses for display.
+  final int? pointerSize;
+
+  /// Describes how the debug engine started debugging this process.
+  final String? startMethod;
+
+  /// The system process id of the debugged process. This property will be
+  /// missing for non-system processes.
+  final int? systemProcessId;
+
+  static ProcessEventBody fromJson(Map<String, Object?> obj) =>
+      ProcessEventBody.fromMap(obj);
+
+  ProcessEventBody({
+    this.isLocalProcess,
+    required this.name,
+    this.pointerSize,
+    this.startMethod,
+    this.systemProcessId,
+  });
+
+  ProcessEventBody.fromMap(Map<String, Object?> obj)
+      : isLocalProcess = obj['isLocalProcess'] as bool?,
+        name = obj['name'] as String,
+        pointerSize = obj['pointerSize'] as int?,
+        startMethod = obj['startMethod'] as String?,
+        systemProcessId = obj['systemProcessId'] as int?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['isLocalProcess'] is! bool?) {
+      return false;
+    }
+    if (obj['name'] is! String) {
+      return false;
+    }
+    if (obj['pointerSize'] is! int?) {
+      return false;
+    }
+    if (obj['startMethod'] is! String?) {
+      return false;
+    }
+    if (obj['systemProcessId'] is! int?) {
+      return false;
+    }
+    return EventBody.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (isLocalProcess != null) 'isLocalProcess': isLocalProcess,
+        'name': name,
+        if (pointerSize != null) 'pointerSize': pointerSize,
+        if (startMethod != null) 'startMethod': startMethod,
+        if (systemProcessId != null) 'systemProcessId': systemProcessId,
+      };
+}
+
+class ProgressEndEventBody extends EventBody {
+  /// Optional, more detailed progress message. If omitted, the previous message
+  /// (if any) is used.
+  final String? message;
+
+  /// The ID that was introduced in the initial 'ProgressStartEvent'.
+  final String progressId;
+
+  static ProgressEndEventBody fromJson(Map<String, Object?> obj) =>
+      ProgressEndEventBody.fromMap(obj);
+
+  ProgressEndEventBody({
+    this.message,
+    required this.progressId,
+  });
+
+  ProgressEndEventBody.fromMap(Map<String, Object?> obj)
+      : message = obj['message'] as String?,
+        progressId = obj['progressId'] as String;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['message'] is! String?) {
+      return false;
+    }
+    if (obj['progressId'] is! String) {
+      return false;
+    }
+    return EventBody.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (message != null) 'message': message,
+        'progressId': progressId,
+      };
+}
+
+class ProgressStartEventBody extends EventBody {
+  /// If true, the request that reports progress may be canceled with a 'cancel'
+  /// request.
+  /// So this property basically controls whether the client should use UX that
+  /// supports cancellation.
+  /// Clients that don't support cancellation are allowed to ignore the setting.
+  final bool? cancellable;
+
+  /// Optional, more detailed progress message.
+  final String? message;
+
+  /// Optional progress percentage to display (value range: 0 to 100). If
+  /// omitted no percentage will be shown.
+  final num? percentage;
+
+  /// An ID that must be used in subsequent 'progressUpdate' and 'progressEnd'
+  /// events to make them refer to the same progress reporting.
+  /// IDs must be unique within a debug session.
+  final String progressId;
+
+  /// The request ID that this progress report is related to. If specified a
+  /// debug adapter is expected to emit
+  /// progress events for the long running request until the request has been
+  /// either completed or cancelled.
+  /// If the request ID is omitted, the progress report is assumed to be related
+  /// to some general activity of the debug adapter.
+  final int? requestId;
+
+  /// Mandatory (short) title of the progress reporting. Shown in the UI to
+  /// describe the long running operation.
+  final String title;
+
+  static ProgressStartEventBody fromJson(Map<String, Object?> obj) =>
+      ProgressStartEventBody.fromMap(obj);
+
+  ProgressStartEventBody({
+    this.cancellable,
+    this.message,
+    this.percentage,
+    required this.progressId,
+    this.requestId,
+    required this.title,
+  });
+
+  ProgressStartEventBody.fromMap(Map<String, Object?> obj)
+      : cancellable = obj['cancellable'] as bool?,
+        message = obj['message'] as String?,
+        percentage = obj['percentage'] as num?,
+        progressId = obj['progressId'] as String,
+        requestId = obj['requestId'] as int?,
+        title = obj['title'] as String;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['cancellable'] is! bool?) {
+      return false;
+    }
+    if (obj['message'] is! String?) {
+      return false;
+    }
+    if (obj['percentage'] is! num?) {
+      return false;
+    }
+    if (obj['progressId'] is! String) {
+      return false;
+    }
+    if (obj['requestId'] is! int?) {
+      return false;
+    }
+    if (obj['title'] is! String) {
+      return false;
+    }
+    return EventBody.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (cancellable != null) 'cancellable': cancellable,
+        if (message != null) 'message': message,
+        if (percentage != null) 'percentage': percentage,
+        'progressId': progressId,
+        if (requestId != null) 'requestId': requestId,
+        'title': title,
+      };
+}
+
+class ProgressUpdateEventBody extends EventBody {
+  /// Optional, more detailed progress message. If omitted, the previous message
+  /// (if any) is used.
+  final String? message;
+
+  /// Optional progress percentage to display (value range: 0 to 100). If
+  /// omitted no percentage will be shown.
+  final num? percentage;
+
+  /// The ID that was introduced in the initial 'progressStart' event.
+  final String progressId;
+
+  static ProgressUpdateEventBody fromJson(Map<String, Object?> obj) =>
+      ProgressUpdateEventBody.fromMap(obj);
+
+  ProgressUpdateEventBody({
+    this.message,
+    this.percentage,
+    required this.progressId,
+  });
+
+  ProgressUpdateEventBody.fromMap(Map<String, Object?> obj)
+      : message = obj['message'] as String?,
+        percentage = obj['percentage'] as num?,
+        progressId = obj['progressId'] as String;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['message'] is! String?) {
+      return false;
+    }
+    if (obj['percentage'] is! num?) {
+      return false;
+    }
+    if (obj['progressId'] is! String) {
+      return false;
+    }
+    return EventBody.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (message != null) 'message': message,
+        if (percentage != null) 'percentage': percentage,
+        'progressId': progressId,
+      };
+}
+
+class ReadMemoryResponseBody {
+  /// The address of the first byte of data returned.
+  /// Treated as a hex value if prefixed with '0x', or as a decimal value
+  /// otherwise.
+  final String address;
+
+  /// The bytes read from memory, encoded using base64.
+  final String? data;
+
+  /// The number of unreadable bytes encountered after the last successfully
+  /// read byte.
+  /// This can be used to determine the number of bytes that must be skipped
+  /// before a subsequent 'readMemory' request will succeed.
+  final int? unreadableBytes;
+
+  static ReadMemoryResponseBody fromJson(Map<String, Object?> obj) =>
+      ReadMemoryResponseBody.fromMap(obj);
+
+  ReadMemoryResponseBody({
+    required this.address,
+    this.data,
+    this.unreadableBytes,
+  });
+
+  ReadMemoryResponseBody.fromMap(Map<String, Object?> obj)
+      : address = obj['address'] as String,
+        data = obj['data'] as String?,
+        unreadableBytes = obj['unreadableBytes'] as int?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['address'] is! String) {
+      return false;
+    }
+    if (obj['data'] is! String?) {
+      return false;
+    }
+    if (obj['unreadableBytes'] is! int?) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'address': address,
+        if (data != null) 'data': data,
+        if (unreadableBytes != null) 'unreadableBytes': unreadableBytes,
+      };
+}
+
+/// Contains request result if success is true and optional error details if
+/// success is false.
+class RestartFrameResponseBody {
+  static RestartFrameResponseBody fromJson(Map<String, Object?> obj) =>
+      RestartFrameResponseBody.fromMap(obj);
+
+  RestartFrameResponseBody();
+
+  RestartFrameResponseBody.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+/// Contains request result if success is true and optional error details if
+/// success is false.
+class RestartResponseBody {
+  static RestartResponseBody fromJson(Map<String, Object?> obj) =>
+      RestartResponseBody.fromMap(obj);
+
+  RestartResponseBody();
+
+  RestartResponseBody.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+/// Contains request result if success is true and optional error details if
+/// success is false.
+class ReverseContinueResponseBody {
+  static ReverseContinueResponseBody fromJson(Map<String, Object?> obj) =>
+      ReverseContinueResponseBody.fromMap(obj);
+
+  ReverseContinueResponseBody();
+
+  ReverseContinueResponseBody.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+class RunInTerminalResponseBody {
+  /// The process ID. The value should be less than or equal to 2147483647
+  /// (2^31-1).
+  final int? processId;
+
+  /// The process ID of the terminal shell. The value should be less than or
+  /// equal to 2147483647 (2^31-1).
+  final int? shellProcessId;
+
+  static RunInTerminalResponseBody fromJson(Map<String, Object?> obj) =>
+      RunInTerminalResponseBody.fromMap(obj);
+
+  RunInTerminalResponseBody({
+    this.processId,
+    this.shellProcessId,
+  });
+
+  RunInTerminalResponseBody.fromMap(Map<String, Object?> obj)
+      : processId = obj['processId'] as int?,
+        shellProcessId = obj['shellProcessId'] as int?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['processId'] is! int?) {
+      return false;
+    }
+    if (obj['shellProcessId'] is! int?) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (processId != null) 'processId': processId,
+        if (shellProcessId != null) 'shellProcessId': shellProcessId,
+      };
+}
+
+class ScopesResponseBody {
+  /// The scopes of the stackframe. If the array has length zero, there are no
+  /// scopes available.
+  final List<Scope> scopes;
+
+  static ScopesResponseBody fromJson(Map<String, Object?> obj) =>
+      ScopesResponseBody.fromMap(obj);
+
+  ScopesResponseBody({
+    required this.scopes,
+  });
+
+  ScopesResponseBody.fromMap(Map<String, Object?> obj)
+      : scopes = (obj['scopes'] as List)
+            .map((item) => Scope.fromJson(item as Map<String, Object?>))
+            .toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['scopes'] is! List ||
+        (obj['scopes'].any((item) => !Scope.canParse(item))))) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'scopes': scopes,
+      };
+}
+
+class SetBreakpointsResponseBody {
+  /// Information about the breakpoints.
+  /// The array elements are in the same order as the elements of the
+  /// 'breakpoints' (or the deprecated 'lines') array in the arguments.
+  final List<Breakpoint> breakpoints;
+
+  static SetBreakpointsResponseBody fromJson(Map<String, Object?> obj) =>
+      SetBreakpointsResponseBody.fromMap(obj);
+
+  SetBreakpointsResponseBody({
+    required this.breakpoints,
+  });
+
+  SetBreakpointsResponseBody.fromMap(Map<String, Object?> obj)
+      : breakpoints = (obj['breakpoints'] as List)
+            .map((item) => Breakpoint.fromJson(item as Map<String, Object?>))
+            .toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['breakpoints'] is! List ||
+        (obj['breakpoints'].any((item) => !Breakpoint.canParse(item))))) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'breakpoints': breakpoints,
+      };
+}
+
+class SetDataBreakpointsResponseBody {
+  /// Information about the data breakpoints. The array elements correspond to
+  /// the elements of the input argument 'breakpoints' array.
+  final List<Breakpoint> breakpoints;
+
+  static SetDataBreakpointsResponseBody fromJson(Map<String, Object?> obj) =>
+      SetDataBreakpointsResponseBody.fromMap(obj);
+
+  SetDataBreakpointsResponseBody({
+    required this.breakpoints,
+  });
+
+  SetDataBreakpointsResponseBody.fromMap(Map<String, Object?> obj)
+      : breakpoints = (obj['breakpoints'] as List)
+            .map((item) => Breakpoint.fromJson(item as Map<String, Object?>))
+            .toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['breakpoints'] is! List ||
+        (obj['breakpoints'].any((item) => !Breakpoint.canParse(item))))) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'breakpoints': breakpoints,
+      };
+}
+
+class SetExceptionBreakpointsResponseBody {
+  /// Information about the exception breakpoints or filters.
+  /// The breakpoints returned are in the same order as the elements of the
+  /// 'filters', 'filterOptions', 'exceptionOptions' arrays in the arguments. If
+  /// both 'filters' and 'filterOptions' are given, the returned array must
+  /// start with 'filters' information first, followed by 'filterOptions'
+  /// information.
+  final List<Breakpoint>? breakpoints;
+
+  static SetExceptionBreakpointsResponseBody fromJson(
+          Map<String, Object?> obj) =>
+      SetExceptionBreakpointsResponseBody.fromMap(obj);
+
+  SetExceptionBreakpointsResponseBody({
+    this.breakpoints,
+  });
+
+  SetExceptionBreakpointsResponseBody.fromMap(Map<String, Object?> obj)
+      : breakpoints = (obj['breakpoints'] as List?)
+            ?.map((item) => Breakpoint.fromJson(item as Map<String, Object?>))
+            .toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['breakpoints'] is! List ||
+        (obj['breakpoints'].any((item) => !Breakpoint.canParse(item))))) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (breakpoints != null) 'breakpoints': breakpoints,
+      };
+}
+
+class SetExpressionResponseBody {
+  /// The number of indexed child variables.
+  /// The client can use this optional information to present the variables in a
+  /// paged UI and fetch them in chunks.
+  /// The value should be less than or equal to 2147483647 (2^31-1).
+  final int? indexedVariables;
+
+  /// The number of named child variables.
+  /// The client can use this optional information to present the variables in a
+  /// paged UI and fetch them in chunks.
+  /// The value should be less than or equal to 2147483647 (2^31-1).
+  final int? namedVariables;
+
+  /// Properties of a value that can be used to determine how to render the
+  /// result in the UI.
+  final VariablePresentationHint? presentationHint;
+
+  /// The optional type of the value.
+  /// This attribute should only be returned by a debug adapter if the client
+  /// has passed the value true for the 'supportsVariableType' capability of the
+  /// 'initialize' request.
+  final String? type;
+
+  /// The new value of the expression.
+  final String value;
+
+  /// If variablesReference is > 0, the value is structured and its children can
+  /// be retrieved by passing variablesReference to the VariablesRequest.
+  /// The value should be less than or equal to 2147483647 (2^31-1).
+  final int? variablesReference;
+
+  static SetExpressionResponseBody fromJson(Map<String, Object?> obj) =>
+      SetExpressionResponseBody.fromMap(obj);
+
+  SetExpressionResponseBody({
+    this.indexedVariables,
+    this.namedVariables,
+    this.presentationHint,
+    this.type,
+    required this.value,
+    this.variablesReference,
+  });
+
+  SetExpressionResponseBody.fromMap(Map<String, Object?> obj)
+      : indexedVariables = obj['indexedVariables'] as int?,
+        namedVariables = obj['namedVariables'] as int?,
+        presentationHint = obj['presentationHint'] == null
+            ? null
+            : VariablePresentationHint.fromJson(
+                obj['presentationHint'] as Map<String, Object?>),
+        type = obj['type'] as String?,
+        value = obj['value'] as String,
+        variablesReference = obj['variablesReference'] as int?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['indexedVariables'] is! int?) {
+      return false;
+    }
+    if (obj['namedVariables'] is! int?) {
+      return false;
+    }
+    if (!VariablePresentationHint?.canParse(obj['presentationHint'])) {
+      return false;
+    }
+    if (obj['type'] is! String?) {
+      return false;
+    }
+    if (obj['value'] is! String) {
+      return false;
+    }
+    if (obj['variablesReference'] is! int?) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (indexedVariables != null) 'indexedVariables': indexedVariables,
+        if (namedVariables != null) 'namedVariables': namedVariables,
+        if (presentationHint != null) 'presentationHint': presentationHint,
+        if (type != null) 'type': type,
+        'value': value,
+        if (variablesReference != null)
+          'variablesReference': variablesReference,
+      };
+}
+
+class SetFunctionBreakpointsResponseBody {
+  /// Information about the breakpoints. The array elements correspond to the
+  /// elements of the 'breakpoints' array.
+  final List<Breakpoint> breakpoints;
+
+  static SetFunctionBreakpointsResponseBody fromJson(
+          Map<String, Object?> obj) =>
+      SetFunctionBreakpointsResponseBody.fromMap(obj);
+
+  SetFunctionBreakpointsResponseBody({
+    required this.breakpoints,
+  });
+
+  SetFunctionBreakpointsResponseBody.fromMap(Map<String, Object?> obj)
+      : breakpoints = (obj['breakpoints'] as List)
+            .map((item) => Breakpoint.fromJson(item as Map<String, Object?>))
+            .toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['breakpoints'] is! List ||
+        (obj['breakpoints'].any((item) => !Breakpoint.canParse(item))))) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'breakpoints': breakpoints,
+      };
+}
+
+class SetInstructionBreakpointsResponseBody {
+  /// Information about the breakpoints. The array elements correspond to the
+  /// elements of the 'breakpoints' array.
+  final List<Breakpoint> breakpoints;
+
+  static SetInstructionBreakpointsResponseBody fromJson(
+          Map<String, Object?> obj) =>
+      SetInstructionBreakpointsResponseBody.fromMap(obj);
+
+  SetInstructionBreakpointsResponseBody({
+    required this.breakpoints,
+  });
+
+  SetInstructionBreakpointsResponseBody.fromMap(Map<String, Object?> obj)
+      : breakpoints = (obj['breakpoints'] as List)
+            .map((item) => Breakpoint.fromJson(item as Map<String, Object?>))
+            .toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['breakpoints'] is! List ||
+        (obj['breakpoints'].any((item) => !Breakpoint.canParse(item))))) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'breakpoints': breakpoints,
+      };
+}
+
+class SetVariableResponseBody {
+  /// The number of indexed child variables.
+  /// The client can use this optional information to present the variables in a
+  /// paged UI and fetch them in chunks.
+  /// The value should be less than or equal to 2147483647 (2^31-1).
+  final int? indexedVariables;
+
+  /// The number of named child variables.
+  /// The client can use this optional information to present the variables in a
+  /// paged UI and fetch them in chunks.
+  /// The value should be less than or equal to 2147483647 (2^31-1).
+  final int? namedVariables;
+
+  /// The type of the new value. Typically shown in the UI when hovering over
+  /// the value.
+  final String? type;
+
+  /// The new value of the variable.
+  final String value;
+
+  /// If variablesReference is > 0, the new value is structured and its children
+  /// can be retrieved by passing variablesReference to the VariablesRequest.
+  /// The value should be less than or equal to 2147483647 (2^31-1).
+  final int? variablesReference;
+
+  static SetVariableResponseBody fromJson(Map<String, Object?> obj) =>
+      SetVariableResponseBody.fromMap(obj);
+
+  SetVariableResponseBody({
+    this.indexedVariables,
+    this.namedVariables,
+    this.type,
+    required this.value,
+    this.variablesReference,
+  });
+
+  SetVariableResponseBody.fromMap(Map<String, Object?> obj)
+      : indexedVariables = obj['indexedVariables'] as int?,
+        namedVariables = obj['namedVariables'] as int?,
+        type = obj['type'] as String?,
+        value = obj['value'] as String,
+        variablesReference = obj['variablesReference'] as int?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['indexedVariables'] is! int?) {
+      return false;
+    }
+    if (obj['namedVariables'] is! int?) {
+      return false;
+    }
+    if (obj['type'] is! String?) {
+      return false;
+    }
+    if (obj['value'] is! String) {
+      return false;
+    }
+    if (obj['variablesReference'] is! int?) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        if (indexedVariables != null) 'indexedVariables': indexedVariables,
+        if (namedVariables != null) 'namedVariables': namedVariables,
+        if (type != null) 'type': type,
+        'value': value,
+        if (variablesReference != null)
+          'variablesReference': variablesReference,
+      };
+}
+
+class SourceResponseBody {
+  /// Content of the source reference.
+  final String content;
+
+  /// Optional content type (mime type) of the source.
+  final String? mimeType;
+
+  static SourceResponseBody fromJson(Map<String, Object?> obj) =>
+      SourceResponseBody.fromMap(obj);
+
+  SourceResponseBody({
+    required this.content,
+    this.mimeType,
+  });
+
+  SourceResponseBody.fromMap(Map<String, Object?> obj)
+      : content = obj['content'] as String,
+        mimeType = obj['mimeType'] as String?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['content'] is! String) {
+      return false;
+    }
+    if (obj['mimeType'] is! String?) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'content': content,
+        if (mimeType != null) 'mimeType': mimeType,
+      };
+}
+
+class StackTraceResponseBody {
+  /// The frames of the stackframe. If the array has length zero, there are no
+  /// stackframes available.
+  /// This means that there is no location information available.
+  final List<StackFrame> stackFrames;
+
+  /// The total number of frames available in the stack. If omitted or if
+  /// totalFrames is larger than the available frames, a client is expected to
+  /// request frames until a request returns less frames than requested (which
+  /// indicates the end of the stack). Returning monotonically increasing
+  /// totalFrames values for subsequent requests can be used to enforce paging
+  /// in the client.
+  final int? totalFrames;
+
+  static StackTraceResponseBody fromJson(Map<String, Object?> obj) =>
+      StackTraceResponseBody.fromMap(obj);
+
+  StackTraceResponseBody({
+    required this.stackFrames,
+    this.totalFrames,
+  });
+
+  StackTraceResponseBody.fromMap(Map<String, Object?> obj)
+      : stackFrames = (obj['stackFrames'] as List)
+            .map((item) => StackFrame.fromJson(item as Map<String, Object?>))
+            .toList(),
+        totalFrames = obj['totalFrames'] as int?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['stackFrames'] is! List ||
+        (obj['stackFrames'].any((item) => !StackFrame.canParse(item))))) {
+      return false;
+    }
+    if (obj['totalFrames'] is! int?) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'stackFrames': stackFrames,
+        if (totalFrames != null) 'totalFrames': totalFrames,
+      };
+}
+
+/// Contains request result if success is true and optional error details if
+/// success is false.
+class StepBackResponseBody {
+  static StepBackResponseBody fromJson(Map<String, Object?> obj) =>
+      StepBackResponseBody.fromMap(obj);
+
+  StepBackResponseBody();
+
+  StepBackResponseBody.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+/// Contains request result if success is true and optional error details if
+/// success is false.
+class StepInResponseBody {
+  static StepInResponseBody fromJson(Map<String, Object?> obj) =>
+      StepInResponseBody.fromMap(obj);
+
+  StepInResponseBody();
+
+  StepInResponseBody.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+class StepInTargetsResponseBody {
+  /// The possible stepIn targets of the specified source location.
+  final List<StepInTarget> targets;
+
+  static StepInTargetsResponseBody fromJson(Map<String, Object?> obj) =>
+      StepInTargetsResponseBody.fromMap(obj);
+
+  StepInTargetsResponseBody({
+    required this.targets,
+  });
+
+  StepInTargetsResponseBody.fromMap(Map<String, Object?> obj)
+      : targets = (obj['targets'] as List)
+            .map((item) => StepInTarget.fromJson(item as Map<String, Object?>))
+            .toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['targets'] is! List ||
+        (obj['targets'].any((item) => !StepInTarget.canParse(item))))) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'targets': targets,
+      };
+}
+
+/// Contains request result if success is true and optional error details if
+/// success is false.
+class StepOutResponseBody {
+  static StepOutResponseBody fromJson(Map<String, Object?> obj) =>
+      StepOutResponseBody.fromMap(obj);
+
+  StepOutResponseBody();
+
+  StepOutResponseBody.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+class StoppedEventBody extends EventBody {
+  /// If 'allThreadsStopped' is true, a debug adapter can announce that all
+  /// threads have stopped.
+  /// - The client should use this information to enable that all threads can be expanded to access their stacktraces.
+  /// - If the attribute is missing or false, only the thread with the given threadId can be expanded.
+  final bool? allThreadsStopped;
+
+  /// The full reason for the event, e.g. 'Paused on exception'. This string is
+  /// shown in the UI as is and must be translated.
+  final String? description;
+
+  /// Ids of the breakpoints that triggered the event. In most cases there will
+  /// be only a single breakpoint but here are some examples for multiple
+  /// breakpoints:
+  /// - Different types of breakpoints map to the same location.
+  /// - Multiple source breakpoints get collapsed to the same instruction by the compiler/runtime.
+  /// - Multiple function breakpoints with different function names map to the same location.
+  final List<int>? hitBreakpointIds;
+
+  /// A value of true hints to the frontend that this event should not change
+  /// the focus.
+  final bool? preserveFocusHint;
+
+  /// The reason for the event.
+  /// For backward compatibility this string is shown in the UI if the
+  /// 'description' attribute is missing (but it must not be translated).
+  final String reason;
+
+  /// Additional information. E.g. if reason is 'exception', text contains the
+  /// exception name. This string is shown in the UI.
+  final String? text;
+
+  /// The thread which was stopped.
+  final int? threadId;
+
+  static StoppedEventBody fromJson(Map<String, Object?> obj) =>
+      StoppedEventBody.fromMap(obj);
+
+  StoppedEventBody({
+    this.allThreadsStopped,
+    this.description,
+    this.hitBreakpointIds,
+    this.preserveFocusHint,
+    required this.reason,
+    this.text,
+    this.threadId,
+  });
+
+  StoppedEventBody.fromMap(Map<String, Object?> obj)
+      : allThreadsStopped = obj['allThreadsStopped'] as bool?,
+        description = obj['description'] as String?,
+        hitBreakpointIds = (obj['hitBreakpointIds'] as List?)
+            ?.map((item) => item as int)
+            .toList(),
+        preserveFocusHint = obj['preserveFocusHint'] as bool?,
+        reason = obj['reason'] as String,
+        text = obj['text'] as String?,
+        threadId = obj['threadId'] as int?;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['allThreadsStopped'] is! bool?) {
+      return false;
+    }
+    if (obj['description'] is! String?) {
+      return false;
+    }
+    if ((obj['hitBreakpointIds'] is! List ||
+        (obj['hitBreakpointIds'].any((item) => item is! int)))) {
+      return false;
+    }
+    if (obj['preserveFocusHint'] is! bool?) {
+      return false;
+    }
+    if (obj['reason'] is! String) {
+      return false;
+    }
+    if (obj['text'] is! String?) {
+      return false;
+    }
+    if (obj['threadId'] is! int?) {
+      return false;
+    }
+    return EventBody.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (allThreadsStopped != null) 'allThreadsStopped': allThreadsStopped,
+        if (description != null) 'description': description,
+        if (hitBreakpointIds != null) 'hitBreakpointIds': hitBreakpointIds,
+        if (preserveFocusHint != null) 'preserveFocusHint': preserveFocusHint,
+        'reason': reason,
+        if (text != null) 'text': text,
+        if (threadId != null) 'threadId': threadId,
+      };
+}
+
+/// Contains request result if success is true and optional error details if
+/// success is false.
+class TerminateResponseBody {
+  static TerminateResponseBody fromJson(Map<String, Object?> obj) =>
+      TerminateResponseBody.fromMap(obj);
+
+  TerminateResponseBody();
+
+  TerminateResponseBody.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+/// Contains request result if success is true and optional error details if
+/// success is false.
+class TerminateThreadsResponseBody {
+  static TerminateThreadsResponseBody fromJson(Map<String, Object?> obj) =>
+      TerminateThreadsResponseBody.fromMap(obj);
+
+  TerminateThreadsResponseBody();
+
+  TerminateThreadsResponseBody.fromMap(Map<String, Object?> obj);
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {};
+}
+
+class TerminatedEventBody extends EventBody {
+  /// A debug adapter may set 'restart' to true (or to an arbitrary object) to
+  /// request that the front end restarts the session.
+  /// The value is not interpreted by the client and passed unmodified as an
+  /// attribute '__restart' to the 'launch' and 'attach' requests.
+  final Object? restart;
+
+  static TerminatedEventBody fromJson(Map<String, Object?> obj) =>
+      TerminatedEventBody.fromMap(obj);
+
+  TerminatedEventBody({
+    this.restart,
+  });
+
+  TerminatedEventBody.fromMap(Map<String, Object?> obj)
+      : restart = obj['restart'];
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    return EventBody.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        if (restart != null) 'restart': restart,
+      };
+}
+
+class ThreadEventBody extends EventBody {
+  /// The reason for the event.
+  final String reason;
+
+  /// The identifier of the thread.
+  final int threadId;
+
+  static ThreadEventBody fromJson(Map<String, Object?> obj) =>
+      ThreadEventBody.fromMap(obj);
+
+  ThreadEventBody({
+    required this.reason,
+    required this.threadId,
+  });
+
+  ThreadEventBody.fromMap(Map<String, Object?> obj)
+      : reason = obj['reason'] as String,
+        threadId = obj['threadId'] as int;
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if (obj['reason'] is! String) {
+      return false;
+    }
+    if (obj['threadId'] is! int) {
+      return false;
+    }
+    return EventBody.canParse(obj);
+  }
+
+  Map<String, Object?> toJson() => {
+        'reason': reason,
+        'threadId': threadId,
+      };
+}
+
+class ThreadsResponseBody {
+  /// All threads.
+  final List<Thread> threads;
+
+  static ThreadsResponseBody fromJson(Map<String, Object?> obj) =>
+      ThreadsResponseBody.fromMap(obj);
+
+  ThreadsResponseBody({
+    required this.threads,
+  });
+
+  ThreadsResponseBody.fromMap(Map<String, Object?> obj)
+      : threads = (obj['threads'] as List)
+            .map((item) => Thread.fromJson(item as Map<String, Object?>))
+            .toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['threads'] is! List ||
+        (obj['threads'].any((item) => !Thread.canParse(item))))) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'threads': threads,
+      };
+}
+
+class VariablesResponseBody {
+  /// All (or a range) of variables for the given variable reference.
+  final List<Variable> variables;
+
+  static VariablesResponseBody fromJson(Map<String, Object?> obj) =>
+      VariablesResponseBody.fromMap(obj);
+
+  VariablesResponseBody({
+    required this.variables,
+  });
+
+  VariablesResponseBody.fromMap(Map<String, Object?> obj)
+      : variables = (obj['variables'] as List)
+            .map((item) => Variable.fromJson(item as Map<String, Object?>))
+            .toList();
+
+  static bool canParse(Object? obj) {
+    if (obj is! Map<String, dynamic>) {
+      return false;
+    }
+    if ((obj['variables'] is! List ||
+        (obj['variables'].any((item) => !Variable.canParse(item))))) {
+      return false;
+    }
+    return true;
+  }
+
+  Map<String, Object?> toJson() => {
+        'variables': variables,
+      };
+}
+
+const eventTypes = {
+  BreakpointEventBody: 'breakpoint',
+  CapabilitiesEventBody: 'capabilities',
+  ContinuedEventBody: 'continued',
+  ExitedEventBody: 'exited',
+  InitializedEventBody: 'initialized',
+  InvalidatedEventBody: 'invalidated',
+  LoadedSourceEventBody: 'loadedSource',
+  ModuleEventBody: 'module',
+  OutputEventBody: 'output',
+  ProcessEventBody: 'process',
+  ProgressEndEventBody: 'progressEnd',
+  ProgressStartEventBody: 'progressStart',
+  ProgressUpdateEventBody: 'progressUpdate',
+  StoppedEventBody: 'stopped',
+  TerminatedEventBody: 'terminated',
+  ThreadEventBody: 'thread',
+};
+
+const commandTypes = {
+  AttachRequestArguments: 'attach',
+  BreakpointLocationsArguments: 'breakpointLocations',
+  CancelArguments: 'cancel',
+  CompletionsArguments: 'completions',
+  ConfigurationDoneArguments: 'configurationDone',
+  ContinueArguments: 'continue',
+  DataBreakpointInfoArguments: 'dataBreakpointInfo',
+  DisassembleArguments: 'disassemble',
+  DisconnectArguments: 'disconnect',
+  EvaluateArguments: 'evaluate',
+  ExceptionInfoArguments: 'exceptionInfo',
+  GotoArguments: 'goto',
+  GotoTargetsArguments: 'gotoTargets',
+  InitializeRequestArguments: 'initialize',
+  LaunchRequestArguments: 'launch',
+  LoadedSourcesArguments: 'loadedSources',
+  ModulesArguments: 'modules',
+  NextArguments: 'next',
+  PauseArguments: 'pause',
+  ReadMemoryArguments: 'readMemory',
+  RestartFrameArguments: 'restartFrame',
+  RestartArguments: 'restart',
+  ReverseContinueArguments: 'reverseContinue',
+  RunInTerminalRequestArguments: 'runInTerminal',
+  ScopesArguments: 'scopes',
+  SetBreakpointsArguments: 'setBreakpoints',
+  SetDataBreakpointsArguments: 'setDataBreakpoints',
+  SetExceptionBreakpointsArguments: 'setExceptionBreakpoints',
+  SetExpressionArguments: 'setExpression',
+  SetFunctionBreakpointsArguments: 'setFunctionBreakpoints',
+  SetInstructionBreakpointsArguments: 'setInstructionBreakpoints',
+  SetVariableArguments: 'setVariable',
+  SourceArguments: 'source',
+  StackTraceArguments: 'stackTrace',
+  StepBackArguments: 'stepBack',
+  StepInArguments: 'stepIn',
+  StepInTargetsArguments: 'stepInTargets',
+  StepOutArguments: 'stepOut',
+  TerminateArguments: 'terminate',
+  TerminateThreadsArguments: 'terminateThreads',
+  VariablesArguments: 'variables',
+};
diff --git a/pkg/dds/lib/src/dap/protocol_special.dart b/pkg/dds/lib/src/dap/protocol_special.dart
new file mode 100644
index 0000000..346673e
--- /dev/null
+++ b/pkg/dds/lib/src/dap/protocol_special.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// TODO(dantup): Consolidate this with the equiv file in analysis_server (most
+//  likely by having analysis_server reference this one).
+
+Object? specToJson(Object? obj) {
+  if (obj is ToJsonable) {
+    return obj.toJson();
+  } else {
+    return obj;
+  }
+}
+
+/// Represents either a [T1] or [T2].
+///
+/// This class is used for fields generated from the LSP/DAP specs that are
+/// defined as unions in TypeScript (for example `String | number`) that cannot
+/// directly be represented as Dart types.
+///
+/// Use the [map] function to access the element, providing a handler for each
+/// of the possible types.
+class Either2<T1, T2> extends ToJsonable {
+  final int _which;
+  final T1? _t1;
+  final T2? _t2;
+
+  Either2.t1(T1 this._t1)
+      : _t2 = null,
+        _which = 1;
+  Either2.t2(T2 this._t2)
+      : _t1 = null,
+        _which = 2;
+
+  T map<T>(T Function(T1) f1, T Function(T2) f2) {
+    return _which == 1 ? f1(_t1 as T1) : f2(_t2 as T2);
+  }
+
+  @override
+  Object? toJson() => map(specToJson, specToJson);
+
+  @override
+  String toString() => map((t) => t.toString(), (t) => t.toString());
+
+  /// Checks whether the value of the union equals the supplied value.
+  bool valueEquals(o) => map((t) => t == o, (t) => t == o);
+}
+
+/// An object from the LSP/DAP specs that can be converted to JSON.
+abstract class ToJsonable {
+  Object? toJson();
+}
diff --git a/pkg/dds/pubspec.yaml b/pkg/dds/pubspec.yaml
index edc2cfd..a6c9ed0 100644
--- a/pkg/dds/pubspec.yaml
+++ b/pkg/dds/pubspec.yaml
@@ -28,5 +28,8 @@
   web_socket_channel: ^2.0.0
 
 dev_dependencies:
+  args: ^2.0.0
+  collection: ^1.15.0
+  http: ^0.13.0
   test: ^1.0.0
   webdriver: ^3.0.0
diff --git a/pkg/dds/tool/dap/codegen.dart b/pkg/dds/tool/dap/codegen.dart
new file mode 100644
index 0000000..edd064b
--- /dev/null
+++ b/pkg/dds/tool/dap/codegen.dart
@@ -0,0 +1,689 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:math';
+
+import 'package:collection/collection.dart';
+
+import 'json_schema.dart';
+import 'json_schema_extensions.dart';
+
+/// Generates Dart classes from the Debug Adapter Protocol's JSON Schema.
+class CodeGenerator {
+  /// Writes all required Dart classes for the supplied DAP [schema].
+  void writeAll(IndentableStringBuffer buffer, JsonSchema schema) {
+    _writeDefinitionClasses(buffer, schema);
+    buffer.writeln();
+    _writeBodyClasses(buffer, schema);
+    buffer.writeln();
+    _writeEventTypeLookup(buffer, schema);
+    buffer.writeln();
+    _writeCommandArgumentTypeLookup(buffer, schema);
+  }
+
+  /// Maps a name used in the DAP spec to a valid name for use in Dart.
+  ///
+  /// Reserved words like `default` will be mapped to a suitable alternative.
+  /// Prefixed underscores are removed to avoid making things private.
+  ///
+  /// Underscores between words are swapped for camelCase.
+  String _dartSafeName(String name) {
+    const improvedName = {
+      'default': 'defaultValue',
+    };
+    return improvedName[name] ??
+        // Some types are prefixed with _ in the spec but that will make them
+        // private in Dart and inaccessible to the adapter so we strip it off.
+        name
+            .replaceAll(RegExp(r'^_+'), '')
+            // Also replace any other underscores to make camelCase
+            .replaceAllMapped(
+                RegExp(r'_(.)'), (m) => m.group(1)!.toUpperCase());
+  }
+
+  /// Re-wraps [lines] at [maxLength] to help keep comments for indented code
+  /// within 80 characters.
+  Iterable<String> _wrapLines(List<String> lines, int maxLength) sync* {
+    lines = lines.map((l) => l.trimRight()).toList();
+    for (var line in lines) {
+      while (true) {
+        if (line.length <= maxLength || line.startsWith('-')) {
+          yield line;
+          break;
+        } else {
+          var lastSpace = line.lastIndexOf(' ', max(maxLength, 0));
+          // If there was no valid place to wrap, yield the whole string.
+          if (lastSpace == -1) {
+            yield line;
+            break;
+          } else {
+            yield line.substring(0, lastSpace);
+            line = line.substring(lastSpace + 1);
+          }
+        }
+      }
+    }
+  }
+
+  /// For each Response/Event class in the spec, generate a specific class to
+  /// represent its body.
+  ///
+  /// These classes are used to simplify sending responses/events from the
+  /// Debug Adapters by avoiding the need to construct the entire response/event
+  /// which requires additional fields (for example the corresponding requests
+  /// id/command and sequences):
+  ///
+  ///     this.sendResponse(FooBody(x: 1))
+  ///
+  /// instead of
+  ///
+  ///     this.sendResponse(Response(
+  ///       seq: seq++,
+  ///       request_seq: request.seq,
+  ///       command: request.command,
+  ///       body: {
+  ///         x: 1
+  ///         ...
+  ///       }
+  ///     ))
+  void _writeBodyClasses(IndentableStringBuffer buffer, JsonSchema schema) {
+    for (final entry in schema.definitions.entries.sortedBy((e) => e.key)) {
+      final name = entry.key;
+      final type = entry.value;
+      final baseType = type.baseType;
+
+      if (baseType?.refName == 'Response' || baseType?.refName == 'Event') {
+        final baseClass = baseType?.refName == 'Event'
+            ? JsonType.named(schema, 'EventBody')
+            : null;
+        final classProperties = schema.propertiesFor(type);
+        final bodyProperty = classProperties['body'];
+        var bodyPropertyProperties = bodyProperty?.properties;
+
+        _writeClass(
+          buffer,
+          bodyProperty ?? JsonType.empty(schema),
+          '${name}Body',
+          bodyPropertyProperties ?? {},
+          {},
+          baseClass,
+          null,
+        );
+      }
+    }
+  }
+
+  /// Writes a `canParse` function for a DAP spec class.
+  ///
+  /// The function checks whether an Object? is a a valid map that contains all
+  /// required fields and matches the types of the spec class.
+  ///
+  /// This is used where the spec contains union classes and we need to decide
+  /// which of the allowed types a given value is.
+  void _writeCanParseMethod(
+    IndentableStringBuffer buffer,
+    JsonType type,
+    Map<String, JsonType> properties, {
+    required String? baseTypeRefName,
+  }) {
+    buffer
+      ..writeIndentedln('static bool canParse(Object? obj) {')
+      ..indent()
+      ..writeIndentedln('if (obj is! Map<String, dynamic>) {')
+      ..indent()
+      ..writeIndentedln('return false;')
+      ..outdent()
+      ..writeIndentedln('}');
+    // In order to consider this valid for parsing, all fields that must not be
+    // undefined must be present and also type check for the correct type.
+    // Any fields that are optional but present, must still type check.
+    for (final entry in properties.entries.sortedBy((e) => e.key)) {
+      final propertyName = entry.key;
+      final propertyType = entry.value;
+      final isOptional = !type.requiresField(propertyName);
+
+      if (propertyType.isAny && isOptional) {
+        continue;
+      }
+
+      buffer.writeIndented('if (');
+      _writeTypeCheckCondition(buffer, propertyType, "obj['$propertyName']",
+          isOptional: isOptional, invert: true);
+      buffer
+        ..writeln(') {')
+        ..indent()
+        ..writeIndentedln('return false;')
+        ..outdent()
+        ..writeIndentedln('}');
+    }
+    buffer
+      ..writeIndentedln(
+        baseTypeRefName != null
+            ? 'return $baseTypeRefName.canParse(obj);'
+            : 'return true;',
+      )
+      ..outdent()
+      ..writeIndentedln('}');
+  }
+
+  /// Writes the Dart class for [type].
+  void _writeClass(
+    IndentableStringBuffer buffer,
+    JsonType type,
+    String name,
+    Map<String, JsonType> classProperties,
+    Map<String, JsonType> baseProperties,
+    JsonType? baseType,
+    JsonType? resolvedBaseType, {
+    Map<String, String> additionalValues = const {},
+  }) {
+    // Some properties are defined in both the base and the class, because the
+    // type may be narrowed, but sometimes we only want those that are defined
+    // only in this class.
+    final classOnlyProperties = {
+      for (final property in classProperties.entries)
+        if (!baseProperties.containsKey(property.key))
+          property.key: property.value,
+    };
+    _writeTypeDescription(buffer, type);
+    buffer.write('class $name ');
+    if (baseType != null) {
+      buffer.write('extends ${baseType.refName} ');
+    }
+    buffer
+      ..writeln('{')
+      ..indent();
+    for (final val in additionalValues.entries) {
+      buffer
+        ..writeIndentedln('@override')
+        ..writeIndentedln("final ${val.key} = '${val.value}';");
+    }
+    _writeFields(buffer, type, classOnlyProperties);
+    buffer.writeln();
+    _writeFromJsonStaticMethod(buffer, name);
+    buffer.writeln();
+    _writeConstructor(buffer, name, type, classProperties, baseProperties,
+        classOnlyProperties,
+        baseType: resolvedBaseType);
+    buffer.writeln();
+    _writeFromMapConstructor(buffer, name, type, classOnlyProperties,
+        callSuper: resolvedBaseType != null);
+    buffer.writeln();
+    _writeCanParseMethod(buffer, type, classProperties,
+        baseTypeRefName: baseType?.refName);
+    buffer.writeln();
+    _writeToJsonMethod(buffer, name, type, classOnlyProperties,
+        callSuper: resolvedBaseType != null);
+    buffer
+      ..outdent()
+      ..writeln('}')
+      ..writeln();
+  }
+
+  /// Write a map to look up the `command` for a given `RequestArguments` type
+  /// to simplify sending requests back to the client:
+  ///
+  ///     this.sendRequest(FooArguments(x: 1))
+  ///
+  /// instead of
+  ///
+  ///     this.sendRequest(Request(
+  ///       seq: seq++,
+  ///       command: request.command,
+  ///       arguments: {
+  ///         x: 1
+  ///         ...
+  ///       }
+  ///     ))
+  void _writeCommandArgumentTypeLookup(
+      IndentableStringBuffer buffer, JsonSchema schema) {
+    buffer
+      ..writeln('const commandTypes = {')
+      ..indent();
+    for (final entry in schema.definitions.entries.sortedBy((e) => e.key)) {
+      final type = entry.value;
+      final baseType = type.baseType;
+
+      if (baseType?.refName == 'Request') {
+        final classProperties = schema.propertiesFor(type);
+        final argumentsProperty = classProperties['arguments'];
+        final commandType = classProperties['command']?.literalValue;
+        if (argumentsProperty?.dollarRef != null && commandType != null) {
+          buffer.writeIndentedln(
+              "${argumentsProperty!.refName}: '$commandType',");
+        }
+      }
+    }
+    buffer
+      ..writeln('};')
+      ..outdent();
+  }
+
+  /// Writes a constructor for [type].
+  ///
+  /// The constructor will have named arguments for all fields, with those that
+  /// are mandatory marked with `required`.
+  void _writeConstructor(
+    IndentableStringBuffer buffer,
+    String name,
+    JsonType type,
+    Map<String, JsonType> classProperties,
+    Map<String, JsonType> baseProperties,
+    Map<String, JsonType> classOnlyProperties, {
+    required JsonType? baseType,
+  }) {
+    buffer.writeIndented('$name(');
+    if (classProperties.isNotEmpty || baseProperties.isNotEmpty) {
+      buffer
+        ..writeln('{')
+        ..indent();
+
+      // Properties for this class are written as 'this.foo'.
+      for (final entry in classOnlyProperties.entries.sortedBy((e) => e.key)) {
+        final propertyName = entry.key;
+        final fieldName = _dartSafeName(propertyName);
+        final isOptional = !type.requiresField(propertyName);
+        buffer.writeIndented('');
+        if (!isOptional) {
+          buffer.write('required ');
+        }
+        buffer.writeln('this.$fieldName, ');
+      }
+
+      // Properties from the base class are standard arguments that will be
+      // passed to a super() call.
+      for (final entry in baseProperties.entries.sortedBy((e) => e.key)) {
+        final propertyName = entry.key;
+        // If this field is defined by the class and the base, prefer the
+        // class one as it may contain things like the literal values.
+        final propertyType = classProperties[propertyName] ?? entry.value;
+
+        final fieldName = _dartSafeName(propertyName);
+        if (propertyType.literalValue != null) {
+          continue;
+        }
+        final isOptional = !type.requiresField(propertyName);
+        final dartType = propertyType.asDartType(isOptional: isOptional);
+        buffer.writeIndented('');
+        if (!isOptional) {
+          buffer.write('required ');
+        }
+        buffer.writeln('$dartType $fieldName, ');
+      }
+      buffer
+        ..outdent()
+        ..writeIndented('}');
+    }
+    buffer.write(')');
+
+    if (baseType != null) {
+      buffer.write(': super(');
+      if (baseProperties.isNotEmpty) {
+        buffer
+          ..writeln()
+          ..indent();
+        for (final entry in baseProperties.entries) {
+          final propertyName = entry.key;
+          // Skip any properties that have literal values defined by the base
+          // as we won't need to supply them.
+          if (entry.value.literalValue != null) {
+            continue;
+          }
+          // If this field is defined by the class and the base, prefer the
+          // class one as it may contain things like the literal values.
+          final propertyType = classProperties[propertyName] ?? entry.value;
+          final fieldName = _dartSafeName(propertyName);
+          final literalValue = propertyType.literalValue;
+          final value = literalValue != null ? "'$literalValue'" : fieldName;
+          buffer.writeIndentedln('$fieldName: $value, ');
+        }
+        buffer
+          ..outdent()
+          ..writeIndented('');
+      }
+      buffer.write(')');
+    }
+    buffer.writeln(';');
+  }
+
+  /// Write a class for each item in the DAP spec.
+  ///
+  /// Skips over the Request and Event sub-classes, as they are handled by the
+  /// simplified body classes written by [_writeBodyClasses]. Uses
+  /// [RequestArguments] as the base class for all argument classes.
+  void _writeDefinitionClasses(
+      IndentableStringBuffer buffer, JsonSchema schema) {
+    for (final entry in schema.definitions.entries.sortedBy((e) => e.key)) {
+      final name = entry.key;
+      final type = entry.value;
+
+      var baseType = type.baseType;
+      final resolvedBaseType =
+          baseType != null ? schema.typeFor(baseType) : null;
+      final classProperties = schema.propertiesFor(type, includeBase: false);
+      final baseProperties = resolvedBaseType != null
+          ? schema.propertiesFor(resolvedBaseType)
+          : <String, JsonType>{};
+
+      // Skip creation of Request sub-classes, as we don't use these we just
+      // pass the arguments in to the method directly.
+      if (name != 'Request' && name.endsWith('Request')) {
+        continue;
+      }
+
+      // Skip creation of Event sub-classes, as we don't use these we just
+      // pass the body in to sendEvent directly.
+      if (name != 'Event' && name.endsWith('Event')) {
+        continue;
+      }
+
+      // Create a synthetic base class for arguments to provide type safety
+      // for sending requests.
+      if (baseType == null && name.endsWith('Arguments')) {
+        baseType = JsonType.named(schema, 'RequestArguments');
+      }
+
+      _writeClass(
+        buffer,
+        type,
+        name,
+        classProperties,
+        baseProperties,
+        baseType,
+        resolvedBaseType,
+      );
+    }
+  }
+
+  /// Writes a DartDoc comment, wrapped at 80 characters taking into account
+  /// the indentation.
+  void _writeDescription(IndentableStringBuffer buffer, String? description) {
+    final maxLength = 80 - buffer.totalIndent - 4;
+    if (description != null) {
+      for (final line in _wrapLines(description.split('\n'), maxLength)) {
+        buffer.writeIndentedln('/// $line');
+      }
+    }
+  }
+
+  /// Write a map to look up the `event` for a given `EventBody` type
+  /// to simplify sending events back to the client:
+  ///
+  ///     this.sendEvent(FooEvent(x: 1))
+  ///
+  /// instead of
+  ///
+  ///     this.sendEvent(Event(
+  ///       seq: seq++,
+  ///       event: 'FooEvent',
+  ///       arguments: {
+  ///         x: 1
+  ///         ...
+  ///       }
+  ///     ))
+  void _writeEventTypeLookup(IndentableStringBuffer buffer, JsonSchema schema) {
+    buffer
+      ..writeln('const eventTypes = {')
+      ..indent();
+    for (final entry in schema.definitions.entries.sortedBy((e) => e.key)) {
+      final name = entry.key;
+      final type = entry.value;
+      final baseType = type.baseType;
+
+      if (baseType?.refName == 'Event') {
+        final classProperties = schema.propertiesFor(type);
+        final eventType = classProperties['event']!.literalValue;
+        buffer.writeIndentedln("${name}Body: '$eventType',");
+      }
+    }
+    buffer
+      ..writeln('};')
+      ..outdent();
+  }
+
+  /// Writes Dart fields for [properties], taking into account whether they are
+  /// required for [type].
+  void _writeFields(IndentableStringBuffer buffer, JsonType type,
+      Map<String, JsonType> properties) {
+    for (final entry in properties.entries.sortedBy((e) => e.key)) {
+      final propertyName = entry.key;
+      final fieldName = _dartSafeName(propertyName);
+      final propertyType = entry.value;
+      final isOptional = !type.requiresField(propertyName);
+      final dartType = propertyType.asDartType(isOptional: isOptional);
+      _writeDescription(buffer, propertyType.description);
+      buffer.writeIndentedln('final $dartType $fieldName;');
+    }
+  }
+
+  /// Writes an expression to deserialise a [valueCode].
+  ///
+  /// If [type] represents a spec type, it's `fromJson` function will be called.
+  /// If [type] is a [List], it will be mapped over this function again.
+  /// If [type] is an union, the appropriate `canParse` functions will be used to
+  ///   determine which `fromJson` function to call.
+  void _writeFromJsonExpression(
+      IndentableStringBuffer buffer, JsonType type, String valueCode,
+      {bool isOptional = false}) {
+    final dartType = type.asDartType(isOptional: isOptional);
+    final dartTypeNotNullable = type.asDartType();
+    final nullOp = isOptional ? '?' : '';
+
+    if (type.isAny || type.isSimple) {
+      buffer.write('$valueCode');
+      if (dartType != 'Object?') {
+        buffer.write(' as $dartType');
+      }
+    } else if (type.isList) {
+      buffer.write('($valueCode as List$nullOp)$nullOp.map((item) => ');
+      _writeFromJsonExpression(buffer, type.items!, 'item');
+      buffer.write(').toList()');
+    } else if (type.isUnion) {
+      final types = type.unionTypes;
+
+      // Write a check against each type, eg.:
+      // x is y ? new Either.tx(x) : (...)
+      for (var i = 0; i < types.length; i++) {
+        final isLast = i == types.length - 1;
+
+        // For the last item, if we're optional we won't wrap if in a check, as
+        // the constructor will only be called if canParse() returned true, so
+        // it'll the only remaining option.
+        if (!isLast || isOptional) {
+          _writeTypeCheckCondition(buffer, types[i], valueCode,
+              isOptional: false);
+          buffer.write(' ? ');
+        }
+        buffer.write('$dartTypeNotNullable.t${i + 1}(');
+        _writeFromJsonExpression(buffer, types[i], valueCode);
+        buffer.write(')');
+
+        if (!isLast) {
+          buffer.write(' : ');
+        } else if (isLast && isOptional) {
+          buffer.write(' : null');
+        }
+      }
+    } else if (type.isSpecType) {
+      if (isOptional) {
+        buffer.write('$valueCode == null ? null : ');
+      }
+      buffer.write(
+          '$dartTypeNotNullable.fromJson($valueCode as Map<String, Object?>)');
+    } else {
+      throw 'Unable to type check $valueCode against $type';
+    }
+  }
+
+  /// Writes a static `fromJson` method that converts an object into a spec type
+  /// by calling its fromMap constructor.
+  ///
+  /// This is a helper method used as a tear-off since the constructor cannot be.
+  void _writeFromJsonStaticMethod(
+    IndentableStringBuffer buffer,
+    String name,
+  ) =>
+      buffer.writeIndentedln(
+          'static $name fromJson(Map<String, Object?> obj) => $name.fromMap(obj);');
+
+  /// Writes a fromMap constructor to construct an object from a JSON map.
+  void _writeFromMapConstructor(
+    IndentableStringBuffer buffer,
+    String name,
+    JsonType type,
+    Map<String, JsonType> properties, {
+    bool callSuper = false,
+  }) {
+    buffer.writeIndented('$name.fromMap(Map<String, Object?> obj)');
+    if (properties.isNotEmpty || callSuper) {
+      buffer
+        ..writeln(':')
+        ..indent();
+      var isFirst = true;
+      for (final entry in properties.entries.sortedBy((e) => e.key)) {
+        if (isFirst) {
+          isFirst = false;
+        } else {
+          buffer.writeln(',');
+        }
+
+        final propertyName = entry.key;
+        final fieldName = _dartSafeName(propertyName);
+        final propertyType = entry.value;
+        final isOptional = !type.requiresField(propertyName);
+
+        buffer.writeIndented('$fieldName = ');
+        _writeFromJsonExpression(buffer, propertyType, "obj['$propertyName']",
+            isOptional: isOptional);
+      }
+      if (callSuper) {
+        if (!isFirst) {
+          buffer.writeln(',');
+        }
+        buffer.writeIndented('super.fromMap(obj)');
+      }
+      buffer.outdent();
+    }
+    buffer.writeln(';');
+  }
+
+  /// Writes a toJson method to construct a JSON map for this class, recursively
+  /// calling through base classes.
+  void _writeToJsonMethod(
+    IndentableStringBuffer buffer,
+    String name,
+    JsonType type,
+    Map<String, JsonType> properties, {
+    bool callSuper = false,
+  }) {
+    if (callSuper) {
+      buffer.writeIndentedln('@override');
+    }
+    buffer
+      ..writeIndentedln('Map<String, Object?> toJson() => {')
+      ..indent();
+    if (callSuper) {
+      buffer.writeIndentedln('...super.toJson(),');
+    }
+    for (final entry in properties.entries.sortedBy((e) => e.key)) {
+      final propertyName = entry.key;
+      final fieldName = _dartSafeName(propertyName);
+      final isOptional = !type.requiresField(propertyName);
+      buffer.writeIndented('');
+      if (isOptional) {
+        buffer.write('if ($fieldName != null) ');
+      }
+      buffer.writeln("'$propertyName': $fieldName, ");
+    }
+    buffer
+      ..outdent()
+      ..writeIndentedln('};');
+  }
+
+  /// Writes an expression that checks whether [valueCode] represents a [type].
+  void _writeTypeCheckCondition(
+      IndentableStringBuffer buffer, JsonType type, String valueCode,
+      {required bool isOptional, bool invert = false}) {
+    final dartType = type.asDartType(isOptional: isOptional);
+
+    // When the expression is inverted, invert the operators so the generated
+    // code is easier to read.
+    final opBang = invert ? '!' : '';
+    final opTrue = invert ? 'false' : 'true';
+    final opIs = invert ? 'is!' : 'is';
+    final opEquals = invert ? '!=' : '==';
+    final opAnd = invert ? '||' : '&&';
+    final opOr = invert ? '&&' : '||';
+    final opEvery = invert ? 'any' : 'every';
+
+    if (type.isAny) {
+      buffer.write(opTrue);
+    } else if (dartType == 'Null') {
+      buffer.write('$valueCode $opEquals null');
+    } else if (type.isSimple) {
+      buffer.write('$valueCode $opIs $dartType');
+    } else if (type.isList) {
+      buffer.write('($valueCode $opIs List');
+      buffer.write(' $opAnd ($valueCode.$opEvery((item) => ');
+      _writeTypeCheckCondition(buffer, type.items!, 'item',
+          isOptional: false, invert: invert);
+      buffer.write('))');
+      buffer.write(')');
+    } else if (type.isUnion) {
+      final types = type.unionTypes;
+      // To type check a union, we recursively check against each of its types.
+      buffer.write('(');
+      for (var i = 0; i < types.length; i++) {
+        if (i != 0) {
+          buffer.write(' $opOr ');
+        }
+        _writeTypeCheckCondition(buffer, types[i], valueCode,
+            isOptional: false, invert: invert);
+      }
+      if (isOptional) {
+        buffer.write(' $opOr $valueCode $opEquals null');
+      }
+      buffer.write(')');
+    } else if (type.isSpecType) {
+      buffer.write('$opBang$dartType.canParse($valueCode)');
+    } else {
+      throw 'Unable to type check $valueCode against $type';
+    }
+  }
+
+  /// Writes the description for [type], looking at the base type from the
+  /// DAP spec if necessary.
+  void _writeTypeDescription(IndentableStringBuffer buffer, JsonType type) {
+    // In the DAP spec, many of the descriptions are on one of the allOf types
+    // rather than the type itself.
+    final description = type.description ??
+        type.allOf
+            ?.firstWhereOrNull((element) => element.description != null)
+            ?.description;
+
+    _writeDescription(buffer, description);
+  }
+}
+
+/// A [StringBuffer] with support for indenting.
+class IndentableStringBuffer extends StringBuffer {
+  int _indentLevel = 0;
+  final int _indentSpaces = 2;
+
+  int get totalIndent => _indentLevel * _indentSpaces;
+  String get _indentString => ' ' * totalIndent;
+
+  void indent() => _indentLevel++;
+  void outdent() => _indentLevel--;
+
+  void writeIndented(Object obj) {
+    write(_indentString);
+    write(obj);
+  }
+
+  void writeIndentedln(Object obj) {
+    write(_indentString);
+    writeln(obj);
+  }
+}
diff --git a/pkg/dds/tool/dap/external_dap_spec/debugAdapterProtocol.json b/pkg/dds/tool/dap/external_dap_spec/debugAdapterProtocol.json
new file mode 100644
index 0000000..df4f9ad
--- /dev/null
+++ b/pkg/dds/tool/dap/external_dap_spec/debugAdapterProtocol.json
@@ -0,0 +1,3947 @@
+{
+	"$schema": "http://json-schema.org/draft-04/schema#",
+	"title": "Debug Adapter Protocol",
+	"description": "The Debug Adapter Protocol defines the protocol used between an editor or IDE and a debugger or runtime.",
+	"type": "object",
+
+
+	"definitions": {
+
+		"ProtocolMessage": {
+			"type": "object",
+			"title": "Base Protocol",
+			"description": "Base class of requests, responses, and events.",
+			"properties": {
+				"seq": {
+					"type": "integer",
+					"description": "Sequence number (also known as message ID). For protocol messages of type 'request' this ID can be used to cancel the request."
+				},
+				"type": {
+					"type": "string",
+					"description": "Message type.",
+					"_enum": [ "request", "response", "event" ]
+				}
+			},
+			"required": [ "seq", "type" ]
+		},
+
+		"Request": {
+			"allOf": [ { "$ref": "#/definitions/ProtocolMessage" }, {
+				"type": "object",
+				"description": "A client or debug adapter initiated request.",
+				"properties": {
+					"type": {
+						"type": "string",
+						"enum": [ "request" ]
+					},
+					"command": {
+						"type": "string",
+						"description": "The command to execute."
+					},
+					"arguments": {
+						"type": [ "array", "boolean", "integer", "null", "number" , "object", "string" ],
+						"description": "Object containing arguments for the command."
+					}
+				},
+				"required": [ "type", "command" ]
+			}]
+		},
+
+		"Event": {
+			"allOf": [ { "$ref": "#/definitions/ProtocolMessage" }, {
+				"type": "object",
+				"description": "A debug adapter initiated event.",
+				"properties": {
+					"type": {
+						"type": "string",
+						"enum": [ "event" ]
+					},
+					"event": {
+						"type": "string",
+						"description": "Type of event."
+					},
+					"body": {
+						"type": [ "array", "boolean", "integer", "null", "number" , "object", "string" ],
+						"description": "Event-specific information."
+					}
+				},
+				"required": [ "type", "event" ]
+			}]
+		},
+
+		"Response": {
+			"allOf": [ { "$ref": "#/definitions/ProtocolMessage" }, {
+				"type": "object",
+				"description": "Response for a request.",
+				"properties": {
+					"type": {
+						"type": "string",
+						"enum": [ "response" ]
+					},
+					"request_seq": {
+						"type": "integer",
+						"description": "Sequence number of the corresponding request."
+					},
+					"success": {
+						"type": "boolean",
+						"description": "Outcome of the request.\nIf true, the request was successful and the 'body' attribute may contain the result of the request.\nIf the value is false, the attribute 'message' contains the error in short form and the 'body' may contain additional information (see 'ErrorResponse.body.error')."
+					},
+					"command": {
+						"type": "string",
+						"description": "The command requested."
+					},
+					"message": {
+						"type": "string",
+						"description": "Contains the raw error in short form if 'success' is false.\nThis raw error might be interpreted by the frontend and is not shown in the UI.\nSome predefined values exist.",
+						"_enum": [ "cancelled" ],
+						"enumDescriptions": [
+							"request was cancelled."
+						]
+					},
+					"body": {
+						"type": [ "array", "boolean", "integer", "null", "number" , "object", "string" ],
+						"description": "Contains request result if success is true and optional error details if success is false."
+					}
+				},
+				"required": [ "type", "request_seq", "success", "command" ]
+			}]
+		},
+
+		"ErrorResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "On error (whenever 'success' is false), the body can provide more details.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"error": {
+								"$ref": "#/definitions/Message",
+								"description": "An optional, structured error message."
+							}
+						}
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"CancelRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "The 'cancel' request is used by the frontend in two situations:\n- to indicate that it is no longer interested in the result produced by a specific request issued earlier\n- to cancel a progress sequence. Clients should only call this request if the capability 'supportsCancelRequest' is true.\nThis request has a hint characteristic: a debug adapter can only be expected to make a 'best effort' in honouring this request but there are no guarantees.\nThe 'cancel' request may return an error if it could not cancel an operation but a frontend should refrain from presenting this error to end users.\nA frontend client should only call this request if the capability 'supportsCancelRequest' is true.\nThe request that got canceled still needs to send a response back. This can either be a normal result ('success' attribute true)\nor an error response ('success' attribute false and the 'message' set to 'cancelled').\nReturning partial results from a cancelled request is possible but please note that a frontend client has no generic way for detecting that a response is partial or not.\n The progress that got cancelled still needs to send a 'progressEnd' event back.\n A client should not assume that progress just got cancelled after sending the 'cancel' request.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "cancel" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/CancelArguments"
+					}
+				},
+				"required": [ "command" ]
+			}]
+		},
+		"CancelArguments": {
+			"type": "object",
+			"description": "Arguments for 'cancel' request.",
+			"properties": {
+				"requestId": {
+					"type": "integer",
+					"description": "The ID (attribute 'seq') of the request to cancel. If missing no request is cancelled.\nBoth a 'requestId' and a 'progressId' can be specified in one request."
+				},
+				"progressId": {
+					"type": "string",
+					"description": "The ID (attribute 'progressId') of the progress to cancel. If missing no progress is cancelled.\nBoth a 'requestId' and a 'progressId' can be specified in one request."
+				}
+			}
+		},
+		"CancelResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'cancel' request. This is just an acknowledgement, so no body field is required."
+			}]
+		},
+
+		"InitializedEvent": {
+			"allOf": [ { "$ref": "#/definitions/Event" }, {
+				"type": "object",
+				"title": "Events",
+				"description": "This event indicates that the debug adapter is ready to accept configuration requests (e.g. SetBreakpointsRequest, SetExceptionBreakpointsRequest).\nA debug adapter is expected to send this event when it is ready to accept configuration requests (but not before the 'initialize' request has finished).\nThe sequence of events/requests is as follows:\n- adapters sends 'initialized' event (after the 'initialize' request has returned)\n- frontend sends zero or more 'setBreakpoints' requests\n- frontend sends one 'setFunctionBreakpoints' request (if capability 'supportsFunctionBreakpoints' is true)\n- frontend sends a 'setExceptionBreakpoints' request if one or more 'exceptionBreakpointFilters' have been defined (or if 'supportsConfigurationDoneRequest' is not defined or false)\n- frontend sends other future configuration requests\n- frontend sends one 'configurationDone' request to indicate the end of the configuration.",
+				"properties": {
+					"event": {
+						"type": "string",
+						"enum": [ "initialized" ]
+					}
+				},
+				"required": [ "event" ]
+			}]
+		},
+
+		"StoppedEvent": {
+			"allOf": [ { "$ref": "#/definitions/Event" }, {
+				"type": "object",
+				"description": "The event indicates that the execution of the debuggee has stopped due to some condition.\nThis can be caused by a break point previously set, a stepping request has completed, by executing a debugger statement etc.",
+				"properties": {
+					"event": {
+						"type": "string",
+						"enum": [ "stopped" ]
+					},
+					"body": {
+						"type": "object",
+						"properties": {
+							"reason": {
+								"type": "string",
+								"description": "The reason for the event.\nFor backward compatibility this string is shown in the UI if the 'description' attribute is missing (but it must not be translated).",
+								"_enum": [ "step", "breakpoint", "exception", "pause", "entry", "goto", "function breakpoint", "data breakpoint", "instruction breakpoint" ]
+							},
+							"description": {
+								"type": "string",
+								"description": "The full reason for the event, e.g. 'Paused on exception'. This string is shown in the UI as is and must be translated."
+							},
+							"threadId": {
+								"type": "integer",
+								"description": "The thread which was stopped."
+							},
+							"preserveFocusHint": {
+								"type": "boolean",
+								"description": "A value of true hints to the frontend that this event should not change the focus."
+							},
+							"text": {
+								"type": "string",
+								"description": "Additional information. E.g. if reason is 'exception', text contains the exception name. This string is shown in the UI."
+							},
+							"allThreadsStopped": {
+								"type": "boolean",
+								"description": "If 'allThreadsStopped' is true, a debug adapter can announce that all threads have stopped.\n- The client should use this information to enable that all threads can be expanded to access their stacktraces.\n- If the attribute is missing or false, only the thread with the given threadId can be expanded."
+							},
+							"hitBreakpointIds": {
+								"type": "array",
+								"items": {
+									"type": "integer"
+								},
+								"description": "Ids of the breakpoints that triggered the event. In most cases there will be only a single breakpoint but here are some examples for multiple breakpoints:\n- Different types of breakpoints map to the same location.\n- Multiple source breakpoints get collapsed to the same instruction by the compiler/runtime.\n- Multiple function breakpoints with different function names map to the same location."
+							}
+						},
+						"required": [ "reason" ]
+					}
+				},
+				"required": [ "event", "body" ]
+			}]
+		},
+
+		"ContinuedEvent": {
+			"allOf": [ { "$ref": "#/definitions/Event" }, {
+				"type": "object",
+				"description": "The event indicates that the execution of the debuggee has continued.\nPlease note: a debug adapter is not expected to send this event in response to a request that implies that execution continues, e.g. 'launch' or 'continue'.\nIt is only necessary to send a 'continued' event if there was no previous request that implied this.",
+				"properties": {
+					"event": {
+						"type": "string",
+						"enum": [ "continued" ]
+					},
+					"body": {
+						"type": "object",
+						"properties": {
+							"threadId": {
+								"type": "integer",
+								"description": "The thread which was continued."
+							},
+							"allThreadsContinued": {
+								"type": "boolean",
+								"description": "If 'allThreadsContinued' is true, a debug adapter can announce that all threads have continued."
+							}
+						},
+						"required": [ "threadId" ]
+					}
+				},
+				"required": [ "event", "body" ]
+			}]
+		},
+
+		"ExitedEvent": {
+			"allOf": [ { "$ref": "#/definitions/Event" }, {
+				"type": "object",
+				"description": "The event indicates that the debuggee has exited and returns its exit code.",
+				"properties": {
+					"event": {
+						"type": "string",
+						"enum": [ "exited" ]
+					},
+					"body": {
+						"type": "object",
+						"properties": {
+							"exitCode": {
+								"type": "integer",
+								"description": "The exit code returned from the debuggee."
+							}
+						},
+						"required": [ "exitCode" ]
+					}
+				},
+				"required": [ "event", "body" ]
+			}]
+		},
+
+		"TerminatedEvent": {
+			"allOf": [ { "$ref": "#/definitions/Event" }, {
+				"type": "object",
+				"description": "The event indicates that debugging of the debuggee has terminated. This does **not** mean that the debuggee itself has exited.",
+				"properties": {
+					"event": {
+						"type": "string",
+						"enum": [ "terminated" ]
+					},
+					"body": {
+						"type": "object",
+						"properties": {
+							"restart": {
+								"type": [ "array", "boolean", "integer", "null", "number", "object", "string" ],
+								"description": "A debug adapter may set 'restart' to true (or to an arbitrary object) to request that the front end restarts the session.\nThe value is not interpreted by the client and passed unmodified as an attribute '__restart' to the 'launch' and 'attach' requests."
+							}
+						}
+					}
+				},
+				"required": [ "event" ]
+			}]
+		},
+
+		"ThreadEvent": {
+			"allOf": [ { "$ref": "#/definitions/Event" }, {
+				"type": "object",
+				"description": "The event indicates that a thread has started or exited.",
+				"properties": {
+					"event": {
+						"type": "string",
+						"enum": [ "thread" ]
+					},
+					"body": {
+						"type": "object",
+						"properties": {
+							"reason": {
+								"type": "string",
+								"description": "The reason for the event.",
+								"_enum": [ "started", "exited" ]
+							},
+							"threadId": {
+								"type": "integer",
+								"description": "The identifier of the thread."
+							}
+						},
+						"required": ["reason", "threadId"]
+					}
+				},
+				"required": [ "event", "body" ]
+			}]
+		},
+
+		"OutputEvent": {
+			"allOf": [ { "$ref": "#/definitions/Event" }, {
+				"type": "object",
+				"description": "The event indicates that the target has produced some output.",
+				"properties": {
+					"event": {
+						"type": "string",
+						"enum": [ "output" ]
+					},
+					"body": {
+						"type": "object",
+						"properties": {
+							"category": {
+								"type": "string",
+								"description": "The output category. If not specified, 'console' is assumed.",
+								"_enum": [ "console", "stdout", "stderr", "telemetry" ]
+							},
+							"output": {
+								"type": "string",
+								"description": "The output to report."
+							},
+							"group": {
+								"type": "string",
+								"description": "Support for keeping an output log organized by grouping related messages.",
+								"enum": [ "start", "startCollapsed", "end" ],
+								"enumDescriptions": [
+									"Start a new group in expanded mode. Subsequent output events are members of the group and should be shown indented.\nThe 'output' attribute becomes the name of the group and is not indented.",
+									"Start a new group in collapsed mode. Subsequent output events are members of the group and should be shown indented (as soon as the group is expanded).\nThe 'output' attribute becomes the name of the group and is not indented.",
+									"End the current group and decreases the indentation of subsequent output events.\nA non empty 'output' attribute is shown as the unindented end of the group."
+								]
+							},
+							"variablesReference": {
+								"type": "integer",
+								"description": "If an attribute 'variablesReference' exists and its value is > 0, the output contains objects which can be retrieved by passing 'variablesReference' to the 'variables' request. The value should be less than or equal to 2147483647 (2^31-1)."
+							},
+							"source": {
+								"$ref": "#/definitions/Source",
+								"description": "An optional source location where the output was produced."
+							},
+							"line": {
+								"type": "integer",
+								"description": "An optional source location line where the output was produced."
+							},
+							"column": {
+								"type": "integer",
+								"description": "An optional source location column where the output was produced."
+							},
+							"data": {
+								"type": [ "array", "boolean", "integer", "null", "number" , "object", "string" ],
+								"description": "Optional data to report. For the 'telemetry' category the data will be sent to telemetry, for the other categories the data is shown in JSON format."
+							}
+						},
+						"required": ["output"]
+					}
+				},
+				"required": [ "event", "body" ]
+			}]
+		},
+
+		"BreakpointEvent": {
+			"allOf": [ { "$ref": "#/definitions/Event" }, {
+				"type": "object",
+				"description": "The event indicates that some information about a breakpoint has changed.",
+				"properties": {
+					"event": {
+						"type": "string",
+						"enum": [ "breakpoint" ]
+					},
+					"body": {
+						"type": "object",
+						"properties": {
+							"reason": {
+								"type": "string",
+								"description": "The reason for the event.",
+								"_enum": [ "changed", "new", "removed" ]
+							},
+							"breakpoint": {
+								"$ref": "#/definitions/Breakpoint",
+								"description": "The 'id' attribute is used to find the target breakpoint and the other attributes are used as the new values."
+							}
+						},
+						"required": [ "reason", "breakpoint" ]
+					}
+				},
+				"required": [ "event", "body" ]
+			}]
+		},
+
+		"ModuleEvent": {
+			"allOf": [ { "$ref": "#/definitions/Event" }, {
+				"type": "object",
+				"description": "The event indicates that some information about a module has changed.",
+				"properties": {
+					"event": {
+						"type": "string",
+						"enum": [ "module" ]
+					},
+					"body": {
+						"type": "object",
+						"properties": {
+							"reason": {
+								"type": "string",
+								"description": "The reason for the event.",
+								"enum": [ "new", "changed", "removed" ]
+							},
+							"module": {
+								"$ref": "#/definitions/Module",
+								"description": "The new, changed, or removed module. In case of 'removed' only the module id is used."
+							}
+						},
+						"required": [ "reason", "module" ]
+					}
+				},
+				"required": [ "event", "body" ]
+			}]
+		},
+
+		"LoadedSourceEvent": {
+			"allOf": [ { "$ref": "#/definitions/Event" }, {
+				"type": "object",
+				"description": "The event indicates that some source has been added, changed, or removed from the set of all loaded sources.",
+				"properties": {
+					"event": {
+						"type": "string",
+						"enum": [ "loadedSource" ]
+					},
+					"body": {
+						"type": "object",
+						"properties": {
+							"reason": {
+								"type": "string",
+								"description": "The reason for the event.",
+								"enum": [ "new", "changed", "removed" ]
+							},
+							"source": {
+								"$ref": "#/definitions/Source",
+								"description": "The new, changed, or removed source."
+							}
+						},
+						"required": [ "reason", "source" ]
+					}
+				},
+				"required": [ "event", "body" ]
+			}]
+		},
+
+		"ProcessEvent": {
+			"allOf": [
+				{ "$ref": "#/definitions/Event" },
+				{
+					"type": "object",
+					"description": "The event indicates that the debugger has begun debugging a new process. Either one that it has launched, or one that it has attached to.",
+					"properties": {
+						"event": {
+							"type": "string",
+							"enum": [ "process" ]
+						},
+						"body": {
+							"type": "object",
+							"properties": {
+								"name": {
+									"type": "string",
+									"description": "The logical name of the process. This is usually the full path to process's executable file. Example: /home/example/myproj/program.js."
+								},
+								"systemProcessId": {
+									"type": "integer",
+									"description": "The system process id of the debugged process. This property will be missing for non-system processes."
+								},
+								"isLocalProcess": {
+									"type": "boolean",
+									"description": "If true, the process is running on the same computer as the debug adapter."
+								},
+								"startMethod": {
+									"type": "string",
+									"enum": [ "launch", "attach", "attachForSuspendedLaunch" ],
+									"description": "Describes how the debug engine started debugging this process.",
+									"enumDescriptions": [
+										"Process was launched under the debugger.",
+										"Debugger attached to an existing process.",
+										"A project launcher component has launched a new process in a suspended state and then asked the debugger to attach."
+									]
+								},
+								"pointerSize": {
+									"type": "integer",
+									"description": "The size of a pointer or address for this process, in bits. This value may be used by clients when formatting addresses for display."
+								}
+							},
+							"required": [ "name" ]
+						}
+					},
+					"required": [ "event", "body" ]
+				}
+			]
+		},
+
+		"CapabilitiesEvent": {
+			"allOf": [ { "$ref": "#/definitions/Event" }, {
+				"type": "object",
+				"description": "The event indicates that one or more capabilities have changed.\nSince the capabilities are dependent on the frontend and its UI, it might not be possible to change that at random times (or too late).\nConsequently this event has a hint characteristic: a frontend can only be expected to make a 'best effort' in honouring individual capabilities but there are no guarantees.\nOnly changed capabilities need to be included, all other capabilities keep their values.",
+				"properties": {
+					"event": {
+						"type": "string",
+						"enum": [ "capabilities" ]
+					},
+					"body": {
+						"type": "object",
+						"properties": {
+							"capabilities": {
+								"$ref": "#/definitions/Capabilities",
+								"description": "The set of updated capabilities."
+							}
+						},
+						"required": [ "capabilities" ]
+					}
+				},
+				"required": [ "event", "body" ]
+			}]
+		},
+
+		"ProgressStartEvent": {
+			"allOf": [ { "$ref": "#/definitions/Event" }, {
+				"type": "object",
+				"description": "The event signals that a long running operation is about to start and\nprovides additional information for the client to set up a corresponding progress and cancellation UI.\nThe client is free to delay the showing of the UI in order to reduce flicker.\nThis event should only be sent if the client has passed the value true for the 'supportsProgressReporting' capability of the 'initialize' request.",
+				"properties": {
+					"event": {
+						"type": "string",
+						"enum": [ "progressStart" ]
+					},
+					"body": {
+						"type": "object",
+						"properties": {
+							"progressId": {
+								"type": "string",
+								"description": "An ID that must be used in subsequent 'progressUpdate' and 'progressEnd' events to make them refer to the same progress reporting.\nIDs must be unique within a debug session."
+							},
+							"title": {
+								"type": "string",
+								"description": "Mandatory (short) title of the progress reporting. Shown in the UI to describe the long running operation."
+							},
+							"requestId": {
+								"type": "integer",
+								"description": "The request ID that this progress report is related to. If specified a debug adapter is expected to emit\nprogress events for the long running request until the request has been either completed or cancelled.\nIf the request ID is omitted, the progress report is assumed to be related to some general activity of the debug adapter."
+							},
+							"cancellable": {
+								"type": "boolean",
+								"description": "If true, the request that reports progress may be canceled with a 'cancel' request.\nSo this property basically controls whether the client should use UX that supports cancellation.\nClients that don't support cancellation are allowed to ignore the setting."
+							},
+							"message": {
+								"type": "string",
+								"description": "Optional, more detailed progress message."
+							},
+							"percentage": {
+								"type": "number",
+								"description": "Optional progress percentage to display (value range: 0 to 100). If omitted no percentage will be shown."
+							}
+						},
+						"required": [ "progressId", "title" ]
+					}
+				},
+				"required": [ "event", "body" ]
+			}]
+		},
+
+		"ProgressUpdateEvent": {
+			"allOf": [ { "$ref": "#/definitions/Event" }, {
+				"type": "object",
+				"description": "The event signals that the progress reporting needs to updated with a new message and/or percentage.\nThe client does not have to update the UI immediately, but the clients needs to keep track of the message and/or percentage values.\nThis event should only be sent if the client has passed the value true for the 'supportsProgressReporting' capability of the 'initialize' request.",
+				"properties": {
+					"event": {
+						"type": "string",
+						"enum": [ "progressUpdate" ]
+					},
+					"body": {
+						"type": "object",
+						"properties": {
+							"progressId": {
+								"type": "string",
+								"description": "The ID that was introduced in the initial 'progressStart' event."
+							},
+							"message": {
+								"type": "string",
+								"description": "Optional, more detailed progress message. If omitted, the previous message (if any) is used."
+							},
+							"percentage": {
+								"type": "number",
+								"description": "Optional progress percentage to display (value range: 0 to 100). If omitted no percentage will be shown."
+							}
+						},
+						"required": [ "progressId" ]
+					}
+				},
+				"required": [ "event", "body" ]
+			}]
+		},
+
+		"ProgressEndEvent": {
+			"allOf": [ { "$ref": "#/definitions/Event" }, {
+				"type": "object",
+				"description": "The event signals the end of the progress reporting with an optional final message.\nThis event should only be sent if the client has passed the value true for the 'supportsProgressReporting' capability of the 'initialize' request.",
+				"properties": {
+					"event": {
+						"type": "string",
+						"enum": [ "progressEnd" ]
+					},
+					"body": {
+						"type": "object",
+						"properties": {
+							"progressId": {
+								"type": "string",
+								"description": "The ID that was introduced in the initial 'ProgressStartEvent'."
+							},
+							"message": {
+								"type": "string",
+								"description": "Optional, more detailed progress message. If omitted, the previous message (if any) is used."
+							}
+						},
+						"required": [ "progressId" ]
+					}
+				},
+				"required": [ "event", "body" ]
+			}]
+		},
+
+		"InvalidatedEvent": {
+			"allOf": [ { "$ref": "#/definitions/Event" }, {
+				"type": "object",
+				"description": "This event signals that some state in the debug adapter has changed and requires that the client needs to re-render the data snapshot previously requested.\nDebug adapters do not have to emit this event for runtime changes like stopped or thread events because in that case the client refetches the new state anyway. But the event can be used for example to refresh the UI after rendering formatting has changed in the debug adapter.\nThis event should only be sent if the debug adapter has received a value true for the 'supportsInvalidatedEvent' capability of the 'initialize' request.",
+				"properties": {
+					"event": {
+						"type": "string",
+						"enum": [ "invalidated" ]
+					},
+					"body": {
+						"type": "object",
+						"properties": {
+							"areas": {
+								"type": "array",
+								"description": "Optional set of logical areas that got invalidated. This property has a hint characteristic: a client can only be expected to make a 'best effort' in honouring the areas but there are no guarantees. If this property is missing, empty, or if values are not understand the client should assume a single value 'all'.",
+								"items": {
+									"$ref": "#/definitions/InvalidatedAreas"
+								}
+							},
+							"threadId": {
+								"type": "integer",
+								"description": "If specified, the client only needs to refetch data related to this thread."
+							},
+							"stackFrameId": {
+								"type": "integer",
+								"description": "If specified, the client only needs to refetch data related to this stack frame (and the 'threadId' is ignored)."
+							}
+						}
+					}
+				},
+				"required": [ "event", "body" ]
+			}]
+		},
+
+		"RunInTerminalRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"title": "Reverse Requests",
+				"description": "This optional request is sent from the debug adapter to the client to run a command in a terminal.\nThis is typically used to launch the debuggee in a terminal provided by the client.\nThis request should only be called if the client has passed the value true for the 'supportsRunInTerminalRequest' capability of the 'initialize' request.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "runInTerminal" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/RunInTerminalRequestArguments"
+					}
+				},
+				"required": [ "command", "arguments" ]
+			}]
+		},
+		"RunInTerminalRequestArguments": {
+			"type": "object",
+			"description": "Arguments for 'runInTerminal' request.",
+			"properties": {
+				"kind": {
+					"type": "string",
+					"enum": [ "integrated", "external" ],
+					"description": "What kind of terminal to launch."
+				},
+				"title": {
+					"type": "string",
+					"description": "Optional title of the terminal."
+				},
+				"cwd": {
+					"type": "string",
+					"description": "Working directory for the command. For non-empty, valid paths this typically results in execution of a change directory command."
+				},
+				"args": {
+					"type": "array",
+					"items": {
+						"type": "string"
+					},
+					"description": "List of arguments. The first argument is the command to run."
+				},
+				"env": {
+					"type": "object",
+					"description": "Environment key-value pairs that are added to or removed from the default environment.",
+					"additionalProperties": {
+						"type": [ "string", "null" ],
+						"description": "Proper values must be strings. A value of 'null' removes the variable from the environment."
+					}
+				}
+			},
+			"required": [ "args", "cwd" ]
+		},
+		"RunInTerminalResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'runInTerminal' request.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"processId": {
+								"type": "integer",
+								"description": "The process ID. The value should be less than or equal to 2147483647 (2^31-1)."
+							},
+							"shellProcessId": {
+								"type": "integer",
+								"description": "The process ID of the terminal shell. The value should be less than or equal to 2147483647 (2^31-1)."
+							}
+						}
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"InitializeRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"title": "Requests",
+				"description": "The 'initialize' request is sent as the first request from the client to the debug adapter\nin order to configure it with client capabilities and to retrieve capabilities from the debug adapter.\nUntil the debug adapter has responded to with an 'initialize' response, the client must not send any additional requests or events to the debug adapter.\nIn addition the debug adapter is not allowed to send any requests or events to the client until it has responded with an 'initialize' response.\nThe 'initialize' request may only be sent once.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "initialize" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/InitializeRequestArguments"
+					}
+				},
+				"required": [ "command", "arguments" ]
+			}]
+		},
+		"InitializeRequestArguments": {
+			"type": "object",
+			"description": "Arguments for 'initialize' request.",
+			"properties": {
+				"clientID": {
+					"type": "string",
+					"description": "The ID of the (frontend) client using this adapter."
+				},
+				"clientName": {
+					"type": "string",
+					"description": "The human readable name of the (frontend) client using this adapter."
+				},
+				"adapterID": {
+					"type": "string",
+					"description": "The ID of the debug adapter."
+				},
+				"locale": {
+					"type": "string",
+					"description": "The ISO-639 locale of the (frontend) client using this adapter, e.g. en-US or de-CH."
+				},
+				"linesStartAt1": {
+					"type": "boolean",
+					"description": "If true all line numbers are 1-based (default)."
+				},
+				"columnsStartAt1": {
+					"type": "boolean",
+					"description": "If true all column numbers are 1-based (default)."
+				},
+				"pathFormat": {
+					"type": "string",
+					"_enum": [ "path", "uri" ],
+					"description": "Determines in what format paths are specified. The default is 'path', which is the native format."
+				},
+				"supportsVariableType": {
+					"type": "boolean",
+					"description": "Client supports the optional type attribute for variables."
+				},
+				"supportsVariablePaging": {
+					"type": "boolean",
+					"description": "Client supports the paging of variables."
+				},
+				"supportsRunInTerminalRequest": {
+					"type": "boolean",
+					"description": "Client supports the runInTerminal request."
+				},
+				"supportsMemoryReferences": {
+					"type": "boolean",
+					"description": "Client supports memory references."
+				},
+				"supportsProgressReporting": {
+					"type": "boolean",
+					"description": "Client supports progress reporting."
+				},
+				"supportsInvalidatedEvent": {
+					"type": "boolean",
+					"description": "Client supports the invalidated event."
+				}
+			},
+			"required": [ "adapterID" ]
+		},
+		"InitializeResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'initialize' request.",
+				"properties": {
+					"body": {
+						"$ref": "#/definitions/Capabilities",
+						"description": "The capabilities of this debug adapter."
+					}
+				}
+			}]
+		},
+
+		"ConfigurationDoneRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "This optional request indicates that the client has finished initialization of the debug adapter.\nSo it is the last request in the sequence of configuration requests (which was started by the 'initialized' event).\nClients should only call this request if the capability 'supportsConfigurationDoneRequest' is true.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "configurationDone" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/ConfigurationDoneArguments"
+					}
+				},
+				"required": [ "command" ]
+			}]
+		},
+		"ConfigurationDoneArguments": {
+			"type": "object",
+			"description": "Arguments for 'configurationDone' request."
+		},
+		"ConfigurationDoneResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'configurationDone' request. This is just an acknowledgement, so no body field is required."
+			}]
+		},
+
+		"LaunchRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "This launch request is sent from the client to the debug adapter to start the debuggee with or without debugging (if 'noDebug' is true).\nSince launching is debugger/runtime specific, the arguments for this request are not part of this specification.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "launch" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/LaunchRequestArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"LaunchRequestArguments": {
+			"type": "object",
+			"description": "Arguments for 'launch' request. Additional attributes are implementation specific.",
+			"properties": {
+				"noDebug": {
+					"type": "boolean",
+					"description": "If noDebug is true the launch request should launch the program without enabling debugging."
+				},
+				"__restart": {
+					"type": [ "array", "boolean", "integer", "null", "number", "object", "string" ],
+					"description": "Optional data from the previous, restarted session.\nThe data is sent as the 'restart' attribute of the 'terminated' event.\nThe client should leave the data intact."
+				}
+			}
+		},
+		"LaunchResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'launch' request. This is just an acknowledgement, so no body field is required."
+			}]
+		},
+
+		"AttachRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "The attach request is sent from the client to the debug adapter to attach to a debuggee that is already running.\nSince attaching is debugger/runtime specific, the arguments for this request are not part of this specification.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "attach" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/AttachRequestArguments"
+					}
+				},
+				"required": [ "command", "arguments" ]
+			}]
+		},
+		"AttachRequestArguments": {
+			"type": "object",
+			"description": "Arguments for 'attach' request. Additional attributes are implementation specific.",
+			"properties": {
+				"__restart": {
+					"type": [ "array", "boolean", "integer", "null", "number", "object", "string" ],
+					"description": "Optional data from the previous, restarted session.\nThe data is sent as the 'restart' attribute of the 'terminated' event.\nThe client should leave the data intact."
+				}
+			}
+		},
+		"AttachResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'attach' request. This is just an acknowledgement, so no body field is required."
+			}]
+		},
+
+		"RestartRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "Restarts a debug session. Clients should only call this request if the capability 'supportsRestartRequest' is true.\nIf the capability is missing or has the value false, a typical client will emulate 'restart' by terminating the debug adapter first and then launching it anew.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "restart" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/RestartArguments"
+					}
+				},
+				"required": [ "command" ]
+			}]
+		},
+		"RestartArguments": {
+			"type": "object",
+			"description": "Arguments for 'restart' request.",
+			"properties": {
+				"arguments": {
+					"oneOf": [
+						{ "$ref": "#/definitions/LaunchRequestArguments" },
+						{ "$ref": "#/definitions/AttachRequestArguments" }
+					],
+					"description": "The latest version of the 'launch' or 'attach' configuration."
+				}
+			}
+		},
+		"RestartResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'restart' request. This is just an acknowledgement, so no body field is required."
+			}]
+		},
+
+		"DisconnectRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "The 'disconnect' request is sent from the client to the debug adapter in order to stop debugging.\nIt asks the debug adapter to disconnect from the debuggee and to terminate the debug adapter.\nIf the debuggee has been started with the 'launch' request, the 'disconnect' request terminates the debuggee.\nIf the 'attach' request was used to connect to the debuggee, 'disconnect' does not terminate the debuggee.\nThis behavior can be controlled with the 'terminateDebuggee' argument (if supported by the debug adapter).",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "disconnect" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/DisconnectArguments"
+					}
+				},
+				"required": [ "command" ]
+			}]
+		},
+		"DisconnectArguments": {
+			"type": "object",
+			"description": "Arguments for 'disconnect' request.",
+			"properties": {
+				"restart": {
+					"type": "boolean",
+					"description": "A value of true indicates that this 'disconnect' request is part of a restart sequence."
+				},
+				"terminateDebuggee": {
+					"type": "boolean",
+					"description": "Indicates whether the debuggee should be terminated when the debugger is disconnected.\nIf unspecified, the debug adapter is free to do whatever it thinks is best.\nThe attribute is only honored by a debug adapter if the capability 'supportTerminateDebuggee' is true."
+				},
+				"suspendDebuggee": {
+					"type": "boolean",
+					"description": "Indicates whether the debuggee should stay suspended when the debugger is disconnected.\nIf unspecified, the debuggee should resume execution.\nThe attribute is only honored by a debug adapter if the capability 'supportSuspendDebuggee' is true."
+				}
+			}
+		},
+		"DisconnectResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'disconnect' request. This is just an acknowledgement, so no body field is required."
+			}]
+		},
+
+		"TerminateRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "The 'terminate' request is sent from the client to the debug adapter in order to give the debuggee a chance for terminating itself.\nClients should only call this request if the capability 'supportsTerminateRequest' is true.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "terminate" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/TerminateArguments"
+					}
+				},
+				"required": [ "command" ]
+			}]
+		},
+		"TerminateArguments": {
+			"type": "object",
+			"description": "Arguments for 'terminate' request.",
+			"properties": {
+				"restart": {
+					"type": "boolean",
+					"description": "A value of true indicates that this 'terminate' request is part of a restart sequence."
+				}
+			}
+		},
+		"TerminateResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'terminate' request. This is just an acknowledgement, so no body field is required."
+			}]
+		},
+
+		"BreakpointLocationsRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "The 'breakpointLocations' request returns all possible locations for source breakpoints in a given range.\nClients should only call this request if the capability 'supportsBreakpointLocationsRequest' is true.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "breakpointLocations" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/BreakpointLocationsArguments"
+					}
+				},
+				"required": [ "command" ]
+			}]
+
+		},
+		"BreakpointLocationsArguments": {
+			"type": "object",
+			"description": "Arguments for 'breakpointLocations' request.",
+			"properties": {
+				"source": {
+					"$ref": "#/definitions/Source",
+					"description": "The source location of the breakpoints; either 'source.path' or 'source.reference' must be specified."
+				},
+				"line": {
+					"type": "integer",
+					"description": "Start line of range to search possible breakpoint locations in. If only the line is specified, the request returns all possible locations in that line."
+				},
+				"column": {
+					"type": "integer",
+					"description": "Optional start column of range to search possible breakpoint locations in. If no start column is given, the first column in the start line is assumed."
+				},
+				"endLine": {
+					"type": "integer",
+					"description": "Optional end line of range to search possible breakpoint locations in. If no end line is given, then the end line is assumed to be the start line."
+				},
+				"endColumn": {
+					"type": "integer",
+					"description": "Optional end column of range to search possible breakpoint locations in. If no end column is given, then it is assumed to be in the last column of the end line."
+				}
+			},
+			"required": [ "source", "line" ]
+		},
+		"BreakpointLocationsResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'breakpointLocations' request.\nContains possible locations for source breakpoints.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"breakpoints": {
+								"type": "array",
+								"items": {
+									"$ref": "#/definitions/BreakpointLocation"
+								},
+								"description": "Sorted set of possible breakpoint locations."
+							}
+						},
+						"required": [ "breakpoints" ]
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"SetBreakpointsRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "Sets multiple breakpoints for a single source and clears all previous breakpoints in that source.\nTo clear all breakpoint for a source, specify an empty array.\nWhen a breakpoint is hit, a 'stopped' event (with reason 'breakpoint') is generated.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "setBreakpoints" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/SetBreakpointsArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"SetBreakpointsArguments": {
+			"type": "object",
+			"description": "Arguments for 'setBreakpoints' request.",
+			"properties": {
+				"source": {
+					"$ref": "#/definitions/Source",
+					"description": "The source location of the breakpoints; either 'source.path' or 'source.reference' must be specified."
+				},
+				"breakpoints": {
+					"type": "array",
+					"items": {
+						"$ref": "#/definitions/SourceBreakpoint"
+					},
+					"description": "The code locations of the breakpoints."
+				},
+				"lines": {
+					"type": "array",
+					"items": {
+						"type": "integer"
+					},
+					"description": "Deprecated: The code locations of the breakpoints."
+				},
+				"sourceModified": {
+					"type": "boolean",
+					"description": "A value of true indicates that the underlying source has been modified which results in new breakpoint locations."
+				}
+			},
+			"required": [ "source" ]
+		},
+		"SetBreakpointsResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'setBreakpoints' request.\nReturned is information about each breakpoint created by this request.\nThis includes the actual code location and whether the breakpoint could be verified.\nThe breakpoints returned are in the same order as the elements of the 'breakpoints'\n(or the deprecated 'lines') array in the arguments.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"breakpoints": {
+								"type": "array",
+								"items": {
+									"$ref": "#/definitions/Breakpoint"
+								},
+								"description": "Information about the breakpoints.\nThe array elements are in the same order as the elements of the 'breakpoints' (or the deprecated 'lines') array in the arguments."
+							}
+						},
+						"required": [ "breakpoints" ]
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"SetFunctionBreakpointsRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "Replaces all existing function breakpoints with new function breakpoints.\nTo clear all function breakpoints, specify an empty array.\nWhen a function breakpoint is hit, a 'stopped' event (with reason 'function breakpoint') is generated.\nClients should only call this request if the capability 'supportsFunctionBreakpoints' is true.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "setFunctionBreakpoints" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/SetFunctionBreakpointsArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"SetFunctionBreakpointsArguments": {
+			"type": "object",
+			"description": "Arguments for 'setFunctionBreakpoints' request.",
+			"properties": {
+				"breakpoints": {
+					"type": "array",
+					"items": {
+						"$ref": "#/definitions/FunctionBreakpoint"
+					},
+					"description": "The function names of the breakpoints."
+				}
+			},
+			"required": [ "breakpoints" ]
+		},
+		"SetFunctionBreakpointsResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'setFunctionBreakpoints' request.\nReturned is information about each breakpoint created by this request.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"breakpoints": {
+								"type": "array",
+								"items": {
+									"$ref": "#/definitions/Breakpoint"
+								},
+								"description": "Information about the breakpoints. The array elements correspond to the elements of the 'breakpoints' array."
+							}
+						},
+						"required": [ "breakpoints" ]
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"SetExceptionBreakpointsRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "The request configures the debuggers response to thrown exceptions.\nIf an exception is configured to break, a 'stopped' event is fired (with reason 'exception').\nClients should only call this request if the capability 'exceptionBreakpointFilters' returns one or more filters.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "setExceptionBreakpoints" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/SetExceptionBreakpointsArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"SetExceptionBreakpointsArguments": {
+			"type": "object",
+			"description": "Arguments for 'setExceptionBreakpoints' request.",
+			"properties": {
+				"filters": {
+					"type": "array",
+					"items": {
+						"type": "string"
+					},
+					"description": "Set of exception filters specified by their ID. The set of all possible exception filters is defined by the 'exceptionBreakpointFilters' capability. The 'filter' and 'filterOptions' sets are additive."
+				},
+				"filterOptions": {
+					"type": "array",
+					"items": {
+						"$ref": "#/definitions/ExceptionFilterOptions"
+					},
+					"description": "Set of exception filters and their options. The set of all possible exception filters is defined by the 'exceptionBreakpointFilters' capability. This attribute is only honored by a debug adapter if the capability 'supportsExceptionFilterOptions' is true. The 'filter' and 'filterOptions' sets are additive."
+				},
+				"exceptionOptions": {
+					"type": "array",
+					"items": {
+						"$ref": "#/definitions/ExceptionOptions"
+					},
+					"description": "Configuration options for selected exceptions.\nThe attribute is only honored by a debug adapter if the capability 'supportsExceptionOptions' is true."
+				}
+			},
+			"required": [ "filters" ]
+		},
+		"SetExceptionBreakpointsResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'setExceptionBreakpoints' request.\nThe response contains an array of Breakpoint objects with information about each exception breakpoint or filter. The Breakpoint objects are in the same order as the elements of the 'filters', 'filterOptions', 'exceptionOptions' arrays given as arguments. If both 'filters' and 'filterOptions' are given, the returned array must start with 'filters' information first, followed by 'filterOptions' information.\nThe mandatory 'verified' property of a Breakpoint object signals whether the exception breakpoint or filter could be successfully created and whether the optional condition or hit count expressions are valid. In case of an error the 'message' property explains the problem. An optional 'id' property can be used to introduce a unique ID for the exception breakpoint or filter so that it can be updated subsequently by sending breakpoint events.\nFor backward compatibility both the 'breakpoints' array and the enclosing 'body' are optional. If these elements are missing a client will not be able to show problems for individual exception breakpoints or filters.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"breakpoints": {
+								"type": "array",
+								"items": {
+									"$ref": "#/definitions/Breakpoint"
+								},
+								"description": "Information about the exception breakpoints or filters.\nThe breakpoints returned are in the same order as the elements of the 'filters', 'filterOptions', 'exceptionOptions' arrays in the arguments. If both 'filters' and 'filterOptions' are given, the returned array must start with 'filters' information first, followed by 'filterOptions' information."
+							}
+						}
+					}
+				}
+			}]
+		},
+
+		"DataBreakpointInfoRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "Obtains information on a possible data breakpoint that could be set on an expression or variable.\nClients should only call this request if the capability 'supportsDataBreakpoints' is true.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "dataBreakpointInfo" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/DataBreakpointInfoArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"DataBreakpointInfoArguments": {
+			"type": "object",
+			"description": "Arguments for 'dataBreakpointInfo' request.",
+			"properties": {
+				"variablesReference": {
+					"type": "integer",
+					"description": "Reference to the Variable container if the data breakpoint is requested for a child of the container."
+				},
+				"name": {
+					"type": "string",
+					"description": "The name of the Variable's child to obtain data breakpoint information for.\nIf variablesReference isn’t provided, this can be an expression."
+				}
+			},
+			"required": [ "name" ]
+		},
+		"DataBreakpointInfoResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'dataBreakpointInfo' request.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"dataId": {
+								"type": [ "string", "null" ],
+								"description": "An identifier for the data on which a data breakpoint can be registered with the setDataBreakpoints request or null if no data breakpoint is available."
+							},
+							"description": {
+								"type": "string",
+								"description": "UI string that describes on what data the breakpoint is set on or why a data breakpoint is not available."
+							},
+							"accessTypes": {
+								"type": "array",
+								"items": {
+									"$ref": "#/definitions/DataBreakpointAccessType"
+								},
+								"description": "Optional attribute listing the available access types for a potential data breakpoint. A UI frontend could surface this information."
+							},
+							"canPersist": {
+								"type": "boolean",
+								"description": "Optional attribute indicating that a potential data breakpoint could be persisted across sessions."
+							}
+						},
+						"required": [ "dataId", "description" ]
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"SetDataBreakpointsRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "Replaces all existing data breakpoints with new data breakpoints.\nTo clear all data breakpoints, specify an empty array.\nWhen a data breakpoint is hit, a 'stopped' event (with reason 'data breakpoint') is generated.\nClients should only call this request if the capability 'supportsDataBreakpoints' is true.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "setDataBreakpoints" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/SetDataBreakpointsArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"SetDataBreakpointsArguments": {
+			"type": "object",
+			"description": "Arguments for 'setDataBreakpoints' request.",
+			"properties": {
+				"breakpoints": {
+					"type": "array",
+					"items": {
+						"$ref": "#/definitions/DataBreakpoint"
+					},
+					"description": "The contents of this array replaces all existing data breakpoints. An empty array clears all data breakpoints."
+				}
+			},
+			"required": [ "breakpoints" ]
+		},
+		"SetDataBreakpointsResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'setDataBreakpoints' request.\nReturned is information about each breakpoint created by this request.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"breakpoints": {
+								"type": "array",
+								"items": {
+									"$ref": "#/definitions/Breakpoint"
+								},
+								"description": "Information about the data breakpoints. The array elements correspond to the elements of the input argument 'breakpoints' array."
+							}
+						},
+						"required": [ "breakpoints" ]
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"SetInstructionBreakpointsRequest": {
+			"allOf": [
+				{ "$ref": "#/definitions/Request" },
+				{
+					"type": "object",
+					"description": "Replaces all existing instruction breakpoints. Typically, instruction breakpoints would be set from a diassembly window. \nTo clear all instruction breakpoints, specify an empty array.\nWhen an instruction breakpoint is hit, a 'stopped' event (with reason 'instruction breakpoint') is generated.\nClients should only call this request if the capability 'supportsInstructionBreakpoints' is true.",
+					"properties": {
+						"command": {
+						"type": "string",
+						"enum": [ "setInstructionBreakpoints" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/SetInstructionBreakpointsArguments"
+					}
+				},
+				"required": [ "command", "arguments" ]
+			}]
+		},
+		"SetInstructionBreakpointsArguments": {
+			"type": "object",
+			"description": "Arguments for 'setInstructionBreakpoints' request",
+			"properties": {
+				"breakpoints": {
+					"type": "array",
+					"items": {
+						"$ref": "#/definitions/InstructionBreakpoint"
+					},
+					"description": "The instruction references of the breakpoints"
+				}
+			},
+			"required": ["breakpoints"]
+		},
+		"SetInstructionBreakpointsResponse": {
+			"allOf": [
+				{ "$ref": "#/definitions/Response" },
+				{
+					"type": "object",
+					"description": "Response to 'setInstructionBreakpoints' request",
+					"properties": {
+						"body": {
+							"type": "object",
+							"properties": {
+								"breakpoints": {
+									"type": "array",
+									"items": {
+										"$ref": "#/definitions/Breakpoint"
+									},
+								"description": "Information about the breakpoints. The array elements correspond to the elements of the 'breakpoints' array."
+							}
+						},
+						"required": [ "breakpoints" ]
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"ContinueRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "The request starts the debuggee to run again.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "continue" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/ContinueArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"ContinueArguments": {
+			"type": "object",
+			"description": "Arguments for 'continue' request.",
+			"properties": {
+				"threadId": {
+					"type": "integer",
+					"description": "Continue execution for the specified thread (if possible).\nIf the backend cannot continue on a single thread but will continue on all threads, it should set the 'allThreadsContinued' attribute in the response to true."
+				}
+			},
+			"required": [ "threadId" ]
+		},
+		"ContinueResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'continue' request.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"allThreadsContinued": {
+								"type": "boolean",
+								"description": "If true, the 'continue' request has ignored the specified thread and continued all threads instead.\nIf this attribute is missing a value of 'true' is assumed for backward compatibility."
+							}
+						}
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"NextRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "The request starts the debuggee to run again for one step.\nThe debug adapter first sends the response and then a 'stopped' event (with reason 'step') after the step has completed.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "next" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/NextArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"NextArguments": {
+			"type": "object",
+			"description": "Arguments for 'next' request.",
+			"properties": {
+				"threadId": {
+					"type": "integer",
+					"description": "Execute 'next' for this thread."
+				},
+				"granularity": {
+					"$ref": "#/definitions/SteppingGranularity",
+					"description": "Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed."
+				}
+			},
+			"required": [ "threadId" ]
+		},
+		"NextResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'next' request. This is just an acknowledgement, so no body field is required."
+			}]
+		},
+
+		"StepInRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "The request starts the debuggee to step into a function/method if possible.\nIf it cannot step into a target, 'stepIn' behaves like 'next'.\nThe debug adapter first sends the response and then a 'stopped' event (with reason 'step') after the step has completed.\nIf there are multiple function/method calls (or other targets) on the source line,\nthe optional argument 'targetId' can be used to control into which target the 'stepIn' should occur.\nThe list of possible targets for a given source line can be retrieved via the 'stepInTargets' request.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "stepIn" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/StepInArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"StepInArguments": {
+			"type": "object",
+			"description": "Arguments for 'stepIn' request.",
+			"properties": {
+				"threadId": {
+					"type": "integer",
+					"description": "Execute 'stepIn' for this thread."
+				},
+				"targetId": {
+					"type": "integer",
+					"description": "Optional id of the target to step into."
+				},
+				"granularity": {
+					"$ref": "#/definitions/SteppingGranularity",
+					"description": "Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed."
+				}
+			},
+			"required": [ "threadId" ]
+		},
+		"StepInResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'stepIn' request. This is just an acknowledgement, so no body field is required."
+			}]
+		},
+
+		"StepOutRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "The request starts the debuggee to run again for one step.\nThe debug adapter first sends the response and then a 'stopped' event (with reason 'step') after the step has completed.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "stepOut" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/StepOutArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"StepOutArguments": {
+			"type": "object",
+			"description": "Arguments for 'stepOut' request.",
+			"properties": {
+				"threadId": {
+					"type": "integer",
+					"description": "Execute 'stepOut' for this thread."
+				},
+				"granularity": {
+					"$ref": "#/definitions/SteppingGranularity",
+					"description": "Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed."
+				}
+			},
+			"required": [ "threadId" ]
+		},
+		"StepOutResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'stepOut' request. This is just an acknowledgement, so no body field is required."
+			}]
+		},
+
+		"StepBackRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "The request starts the debuggee to run one step backwards.\nThe debug adapter first sends the response and then a 'stopped' event (with reason 'step') after the step has completed.\nClients should only call this request if the capability 'supportsStepBack' is true.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "stepBack" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/StepBackArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"StepBackArguments": {
+			"type": "object",
+			"description": "Arguments for 'stepBack' request.",
+			"properties": {
+				"threadId": {
+					"type": "integer",
+					"description": "Execute 'stepBack' for this thread."
+				},
+				"granularity": {
+					"$ref": "#/definitions/SteppingGranularity",
+					"description": "Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed."
+				}
+			},
+			"required": [ "threadId" ]
+		},
+		"StepBackResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'stepBack' request. This is just an acknowledgement, so no body field is required."
+			}]
+		},
+
+		"ReverseContinueRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "The request starts the debuggee to run backward.\nClients should only call this request if the capability 'supportsStepBack' is true.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "reverseContinue" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/ReverseContinueArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"ReverseContinueArguments": {
+			"type": "object",
+			"description": "Arguments for 'reverseContinue' request.",
+			"properties": {
+				"threadId": {
+					"type": "integer",
+					"description": "Execute 'reverseContinue' for this thread."
+				}
+			},
+			"required": [ "threadId" ]
+		},
+		"ReverseContinueResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'reverseContinue' request. This is just an acknowledgement, so no body field is required."
+			}]
+		},
+
+		"RestartFrameRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "The request restarts execution of the specified stackframe.\nThe debug adapter first sends the response and then a 'stopped' event (with reason 'restart') after the restart has completed.\nClients should only call this request if the capability 'supportsRestartFrame' is true.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "restartFrame" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/RestartFrameArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"RestartFrameArguments": {
+			"type": "object",
+			"description": "Arguments for 'restartFrame' request.",
+			"properties": {
+				"frameId": {
+					"type": "integer",
+					"description": "Restart this stackframe."
+				}
+			},
+			"required": [ "frameId" ]
+		},
+		"RestartFrameResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'restartFrame' request. This is just an acknowledgement, so no body field is required."
+			}]
+		},
+
+		"GotoRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "The request sets the location where the debuggee will continue to run.\nThis makes it possible to skip the execution of code or to executed code again.\nThe code between the current location and the goto target is not executed but skipped.\nThe debug adapter first sends the response and then a 'stopped' event with reason 'goto'.\nClients should only call this request if the capability 'supportsGotoTargetsRequest' is true (because only then goto targets exist that can be passed as arguments).",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "goto" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/GotoArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"GotoArguments": {
+			"type": "object",
+			"description": "Arguments for 'goto' request.",
+			"properties": {
+				"threadId": {
+					"type": "integer",
+					"description": "Set the goto target for this thread."
+				},
+				"targetId": {
+					"type": "integer",
+					"description": "The location where the debuggee will continue to run."
+				}
+			},
+			"required": [ "threadId", "targetId" ]
+		},
+		"GotoResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'goto' request. This is just an acknowledgement, so no body field is required."
+			}]
+		},
+
+		"PauseRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "The request suspends the debuggee.\nThe debug adapter first sends the response and then a 'stopped' event (with reason 'pause') after the thread has been paused successfully.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "pause" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/PauseArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"PauseArguments": {
+			"type": "object",
+			"description": "Arguments for 'pause' request.",
+			"properties": {
+				"threadId": {
+					"type": "integer",
+					"description": "Pause execution for this thread."
+				}
+			},
+			"required": [ "threadId" ]
+		},
+		"PauseResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'pause' request. This is just an acknowledgement, so no body field is required."
+			}]
+		},
+
+		"StackTraceRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "The request returns a stacktrace from the current execution state of a given thread.\nA client can request all stack frames by omitting the startFrame and levels arguments. For performance conscious clients and if the debug adapter's 'supportsDelayedStackTraceLoading' capability is true, stack frames can be retrieved in a piecemeal way with the startFrame and levels arguments. The response of the stackTrace request may contain a totalFrames property that hints at the total number of frames in the stack. If a client needs this total number upfront, it can issue a request for a single (first) frame and depending on the value of totalFrames decide how to proceed. In any case a client should be prepared to receive less frames than requested, which is an indication that the end of the stack has been reached.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "stackTrace" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/StackTraceArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"StackTraceArguments": {
+			"type": "object",
+			"description": "Arguments for 'stackTrace' request.",
+			"properties": {
+				"threadId": {
+					"type": "integer",
+					"description": "Retrieve the stacktrace for this thread."
+				},
+				"startFrame": {
+					"type": "integer",
+					"description": "The index of the first frame to return; if omitted frames start at 0."
+				},
+				"levels": {
+					"type": "integer",
+					"description": "The maximum number of frames to return. If levels is not specified or 0, all frames are returned."
+				},
+				"format": {
+					"$ref": "#/definitions/StackFrameFormat",
+					"description": "Specifies details on how to format the stack frames.\nThe attribute is only honored by a debug adapter if the capability 'supportsValueFormattingOptions' is true."
+				}
+			},
+			"required": [ "threadId" ]
+		},
+		"StackTraceResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'stackTrace' request.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"stackFrames": {
+								"type": "array",
+								"items": {
+									"$ref": "#/definitions/StackFrame"
+								},
+								"description": "The frames of the stackframe. If the array has length zero, there are no stackframes available.\nThis means that there is no location information available."
+							},
+							"totalFrames": {
+								"type": "integer",
+								"description": "The total number of frames available in the stack. If omitted or if totalFrames is larger than the available frames, a client is expected to request frames until a request returns less frames than requested (which indicates the end of the stack). Returning monotonically increasing totalFrames values for subsequent requests can be used to enforce paging in the client."
+							}
+						},
+						"required": [ "stackFrames" ]
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"ScopesRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "The request returns the variable scopes for a given stackframe ID.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "scopes" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/ScopesArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"ScopesArguments": {
+			"type": "object",
+			"description": "Arguments for 'scopes' request.",
+			"properties": {
+				"frameId": {
+					"type": "integer",
+					"description": "Retrieve the scopes for this stackframe."
+				}
+			},
+			"required": [ "frameId" ]
+		},
+		"ScopesResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'scopes' request.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"scopes": {
+								"type": "array",
+								"items": {
+									"$ref": "#/definitions/Scope"
+								},
+								"description": "The scopes of the stackframe. If the array has length zero, there are no scopes available."
+							}
+						},
+						"required": [ "scopes" ]
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"VariablesRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "Retrieves all child variables for the given variable reference.\nAn optional filter can be used to limit the fetched children to either named or indexed children.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "variables" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/VariablesArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"VariablesArguments": {
+			"type": "object",
+			"description": "Arguments for 'variables' request.",
+			"properties": {
+				"variablesReference": {
+					"type": "integer",
+					"description": "The Variable reference."
+				},
+				"filter": {
+					"type": "string",
+					"enum": [ "indexed", "named" ],
+					"description": "Optional filter to limit the child variables to either named or indexed. If omitted, both types are fetched."
+				},
+				"start": {
+					"type": "integer",
+					"description": "The index of the first variable to return; if omitted children start at 0."
+				},
+				"count": {
+					"type": "integer",
+					"description": "The number of variables to return. If count is missing or 0, all variables are returned."
+				},
+				"format": {
+					"$ref": "#/definitions/ValueFormat",
+					"description": "Specifies details on how to format the Variable values.\nThe attribute is only honored by a debug adapter if the capability 'supportsValueFormattingOptions' is true."
+				}
+			},
+			"required": [ "variablesReference" ]
+		},
+		"VariablesResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'variables' request.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"variables": {
+								"type": "array",
+								"items": {
+									"$ref": "#/definitions/Variable"
+								},
+								"description": "All (or a range) of variables for the given variable reference."
+							}
+						},
+						"required": [ "variables" ]
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"SetVariableRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "Set the variable with the given name in the variable container to a new value. Clients should only call this request if the capability 'supportsSetVariable' is true.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "setVariable" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/SetVariableArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"SetVariableArguments": {
+			"type": "object",
+			"description": "Arguments for 'setVariable' request.",
+			"properties": {
+				"variablesReference": {
+					"type": "integer",
+					"description": "The reference of the variable container."
+				},
+				"name": {
+					"type": "string",
+					"description": "The name of the variable in the container."
+				},
+				"value": {
+					"type": "string",
+					"description": "The value of the variable."
+				},
+				"format": {
+					"$ref": "#/definitions/ValueFormat",
+					"description": "Specifies details on how to format the response value."
+				}
+			},
+			"required": [ "variablesReference", "name", "value" ]
+		},
+		"SetVariableResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'setVariable' request.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"value": {
+								"type": "string",
+								"description": "The new value of the variable."
+							},
+							"type": {
+								"type": "string",
+								"description": "The type of the new value. Typically shown in the UI when hovering over the value."
+							},
+							"variablesReference": {
+								"type": "integer",
+								"description": "If variablesReference is > 0, the new value is structured and its children can be retrieved by passing variablesReference to the VariablesRequest.\nThe value should be less than or equal to 2147483647 (2^31-1)."
+							},
+							"namedVariables": {
+								"type": "integer",
+								"description": "The number of named child variables.\nThe client can use this optional information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1)."
+							},
+							"indexedVariables": {
+								"type": "integer",
+								"description": "The number of indexed child variables.\nThe client can use this optional information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1)."
+							}
+						},
+						"required": [ "value" ]
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"SourceRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "The request retrieves the source code for a given source reference.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "source" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/SourceArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"SourceArguments": {
+			"type": "object",
+			"description": "Arguments for 'source' request.",
+			"properties": {
+				"source": {
+					"$ref": "#/definitions/Source",
+					"description": "Specifies the source content to load. Either source.path or source.sourceReference must be specified."
+				},
+				"sourceReference": {
+					"type": "integer",
+					"description": "The reference to the source. This is the same as source.sourceReference.\nThis is provided for backward compatibility since old backends do not understand the 'source' attribute."
+				}
+			},
+			"required": [ "sourceReference" ]
+		},
+		"SourceResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'source' request.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"content": {
+								"type": "string",
+								"description": "Content of the source reference."
+							},
+							"mimeType": {
+								"type": "string",
+								"description": "Optional content type (mime type) of the source."
+							}
+						},
+						"required": [ "content" ]
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"ThreadsRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "The request retrieves a list of all threads.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "threads" ]
+					}
+				},
+				"required": [ "command" ]
+			}]
+		},
+		"ThreadsResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'threads' request.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"threads": {
+								"type": "array",
+								"items": {
+									"$ref": "#/definitions/Thread"
+								},
+								"description": "All threads."
+							}
+						},
+						"required": [ "threads" ]
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"TerminateThreadsRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "The request terminates the threads with the given ids.\nClients should only call this request if the capability 'supportsTerminateThreadsRequest' is true.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "terminateThreads" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/TerminateThreadsArguments"
+					}
+				},
+				"required": [ "command", "arguments" ]
+			}]
+		},
+		"TerminateThreadsArguments": {
+			"type": "object",
+			"description": "Arguments for 'terminateThreads' request.",
+			"properties": {
+				"threadIds": {
+					"type": "array",
+					"items": {
+						"type": "integer"
+					},
+					"description": "Ids of threads to be terminated."
+				}
+			}
+		},
+		"TerminateThreadsResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'terminateThreads' request. This is just an acknowledgement, so no body field is required."
+			}]
+		},
+
+		"ModulesRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "Modules can be retrieved from the debug adapter with this request which can either return all modules or a range of modules to support paging.\nClients should only call this request if the capability 'supportsModulesRequest' is true.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "modules" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/ModulesArguments"
+					}
+				},
+				"required": [ "command", "arguments" ]
+			}]
+		},
+		"ModulesArguments": {
+			"type": "object",
+			"description": "Arguments for 'modules' request.",
+			"properties": {
+				"startModule": {
+					"type": "integer",
+					"description": "The index of the first module to return; if omitted modules start at 0."
+				},
+				"moduleCount": {
+					"type": "integer",
+					"description": "The number of modules to return. If moduleCount is not specified or 0, all modules are returned."
+				}
+			}
+		},
+		"ModulesResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'modules' request.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"modules": {
+								"type": "array",
+								"items": {
+									"$ref": "#/definitions/Module"
+								},
+								"description": "All modules or range of modules."
+							},
+							"totalModules": {
+								"type": "integer",
+								"description": "The total number of modules available."
+							}
+						},
+						"required": [ "modules" ]
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"LoadedSourcesRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "Retrieves the set of all sources currently loaded by the debugged process.\nClients should only call this request if the capability 'supportsLoadedSourcesRequest' is true.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "loadedSources" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/LoadedSourcesArguments"
+					}
+				},
+				"required": [ "command" ]
+			}]
+		},
+		"LoadedSourcesArguments": {
+			"type": "object",
+			"description": "Arguments for 'loadedSources' request."
+		},
+		"LoadedSourcesResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'loadedSources' request.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"sources": {
+								"type": "array",
+								"items": {
+									"$ref": "#/definitions/Source"
+								},
+								"description": "Set of loaded sources."
+							}
+						},
+						"required": [ "sources" ]
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"EvaluateRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "Evaluates the given expression in the context of the top most stack frame.\nThe expression has access to any variables and arguments that are in scope.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "evaluate" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/EvaluateArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"EvaluateArguments": {
+			"type": "object",
+			"description": "Arguments for 'evaluate' request.",
+			"properties": {
+				"expression": {
+					"type": "string",
+					"description": "The expression to evaluate."
+				},
+				"frameId": {
+					"type": "integer",
+					"description": "Evaluate the expression in the scope of this stack frame. If not specified, the expression is evaluated in the global scope."
+				},
+				"context": {
+					"type": "string",
+					"_enum": [ "watch", "repl", "hover", "clipboard" ],
+					"enumDescriptions": [
+						"evaluate is run in a watch.",
+						"evaluate is run from REPL console.",
+						"evaluate is run from a data hover.",
+						"evaluate is run to generate the value that will be stored in the clipboard.\nThe attribute is only honored by a debug adapter if the capability 'supportsClipboardContext' is true."
+					],
+					"description": "The context in which the evaluate request is run."
+				},
+				"format": {
+					"$ref": "#/definitions/ValueFormat",
+					"description": "Specifies details on how to format the Evaluate result.\nThe attribute is only honored by a debug adapter if the capability 'supportsValueFormattingOptions' is true."
+				}
+			},
+			"required": [ "expression" ]
+		},
+		"EvaluateResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'evaluate' request.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"result": {
+								"type": "string",
+								"description": "The result of the evaluate request."
+							},
+							"type": {
+								"type": "string",
+								"description": "The optional type of the evaluate result.\nThis attribute should only be returned by a debug adapter if the client has passed the value true for the 'supportsVariableType' capability of the 'initialize' request."
+							},
+							"presentationHint": {
+								"$ref": "#/definitions/VariablePresentationHint",
+								"description": "Properties of a evaluate result that can be used to determine how to render the result in the UI."
+							},
+							"variablesReference": {
+								"type": "integer",
+								"description": "If variablesReference is > 0, the evaluate result is structured and its children can be retrieved by passing variablesReference to the VariablesRequest.\nThe value should be less than or equal to 2147483647 (2^31-1)."
+							},
+							"namedVariables": {
+								"type": "integer",
+								"description": "The number of named child variables.\nThe client can use this optional information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1)."
+							},
+							"indexedVariables": {
+								"type": "integer",
+								"description": "The number of indexed child variables.\nThe client can use this optional information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1)."
+							},
+							"memoryReference": {
+								"type": "string",
+								"description": "Optional memory reference to a location appropriate for this result.\nFor pointer type eval results, this is generally a reference to the memory address contained in the pointer.\nThis attribute should be returned by a debug adapter if the client has passed the value true for the 'supportsMemoryReferences' capability of the 'initialize' request."
+							}
+						},
+						"required": [ "result", "variablesReference" ]
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"SetExpressionRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "Evaluates the given 'value' expression and assigns it to the 'expression' which must be a modifiable l-value.\nThe expressions have access to any variables and arguments that are in scope of the specified frame.\nClients should only call this request if the capability 'supportsSetExpression' is true.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "setExpression" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/SetExpressionArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"SetExpressionArguments": {
+			"type": "object",
+			"description": "Arguments for 'setExpression' request.",
+			"properties": {
+				"expression": {
+					"type": "string",
+					"description": "The l-value expression to assign to."
+				},
+				"value": {
+					"type": "string",
+					"description": "The value expression to assign to the l-value expression."
+				},
+				"frameId": {
+					"type": "integer",
+					"description": "Evaluate the expressions in the scope of this stack frame. If not specified, the expressions are evaluated in the global scope."
+				},
+				"format": {
+					"$ref": "#/definitions/ValueFormat",
+					"description": "Specifies how the resulting value should be formatted."
+				}
+			},
+			"required": [ "expression", "value" ]
+		},
+		"SetExpressionResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'setExpression' request.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"value": {
+								"type": "string",
+								"description": "The new value of the expression."
+							},
+							"type": {
+								"type": "string",
+								"description": "The optional type of the value.\nThis attribute should only be returned by a debug adapter if the client has passed the value true for the 'supportsVariableType' capability of the 'initialize' request."
+							},
+							"presentationHint": {
+								"$ref": "#/definitions/VariablePresentationHint",
+								"description": "Properties of a value that can be used to determine how to render the result in the UI."
+							},
+							"variablesReference": {
+								"type": "integer",
+								"description": "If variablesReference is > 0, the value is structured and its children can be retrieved by passing variablesReference to the VariablesRequest.\nThe value should be less than or equal to 2147483647 (2^31-1)."
+							},
+							"namedVariables": {
+								"type": "integer",
+								"description": "The number of named child variables.\nThe client can use this optional information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1)."
+							},
+							"indexedVariables": {
+								"type": "integer",
+								"description": "The number of indexed child variables.\nThe client can use this optional information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1)."
+							}
+						},
+						"required": [ "value" ]
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"StepInTargetsRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "This request retrieves the possible stepIn targets for the specified stack frame.\nThese targets can be used in the 'stepIn' request.\nThe StepInTargets may only be called if the 'supportsStepInTargetsRequest' capability exists and is true.\nClients should only call this request if the capability 'supportsStepInTargetsRequest' is true.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "stepInTargets" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/StepInTargetsArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"StepInTargetsArguments": {
+			"type": "object",
+			"description": "Arguments for 'stepInTargets' request.",
+			"properties": {
+				"frameId": {
+					"type": "integer",
+					"description": "The stack frame for which to retrieve the possible stepIn targets."
+				}
+			},
+			"required": [ "frameId" ]
+		},
+		"StepInTargetsResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'stepInTargets' request.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"targets": {
+								"type": "array",
+								"items": {
+									"$ref": "#/definitions/StepInTarget"
+								},
+								"description": "The possible stepIn targets of the specified source location."
+							}
+						},
+						"required": [ "targets" ]
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"GotoTargetsRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "This request retrieves the possible goto targets for the specified source location.\nThese targets can be used in the 'goto' request.\nClients should only call this request if the capability 'supportsGotoTargetsRequest' is true.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "gotoTargets" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/GotoTargetsArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"GotoTargetsArguments": {
+			"type": "object",
+			"description": "Arguments for 'gotoTargets' request.",
+			"properties": {
+				"source": {
+					"$ref": "#/definitions/Source",
+					"description": "The source location for which the goto targets are determined."
+				},
+				"line": {
+					"type": "integer",
+					"description": "The line location for which the goto targets are determined."
+				},
+				"column": {
+					"type": "integer",
+					"description": "An optional column location for which the goto targets are determined."
+				}
+			},
+			"required": [ "source", "line" ]
+		},
+		"GotoTargetsResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'gotoTargets' request.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"targets": {
+								"type": "array",
+								"items": {
+									"$ref": "#/definitions/GotoTarget"
+								},
+								"description": "The possible goto targets of the specified location."
+							}
+						},
+						"required": [ "targets" ]
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"CompletionsRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "Returns a list of possible completions for a given caret position and text.\nClients should only call this request if the capability 'supportsCompletionsRequest' is true.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "completions" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/CompletionsArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"CompletionsArguments": {
+			"type": "object",
+			"description": "Arguments for 'completions' request.",
+			"properties": {
+				"frameId": {
+					"type": "integer",
+					"description": "Returns completions in the scope of this stack frame. If not specified, the completions are returned for the global scope."
+				},
+				"text": {
+					"type": "string",
+					"description": "One or more source lines. Typically this is the text a user has typed into the debug console before he asked for completion."
+				},
+				"column": {
+					"type": "integer",
+					"description": "The character position for which to determine the completion proposals."
+				},
+				"line": {
+					"type": "integer",
+					"description": "An optional line for which to determine the completion proposals. If missing the first line of the text is assumed."
+				}
+			},
+			"required": [ "text", "column" ]
+		},
+		"CompletionsResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'completions' request.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"targets": {
+								"type": "array",
+								"items": {
+									"$ref": "#/definitions/CompletionItem"
+								},
+								"description": "The possible completions for ."
+							}
+						},
+						"required": [ "targets" ]
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"ExceptionInfoRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "Retrieves the details of the exception that caused this event to be raised.\nClients should only call this request if the capability 'supportsExceptionInfoRequest' is true.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "exceptionInfo" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/ExceptionInfoArguments"
+					}
+				},
+				"required": [ "command", "arguments"  ]
+			}]
+		},
+		"ExceptionInfoArguments": {
+			"type": "object",
+			"description": "Arguments for 'exceptionInfo' request.",
+			"properties": {
+				"threadId": {
+					"type": "integer",
+					"description": "Thread for which exception information should be retrieved."
+				}
+			},
+			"required": [ "threadId" ]
+		},
+		"ExceptionInfoResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'exceptionInfo' request.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"exceptionId": {
+								"type": "string",
+								"description": "ID of the exception that was thrown."
+							},
+							"description": {
+								"type": "string",
+								"description": "Descriptive text for the exception provided by the debug adapter."
+							},
+							"breakMode": {
+								"$ref": "#/definitions/ExceptionBreakMode",
+								"description": "Mode that caused the exception notification to be raised."
+							},
+							"details": {
+								"$ref": "#/definitions/ExceptionDetails",
+								"description": "Detailed information about the exception."
+							}
+						},
+						"required": [ "exceptionId", "breakMode" ]
+					}
+				},
+				"required": [ "body" ]
+			}]
+		},
+
+		"ReadMemoryRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "Reads bytes from memory at the provided location.\nClients should only call this request if the capability 'supportsReadMemoryRequest' is true.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "readMemory" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/ReadMemoryArguments"
+					}
+				},
+				"required": [ "command", "arguments" ]
+			}]
+		},
+		"ReadMemoryArguments": {
+			"type": "object",
+			"description": "Arguments for 'readMemory' request.",
+			"properties": {
+				"memoryReference": {
+					"type": "string",
+					"description": "Memory reference to the base location from which data should be read."
+				},
+				"offset": {
+					"type": "integer",
+					"description": "Optional offset (in bytes) to be applied to the reference location before reading data. Can be negative."
+				},
+				"count": {
+					"type": "integer",
+					"description": "Number of bytes to read at the specified location and offset."
+				}
+			},
+			"required": [ "memoryReference", "count" ]
+		},
+		"ReadMemoryResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'readMemory' request.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"address": {
+								"type": "string",
+								"description": "The address of the first byte of data returned.\nTreated as a hex value if prefixed with '0x', or as a decimal value otherwise."
+							},
+							"unreadableBytes": {
+								"type": "integer",
+								"description": "The number of unreadable bytes encountered after the last successfully read byte.\nThis can be used to determine the number of bytes that must be skipped before a subsequent 'readMemory' request will succeed."
+							},
+							"data": {
+								"type": "string",
+								"description": "The bytes read from memory, encoded using base64."
+							}
+						},
+						"required": [ "address" ]
+					}
+				}
+			}]
+		},
+
+		"DisassembleRequest": {
+			"allOf": [ { "$ref": "#/definitions/Request" }, {
+				"type": "object",
+				"description": "Disassembles code stored at the provided location.\nClients should only call this request if the capability 'supportsDisassembleRequest' is true.",
+				"properties": {
+					"command": {
+						"type": "string",
+						"enum": [ "disassemble" ]
+					},
+					"arguments": {
+						"$ref": "#/definitions/DisassembleArguments"
+					}
+				},
+				"required": [ "command", "arguments" ]
+			}]
+		},
+		"DisassembleArguments": {
+			"type": "object",
+			"description": "Arguments for 'disassemble' request.",
+			"properties": {
+				"memoryReference": {
+					"type": "string",
+					"description": "Memory reference to the base location containing the instructions to disassemble."
+				},
+				"offset": {
+					"type": "integer",
+					"description": "Optional offset (in bytes) to be applied to the reference location before disassembling. Can be negative."
+				},
+				"instructionOffset": {
+					"type": "integer",
+					"description": "Optional offset (in instructions) to be applied after the byte offset (if any) before disassembling. Can be negative."
+				},
+				"instructionCount": {
+					"type": "integer",
+					"description": "Number of instructions to disassemble starting at the specified location and offset.\nAn adapter must return exactly this number of instructions - any unavailable instructions should be replaced with an implementation-defined 'invalid instruction' value."
+				},
+				"resolveSymbols": {
+					"type": "boolean",
+					"description": "If true, the adapter should attempt to resolve memory addresses and other values to symbolic names."
+				}
+			},
+			"required": [ "memoryReference", "instructionCount" ]
+		},
+		"DisassembleResponse": {
+			"allOf": [ { "$ref": "#/definitions/Response" }, {
+				"type": "object",
+				"description": "Response to 'disassemble' request.",
+				"properties": {
+					"body": {
+						"type": "object",
+						"properties": {
+							"instructions": {
+								"type": "array",
+								"items": {
+									"$ref": "#/definitions/DisassembledInstruction"
+								},
+								"description": "The list of disassembled instructions."
+							}
+						},
+						"required": [ "instructions" ]
+					}
+				}
+			}]
+		},
+
+		"Capabilities": {
+			"type": "object",
+			"title": "Types",
+			"description": "Information about the capabilities of a debug adapter.",
+			"properties": {
+				"supportsConfigurationDoneRequest": {
+					"type": "boolean",
+					"description": "The debug adapter supports the 'configurationDone' request."
+				},
+				"supportsFunctionBreakpoints": {
+					"type": "boolean",
+					"description": "The debug adapter supports function breakpoints."
+				},
+				"supportsConditionalBreakpoints": {
+					"type": "boolean",
+					"description": "The debug adapter supports conditional breakpoints."
+				},
+				"supportsHitConditionalBreakpoints": {
+					"type": "boolean",
+					"description": "The debug adapter supports breakpoints that break execution after a specified number of hits."
+				},
+				"supportsEvaluateForHovers": {
+					"type": "boolean",
+					"description": "The debug adapter supports a (side effect free) evaluate request for data hovers."
+				},
+				"exceptionBreakpointFilters": {
+					"type": "array",
+					"items": {
+						"$ref": "#/definitions/ExceptionBreakpointsFilter"
+					},
+					"description": "Available exception filter options for the 'setExceptionBreakpoints' request."
+				},
+				"supportsStepBack": {
+					"type": "boolean",
+					"description": "The debug adapter supports stepping back via the 'stepBack' and 'reverseContinue' requests."
+				},
+				"supportsSetVariable": {
+					"type": "boolean",
+					"description": "The debug adapter supports setting a variable to a value."
+				},
+				"supportsRestartFrame": {
+					"type": "boolean",
+					"description": "The debug adapter supports restarting a frame."
+				},
+				"supportsGotoTargetsRequest": {
+					"type": "boolean",
+					"description": "The debug adapter supports the 'gotoTargets' request."
+				},
+				"supportsStepInTargetsRequest": {
+					"type": "boolean",
+					"description": "The debug adapter supports the 'stepInTargets' request."
+				},
+				"supportsCompletionsRequest": {
+					"type": "boolean",
+					"description": "The debug adapter supports the 'completions' request."
+				},
+				"completionTriggerCharacters": {
+					"type": "array",
+					"items": {
+						"type": "string"
+					},
+					"description": "The set of characters that should trigger completion in a REPL. If not specified, the UI should assume the '.' character."
+				},
+				"supportsModulesRequest": {
+					"type": "boolean",
+					"description": "The debug adapter supports the 'modules' request."
+				},
+				"additionalModuleColumns": {
+					"type": "array",
+					"items": {
+						"$ref": "#/definitions/ColumnDescriptor"
+					},
+					"description": "The set of additional module information exposed by the debug adapter."
+				},
+				"supportedChecksumAlgorithms": {
+					"type": "array",
+					"items": {
+						"$ref": "#/definitions/ChecksumAlgorithm"
+					},
+					"description": "Checksum algorithms supported by the debug adapter."
+				},
+				"supportsRestartRequest": {
+					"type": "boolean",
+					"description": "The debug adapter supports the 'restart' request. In this case a client should not implement 'restart' by terminating and relaunching the adapter but by calling the RestartRequest."
+				},
+				"supportsExceptionOptions": {
+					"type": "boolean",
+					"description": "The debug adapter supports 'exceptionOptions' on the setExceptionBreakpoints request."
+				},
+				"supportsValueFormattingOptions": {
+					"type": "boolean",
+					"description": "The debug adapter supports a 'format' attribute on the stackTraceRequest, variablesRequest, and evaluateRequest."
+				},
+				"supportsExceptionInfoRequest": {
+					"type": "boolean",
+					"description": "The debug adapter supports the 'exceptionInfo' request."
+				},
+				"supportTerminateDebuggee": {
+					"type": "boolean",
+					"description": "The debug adapter supports the 'terminateDebuggee' attribute on the 'disconnect' request."
+				},
+				"supportSuspendDebuggee": {
+					"type": "boolean",
+					"description": "The debug adapter supports the 'suspendDebuggee' attribute on the 'disconnect' request."
+				},
+				"supportsDelayedStackTraceLoading": {
+					"type": "boolean",
+					"description": "The debug adapter supports the delayed loading of parts of the stack, which requires that both the 'startFrame' and 'levels' arguments and an optional 'totalFrames' result of the 'StackTrace' request are supported."
+				},
+				"supportsLoadedSourcesRequest": {
+					"type": "boolean",
+					"description": "The debug adapter supports the 'loadedSources' request."
+				},
+				"supportsLogPoints": {
+					"type": "boolean",
+					"description": "The debug adapter supports logpoints by interpreting the 'logMessage' attribute of the SourceBreakpoint."
+				},
+				"supportsTerminateThreadsRequest": {
+					"type": "boolean",
+					"description": "The debug adapter supports the 'terminateThreads' request."
+				},
+				"supportsSetExpression": {
+					"type": "boolean",
+					"description": "The debug adapter supports the 'setExpression' request."
+				},
+				"supportsTerminateRequest": {
+					"type": "boolean",
+					"description": "The debug adapter supports the 'terminate' request."
+				},
+				"supportsDataBreakpoints": {
+					"type": "boolean",
+					"description": "The debug adapter supports data breakpoints."
+				},
+				"supportsReadMemoryRequest": {
+					"type": "boolean",
+					"description": "The debug adapter supports the 'readMemory' request."
+				},
+				"supportsDisassembleRequest": {
+					"type": "boolean",
+					"description": "The debug adapter supports the 'disassemble' request."
+				},
+				"supportsCancelRequest": {
+					"type": "boolean",
+					"description": "The debug adapter supports the 'cancel' request."
+				},
+				"supportsBreakpointLocationsRequest": {
+					"type": "boolean",
+					"description": "The debug adapter supports the 'breakpointLocations' request."
+				},
+				"supportsClipboardContext": {
+					"type": "boolean",
+					"description": "The debug adapter supports the 'clipboard' context value in the 'evaluate' request."
+				},
+				"supportsSteppingGranularity": {
+					"type": "boolean",
+					"description": "The debug adapter supports stepping granularities (argument 'granularity') for the stepping requests."
+				},
+				"supportsInstructionBreakpoints": {
+					"type": "boolean",
+					"description": "The debug adapter supports adding breakpoints based on instruction references."
+				},
+				"supportsExceptionFilterOptions": {
+					"type": "boolean",
+					"description": "The debug adapter supports 'filterOptions' as an argument on the 'setExceptionBreakpoints' request."
+				}
+			}
+		},
+
+		"ExceptionBreakpointsFilter": {
+			"type": "object",
+			"description": "An ExceptionBreakpointsFilter is shown in the UI as an filter option for configuring how exceptions are dealt with.",
+			"properties": {
+				"filter": {
+					"type": "string",
+					"description": "The internal ID of the filter option. This value is passed to the 'setExceptionBreakpoints' request."
+				},
+				"label": {
+					"type": "string",
+					"description": "The name of the filter option. This will be shown in the UI."
+				},
+				"description": {
+					"type": "string",
+					"description": "An optional help text providing additional information about the exception filter. This string is typically shown as a hover and must be translated."
+				},
+				"default": {
+					"type": "boolean",
+					"description": "Initial value of the filter option. If not specified a value 'false' is assumed."
+				},
+				"supportsCondition": {
+					"type": "boolean",
+					"description": "Controls whether a condition can be specified for this filter option. If false or missing, a condition can not be set."
+				},
+				"conditionDescription": {
+					"type": "string",
+					"description": "An optional help text providing information about the condition. This string is shown as the placeholder text for a text box and must be translated."
+				}
+			},
+			"required": [ "filter", "label" ]
+		},
+
+		"Message": {
+			"type": "object",
+			"description": "A structured message object. Used to return errors from requests.",
+			"properties": {
+				"id": {
+					"type": "integer",
+					"description": "Unique identifier for the message."
+				},
+				"format": {
+					"type": "string",
+					"description": "A format string for the message. Embedded variables have the form '{name}'.\nIf variable name starts with an underscore character, the variable does not contain user data (PII) and can be safely used for telemetry purposes."
+				},
+				"variables": {
+					"type": "object",
+					"description": "An object used as a dictionary for looking up the variables in the format string.",
+					"additionalProperties": {
+						"type": "string",
+						"description": "Values must be strings."
+					}
+				},
+				"sendTelemetry": {
+					"type": "boolean",
+					"description": "If true send to telemetry."
+				},
+				"showUser": {
+					"type": "boolean",
+					"description": "If true show user."
+				},
+				"url": {
+					"type": "string",
+					"description": "An optional url where additional information about this message can be found."
+				},
+				"urlLabel": {
+					"type": "string",
+					"description": "An optional label that is presented to the user as the UI for opening the url."
+				}
+			},
+			"required": [ "id", "format" ]
+		},
+
+		"Module": {
+			"type": "object",
+			"description": "A Module object represents a row in the modules view.\nTwo attributes are mandatory: an id identifies a module in the modules view and is used in a ModuleEvent for identifying a module for adding, updating or deleting.\nThe name is used to minimally render the module in the UI.\n\nAdditional attributes can be added to the module. They will show up in the module View if they have a corresponding ColumnDescriptor.\n\nTo avoid an unnecessary proliferation of additional attributes with similar semantics but different names\nwe recommend to re-use attributes from the 'recommended' list below first, and only introduce new attributes if nothing appropriate could be found.",
+			"properties": {
+				"id": {
+					"type": ["integer", "string"],
+					"description": "Unique identifier for the module."
+				},
+				"name": {
+					"type": "string",
+					"description": "A name of the module."
+				},
+				"path": {
+					"type": "string",
+					"description": "optional but recommended attributes.\nalways try to use these first before introducing additional attributes.\n\nLogical full path to the module. The exact definition is implementation defined, but usually this would be a full path to the on-disk file for the module."
+				},
+				"isOptimized": {
+					"type": "boolean",
+					"description": "True if the module is optimized."
+				},
+				"isUserCode": {
+					"type": "boolean",
+					"description": "True if the module is considered 'user code' by a debugger that supports 'Just My Code'."
+				},
+				"version": {
+					"type": "string",
+					"description": "Version of Module."
+				},
+				"symbolStatus": {
+					"type": "string",
+					"description": "User understandable description of if symbols were found for the module (ex: 'Symbols Loaded', 'Symbols not found', etc."
+				},
+				"symbolFilePath": {
+					"type": "string",
+					"description": "Logical full path to the symbol file. The exact definition is implementation defined."
+				},
+				"dateTimeStamp": {
+					"type": "string",
+					"description": "Module created or modified."
+				},
+				"addressRange": {
+					"type": "string",
+					"description": "Address range covered by this module."
+				}
+			},
+			"required": [ "id", "name" ]
+		},
+
+		"ColumnDescriptor": {
+			"type": "object",
+			"description": "A ColumnDescriptor specifies what module attribute to show in a column of the ModulesView, how to format it,\nand what the column's label should be.\nIt is only used if the underlying UI actually supports this level of customization.",
+			"properties": {
+				"attributeName": {
+					"type": "string",
+					"description": "Name of the attribute rendered in this column."
+				},
+				"label": {
+					"type": "string",
+					"description": "Header UI label of column."
+				},
+				"format": {
+					"type": "string",
+					"description": "Format to use for the rendered values in this column. TBD how the format strings looks like."
+				},
+				"type": {
+					"type": "string",
+					"enum": [ "string", "number", "boolean", "unixTimestampUTC" ],
+					"description": "Datatype of values in this column.  Defaults to 'string' if not specified."
+				},
+				"width": {
+					"type": "integer",
+					"description": "Width of this column in characters (hint only)."
+				}
+			},
+			"required": [ "attributeName", "label"]
+		},
+
+		"ModulesViewDescriptor": {
+			"type": "object",
+			"description": "The ModulesViewDescriptor is the container for all declarative configuration options of a ModuleView.\nFor now it only specifies the columns to be shown in the modules view.",
+			"properties": {
+				"columns": {
+					"type": "array",
+					"items": {
+						"$ref": "#/definitions/ColumnDescriptor"
+					}
+				}
+			},
+			"required": [ "columns" ]
+		},
+
+		"Thread": {
+			"type": "object",
+			"description": "A Thread",
+			"properties": {
+				"id": {
+					"type": "integer",
+					"description": "Unique identifier for the thread."
+				},
+				"name": {
+					"type": "string",
+					"description": "A name of the thread."
+				}
+			},
+			"required": [ "id", "name" ]
+		},
+
+		"Source": {
+			"type": "object",
+			"description": "A Source is a descriptor for source code.\nIt is returned from the debug adapter as part of a StackFrame and it is used by clients when specifying breakpoints.",
+			"properties": {
+				"name": {
+					"type": "string",
+					"description": "The short name of the source. Every source returned from the debug adapter has a name.\nWhen sending a source to the debug adapter this name is optional."
+				},
+				"path": {
+					"type": "string",
+					"description": "The path of the source to be shown in the UI.\nIt is only used to locate and load the content of the source if no sourceReference is specified (or its value is 0)."
+				},
+				"sourceReference": {
+					"type": "integer",
+					"description": "If sourceReference > 0 the contents of the source must be retrieved through the SourceRequest (even if a path is specified).\nA sourceReference is only valid for a session, so it must not be used to persist a source.\nThe value should be less than or equal to 2147483647 (2^31-1)."
+				},
+				"presentationHint": {
+					"type": "string",
+					"description": "An optional hint for how to present the source in the UI.\nA value of 'deemphasize' can be used to indicate that the source is not available or that it is skipped on stepping.",
+					"enum": [ "normal", "emphasize", "deemphasize" ]
+				},
+				"origin": {
+					"type": "string",
+					"description": "The (optional) origin of this source: possible values 'internal module', 'inlined content from source map', etc."
+				},
+				"sources": {
+					"type": "array",
+					"items": {
+						"$ref": "#/definitions/Source"
+					},
+					"description": "An optional list of sources that are related to this source. These may be the source that generated this source."
+				},
+				"adapterData": {
+					"type": [ "array", "boolean", "integer", "null", "number", "object", "string" ],
+					"description": "Optional data that a debug adapter might want to loop through the client.\nThe client should leave the data intact and persist it across sessions. The client should not interpret the data."
+				},
+				"checksums": {
+					"type": "array",
+					"items": {
+						"$ref": "#/definitions/Checksum"
+					},
+					"description": "The checksums associated with this file."
+				}
+			}
+		},
+
+		"StackFrame": {
+			"type": "object",
+			"description": "A Stackframe contains the source location.",
+			"properties": {
+				"id": {
+					"type": "integer",
+					"description": "An identifier for the stack frame. It must be unique across all threads.\nThis id can be used to retrieve the scopes of the frame with the 'scopesRequest' or to restart the execution of a stackframe."
+				},
+				"name": {
+					"type": "string",
+					"description": "The name of the stack frame, typically a method name."
+				},
+				"source": {
+					"$ref": "#/definitions/Source",
+					"description": "The optional source of the frame."
+				},
+				"line": {
+					"type": "integer",
+					"description": "The line within the file of the frame. If source is null or doesn't exist, line is 0 and must be ignored."
+				},
+				"column": {
+					"type": "integer",
+					"description": "The column within the line. If source is null or doesn't exist, column is 0 and must be ignored."
+				},
+				"endLine": {
+					"type": "integer",
+					"description": "An optional end line of the range covered by the stack frame."
+				},
+				"endColumn": {
+					"type": "integer",
+					"description": "An optional end column of the range covered by the stack frame."
+				},
+				"canRestart": {
+					"type": "boolean",
+					"description": "Indicates whether this frame can be restarted with the 'restart' request. Clients should only use this if the debug adapter supports the 'restart' request (capability 'supportsRestartRequest' is true)."
+				},
+				"instructionPointerReference": {
+					"type": "string",
+					"description": "Optional memory reference for the current instruction pointer in this frame."
+				},
+				"moduleId": {
+					"type": ["integer", "string"],
+					"description": "The module associated with this frame, if any."
+				},
+				"presentationHint": {
+					"type": "string",
+					"enum": [ "normal", "label", "subtle" ],
+					"description": "An optional hint for how to present this frame in the UI.\nA value of 'label' can be used to indicate that the frame is an artificial frame that is used as a visual label or separator. A value of 'subtle' can be used to change the appearance of a frame in a 'subtle' way."
+				}
+			},
+			"required": [ "id", "name", "line", "column" ]
+		},
+
+		"Scope": {
+			"type": "object",
+			"description": "A Scope is a named container for variables. Optionally a scope can map to a source or a range within a source.",
+			"properties": {
+				"name": {
+					"type": "string",
+					"description": "Name of the scope such as 'Arguments', 'Locals', or 'Registers'. This string is shown in the UI as is and can be translated."
+				},
+				"presentationHint": {
+					"type": "string",
+					"description": "An optional hint for how to present this scope in the UI. If this attribute is missing, the scope is shown with a generic UI.",
+					"_enum": [ "arguments", "locals", "registers" ],
+					"enumDescriptions": [
+						"Scope contains method arguments.",
+						"Scope contains local variables.",
+						"Scope contains registers. Only a single 'registers' scope should be returned from a 'scopes' request."
+					]
+				},
+				"variablesReference": {
+					"type": "integer",
+					"description": "The variables of this scope can be retrieved by passing the value of variablesReference to the VariablesRequest."
+				},
+				"namedVariables": {
+					"type": "integer",
+					"description": "The number of named variables in this scope.\nThe client can use this optional information to present the variables in a paged UI and fetch them in chunks."
+				},
+				"indexedVariables": {
+					"type": "integer",
+					"description": "The number of indexed variables in this scope.\nThe client can use this optional information to present the variables in a paged UI and fetch them in chunks."
+				},
+				"expensive": {
+					"type": "boolean",
+					"description": "If true, the number of variables in this scope is large or expensive to retrieve."
+				},
+				"source": {
+					"$ref": "#/definitions/Source",
+					"description": "Optional source for this scope."
+				},
+				"line": {
+					"type": "integer",
+					"description": "Optional start line of the range covered by this scope."
+				},
+				"column": {
+					"type": "integer",
+					"description": "Optional start column of the range covered by this scope."
+				},
+				"endLine": {
+					"type": "integer",
+					"description": "Optional end line of the range covered by this scope."
+				},
+				"endColumn": {
+					"type": "integer",
+					"description": "Optional end column of the range covered by this scope."
+				}
+			},
+			"required": [ "name", "variablesReference", "expensive" ]
+		},
+
+		"Variable": {
+			"type": "object",
+			"description": "A Variable is a name/value pair.\nOptionally a variable can have a 'type' that is shown if space permits or when hovering over the variable's name.\nAn optional 'kind' is used to render additional properties of the variable, e.g. different icons can be used to indicate that a variable is public or private.\nIf the value is structured (has children), a handle is provided to retrieve the children with the VariablesRequest.\nIf the number of named or indexed children is large, the numbers should be returned via the optional 'namedVariables' and 'indexedVariables' attributes.\nThe client can use this optional information to present the children in a paged UI and fetch them in chunks.",
+			"properties": {
+				"name": {
+					"type": "string",
+					"description": "The variable's name."
+				},
+				"value": {
+					"type": "string",
+					"description": "The variable's value. This can be a multi-line text, e.g. for a function the body of a function."
+				},
+				"type": {
+					"type": "string",
+					"description": "The type of the variable's value. Typically shown in the UI when hovering over the value.\nThis attribute should only be returned by a debug adapter if the client has passed the value true for the 'supportsVariableType' capability of the 'initialize' request."
+				},
+				"presentationHint": {
+					"$ref": "#/definitions/VariablePresentationHint",
+					"description": "Properties of a variable that can be used to determine how to render the variable in the UI."
+				},
+				"evaluateName": {
+					"type": "string",
+					"description": "Optional evaluatable name of this variable which can be passed to the 'EvaluateRequest' to fetch the variable's value."
+				},
+				"variablesReference": {
+					"type": "integer",
+					"description": "If variablesReference is > 0, the variable is structured and its children can be retrieved by passing variablesReference to the VariablesRequest."
+				},
+				"namedVariables": {
+					"type": "integer",
+					"description": "The number of named child variables.\nThe client can use this optional information to present the children in a paged UI and fetch them in chunks."
+				},
+				"indexedVariables": {
+					"type": "integer",
+					"description": "The number of indexed child variables.\nThe client can use this optional information to present the children in a paged UI and fetch them in chunks."
+				},
+				"memoryReference": {
+					"type": "string",
+					"description": "Optional memory reference for the variable if the variable represents executable code, such as a function pointer.\nThis attribute is only required if the client has passed the value true for the 'supportsMemoryReferences' capability of the 'initialize' request."
+				}
+			},
+			"required": [ "name", "value", "variablesReference" ]
+		},
+
+		"VariablePresentationHint": {
+			"type": "object",
+			"description": "Optional properties of a variable that can be used to determine how to render the variable in the UI.",
+			"properties": {
+				"kind": {
+					"description": "The kind of variable. Before introducing additional values, try to use the listed values.",
+					"type": "string",
+					"_enum": [ "property", "method", "class", "data", "event", "baseClass", "innerClass", "interface", "mostDerivedClass", "virtual", "dataBreakpoint" ],
+					"enumDescriptions": [
+						"Indicates that the object is a property.",
+						"Indicates that the object is a method.",
+						"Indicates that the object is a class.",
+						"Indicates that the object is data.",
+						"Indicates that the object is an event.",
+						"Indicates that the object is a base class.",
+						"Indicates that the object is an inner class.",
+						"Indicates that the object is an interface.",
+						"Indicates that the object is the most derived class.",
+						"Indicates that the object is virtual, that means it is a synthetic object introducedby the\nadapter for rendering purposes, e.g. an index range for large arrays.",
+						"Deprecated: Indicates that a data breakpoint is registered for the object. The 'hasDataBreakpoint' attribute should generally be used instead."
+					]
+				},
+				"attributes": {
+					"description": "Set of attributes represented as an array of strings. Before introducing additional values, try to use the listed values.",
+					"type": "array",
+					"items": {
+						"type": "string",
+						"_enum": [ "static", "constant", "readOnly", "rawString", "hasObjectId", "canHaveObjectId", "hasSideEffects", "hasDataBreakpoint" ],
+						"enumDescriptions": [
+							"Indicates that the object is static.",
+							"Indicates that the object is a constant.",
+							"Indicates that the object is read only.",
+							"Indicates that the object is a raw string.",
+							"Indicates that the object can have an Object ID created for it.",
+							"Indicates that the object has an Object ID associated with it.",
+							"Indicates that the evaluation had side effects.",
+							"Indicates that the object has its value tracked by a data breakpoint."
+						]
+					}
+				},
+				"visibility": {
+					"description": "Visibility of variable. Before introducing additional values, try to use the listed values.",
+					"type": "string",
+					"_enum": [ "public", "private", "protected", "internal", "final" ]
+				}
+			}
+		},
+
+		"BreakpointLocation": {
+			"type": "object",
+			"description": "Properties of a breakpoint location returned from the 'breakpointLocations' request.",
+			"properties": {
+				"line": {
+					"type": "integer",
+					"description": "Start line of breakpoint location."
+				},
+				"column": {
+					"type": "integer",
+					"description": "Optional start column of breakpoint location."
+				},
+				"endLine": {
+					"type": "integer",
+					"description": "Optional end line of breakpoint location if the location covers a range."
+				},
+				"endColumn": {
+					"type": "integer",
+					"description": "Optional end column of breakpoint location if the location covers a range."
+				}
+			},
+			"required": [ "line" ]
+		},
+
+		"SourceBreakpoint": {
+			"type": "object",
+			"description": "Properties of a breakpoint or logpoint passed to the setBreakpoints request.",
+			"properties": {
+				"line": {
+					"type": "integer",
+					"description": "The source line of the breakpoint or logpoint."
+				},
+				"column": {
+					"type": "integer",
+					"description": "An optional source column of the breakpoint."
+				},
+				"condition": {
+					"type": "string",
+					"description": "An optional expression for conditional breakpoints.\nIt is only honored by a debug adapter if the capability 'supportsConditionalBreakpoints' is true."
+				},
+				"hitCondition": {
+					"type": "string",
+					"description": "An optional expression that controls how many hits of the breakpoint are ignored.\nThe backend is expected to interpret the expression as needed.\nThe attribute is only honored by a debug adapter if the capability 'supportsHitConditionalBreakpoints' is true."
+				},
+				"logMessage": {
+					"type": "string",
+					"description": "If this attribute exists and is non-empty, the backend must not 'break' (stop)\nbut log the message instead. Expressions within {} are interpolated.\nThe attribute is only honored by a debug adapter if the capability 'supportsLogPoints' is true."
+				}
+			},
+			"required": [ "line" ]
+		},
+
+		"FunctionBreakpoint": {
+			"type": "object",
+			"description": "Properties of a breakpoint passed to the setFunctionBreakpoints request.",
+			"properties": {
+				"name": {
+					"type": "string",
+					"description": "The name of the function."
+				},
+				"condition": {
+					"type": "string",
+					"description": "An optional expression for conditional breakpoints.\nIt is only honored by a debug adapter if the capability 'supportsConditionalBreakpoints' is true."
+				},
+				"hitCondition": {
+					"type": "string",
+					"description": "An optional expression that controls how many hits of the breakpoint are ignored.\nThe backend is expected to interpret the expression as needed.\nThe attribute is only honored by a debug adapter if the capability 'supportsHitConditionalBreakpoints' is true."
+				}
+			},
+			"required": [ "name" ]
+		},
+
+		"DataBreakpointAccessType": {
+			"type": "string",
+			"description": "This enumeration defines all possible access types for data breakpoints.",
+			"enum": [ "read", "write", "readWrite" ]
+		},
+
+		"DataBreakpoint": {
+			"type": "object",
+			"description": "Properties of a data breakpoint passed to the setDataBreakpoints request.",
+			"properties": {
+				"dataId": {
+					"type": "string",
+					"description": "An id representing the data. This id is returned from the dataBreakpointInfo request."
+				},
+				"accessType": {
+					"$ref": "#/definitions/DataBreakpointAccessType",
+					"description": "The access type of the data."
+				},
+				"condition": {
+					"type": "string",
+					"description": "An optional expression for conditional breakpoints."
+				},
+				"hitCondition": {
+					"type": "string",
+					"description": "An optional expression that controls how many hits of the breakpoint are ignored.\nThe backend is expected to interpret the expression as needed."
+				}
+			},
+			"required": [ "dataId" ]
+		},
+
+		"InstructionBreakpoint": {
+			"type": "object",
+			"description": "Properties of a breakpoint passed to the setInstructionBreakpoints request",
+			"properties": {
+				"instructionReference": {
+					"type": "string",
+					"description": "The instruction reference of the breakpoint.\nThis should be a memory or instruction pointer reference from an EvaluateResponse, Variable, StackFrame, GotoTarget, or Breakpoint."
+				},
+				"offset": {
+					"type": "integer",
+					"description": "An optional offset from the instruction reference.\nThis can be negative."
+				},
+				"condition": {
+					"type": "string",
+					"description": "An optional expression for conditional breakpoints.\nIt is only honored by a debug adapter if the capability 'supportsConditionalBreakpoints' is true."
+				},
+				"hitCondition": {
+					"type": "string",
+					"description": "An optional expression that controls how many hits of the breakpoint are ignored.\nThe backend is expected to interpret the expression as needed.\nThe attribute is only honored by a debug adapter if the capability 'supportsHitConditionalBreakpoints' is true."
+				}
+			},
+			"required": [ "instructionReference" ]
+		},
+
+		"Breakpoint": {
+			"type": "object",
+			"description": "Information about a Breakpoint created in setBreakpoints, setFunctionBreakpoints, setInstructionBreakpoints, or setDataBreakpoints.",
+			"properties": {
+				"id": {
+					"type": "integer",
+					"description": "An optional identifier for the breakpoint. It is needed if breakpoint events are used to update or remove breakpoints."
+				},
+				"verified": {
+					"type": "boolean",
+					"description": "If true breakpoint could be set (but not necessarily at the desired location)."
+				},
+				"message": {
+					"type": "string",
+					"description": "An optional message about the state of the breakpoint.\nThis is shown to the user and can be used to explain why a breakpoint could not be verified."
+				},
+				"source": {
+					"$ref": "#/definitions/Source",
+					"description": "The source where the breakpoint is located."
+				},
+				"line": {
+					"type": "integer",
+					"description": "The start line of the actual range covered by the breakpoint."
+				},
+				"column": {
+					"type": "integer",
+					"description": "An optional start column of the actual range covered by the breakpoint."
+				},
+				"endLine": {
+					"type": "integer",
+					"description": "An optional end line of the actual range covered by the breakpoint."
+				},
+				"endColumn": {
+					"type": "integer",
+					"description": "An optional end column of the actual range covered by the breakpoint.\nIf no end line is given, then the end column is assumed to be in the start line."
+				},
+				"instructionReference": {
+					"type": "string",
+					"description": "An optional memory reference to where the breakpoint is set."
+				},
+				"offset": {
+					"type": "integer",
+					"description": "An optional offset from the instruction reference.\nThis can be negative."
+				}
+			},
+			"required": [ "verified" ]
+		},
+
+		"SteppingGranularity": {
+			"type": "string",
+			"description": "The granularity of one 'step' in the stepping requests 'next', 'stepIn', 'stepOut', and 'stepBack'.",
+			"enum": [ "statement", "line", "instruction" ],
+			"enumDescriptions": [
+				"The step should allow the program to run until the current statement has finished executing.\nThe meaning of a statement is determined by the adapter and it may be considered equivalent to a line.\nFor example 'for(int i = 0; i < 10; i++) could be considered to have 3 statements 'int i = 0', 'i < 10', and 'i++'.",
+				"The step should allow the program to run until the current source line has executed.",
+				"The step should allow one instruction to execute (e.g. one x86 instruction)."
+			]
+		},
+
+		"StepInTarget": {
+			"type": "object",
+			"description": "A StepInTarget can be used in the 'stepIn' request and determines into which single target the stepIn request should step.",
+			"properties": {
+				"id": {
+					"type": "integer",
+					"description": "Unique identifier for a stepIn target."
+				},
+				"label": {
+					"type": "string",
+					"description": "The name of the stepIn target (shown in the UI)."
+				}
+			},
+			"required": [ "id", "label" ]
+		},
+
+		"GotoTarget": {
+			"type": "object",
+			"description": "A GotoTarget describes a code location that can be used as a target in the 'goto' request.\nThe possible goto targets can be determined via the 'gotoTargets' request.",
+			"properties": {
+				"id": {
+					"type": "integer",
+					"description": "Unique identifier for a goto target. This is used in the goto request."
+				},
+				"label": {
+					"type": "string",
+					"description": "The name of the goto target (shown in the UI)."
+				},
+				"line": {
+					"type": "integer",
+					"description": "The line of the goto target."
+				},
+				"column": {
+					"type": "integer",
+					"description": "An optional column of the goto target."
+				},
+				"endLine": {
+					"type": "integer",
+					"description": "An optional end line of the range covered by the goto target."
+				},
+				"endColumn": {
+					"type": "integer",
+					"description": "An optional end column of the range covered by the goto target."
+				},
+				"instructionPointerReference": {
+					"type": "string",
+					"description": "Optional memory reference for the instruction pointer value represented by this target."
+				}
+			},
+			"required": [ "id", "label", "line" ]
+		},
+
+		"CompletionItem": {
+			"type": "object",
+			"description": "CompletionItems are the suggestions returned from the CompletionsRequest.",
+			"properties": {
+				"label": {
+					"type": "string",
+					"description": "The label of this completion item. By default this is also the text that is inserted when selecting this completion."
+				},
+				"text": {
+					"type": "string",
+					"description": "If text is not falsy then it is inserted instead of the label."
+				},
+				"sortText": {
+					"type": "string",
+					"description": "A string that should be used when comparing this item with other items. When `falsy` the label is used."
+				},
+				"type": {
+					"$ref": "#/definitions/CompletionItemType",
+					"description": "The item's type. Typically the client uses this information to render the item in the UI with an icon."
+				},
+				"start": {
+					"type": "integer",
+					"description": "This value determines the location (in the CompletionsRequest's 'text' attribute) where the completion text is added.\nIf missing the text is added at the location specified by the CompletionsRequest's 'column' attribute."
+				},
+				"length": {
+					"type": "integer",
+					"description": "This value determines how many characters are overwritten by the completion text.\nIf missing the value 0 is assumed which results in the completion text being inserted."
+				},
+				"selectionStart": {
+					"type": "integer",
+					"description": "Determines the start of the new selection after the text has been inserted (or replaced).\nThe start position must in the range 0 and length of the completion text.\nIf omitted the selection starts at the end of the completion text."
+				},
+				"selectionLength": {
+					"type": "integer",
+					"description": "Determines the length of the new selection after the text has been inserted (or replaced).\nThe selection can not extend beyond the bounds of the completion text.\nIf omitted the length is assumed to be 0."
+				}
+			},
+			"required": [ "label" ]
+		},
+
+		"CompletionItemType": {
+			"type": "string",
+			"description": "Some predefined types for the CompletionItem. Please note that not all clients have specific icons for all of them.",
+			"enum": [ "method", "function", "constructor", "field", "variable", "class", "interface", "module", "property", "unit", "value", "enum", "keyword", "snippet", "text", "color", "file", "reference", "customcolor" ]
+		},
+
+		"ChecksumAlgorithm": {
+			"type": "string",
+			"description": "Names of checksum algorithms that may be supported by a debug adapter.",
+			"enum": [ "MD5", "SHA1", "SHA256", "timestamp" ]
+		},
+
+		"Checksum": {
+			"type": "object",
+			"description": "The checksum of an item calculated by the specified algorithm.",
+			"properties": {
+				"algorithm": {
+					"$ref": "#/definitions/ChecksumAlgorithm",
+					"description": "The algorithm used to calculate this checksum."
+				},
+				"checksum": {
+					"type": "string",
+					"description": "Value of the checksum."
+				}
+			},
+			"required": [ "algorithm", "checksum" ]
+		},
+
+		"ValueFormat": {
+			"type": "object",
+			"description": "Provides formatting information for a value.",
+			"properties": {
+				"hex": {
+					"type": "boolean",
+					"description": "Display the value in hex."
+				}
+			}
+		},
+
+		"StackFrameFormat": {
+			"allOf": [ { "$ref": "#/definitions/ValueFormat" }, {
+				"type": "object",
+				"description": "Provides formatting information for a stack frame.",
+				"properties": {
+					"parameters": {
+						"type": "boolean",
+						"description": "Displays parameters for the stack frame."
+					},
+					"parameterTypes": {
+						"type": "boolean",
+						"description": "Displays the types of parameters for the stack frame."
+					},
+					"parameterNames": {
+						"type": "boolean",
+						"description": "Displays the names of parameters for the stack frame."
+					},
+					"parameterValues": {
+						"type": "boolean",
+						"description": "Displays the values of parameters for the stack frame."
+					},
+					"line": {
+						"type": "boolean",
+						"description": "Displays the line number of the stack frame."
+					},
+					"module": {
+						"type": "boolean",
+						"description": "Displays the module of the stack frame."
+					},
+					"includeAll": {
+						"type": "boolean",
+						"description": "Includes all stack frames, including those the debug adapter might otherwise hide."
+					}
+				}
+			}]
+		},
+
+		"ExceptionFilterOptions": {
+			"type": "object",
+			"description": "An ExceptionFilterOptions is used to specify an exception filter together with a condition for the setExceptionsFilter request.",
+			"properties": {
+				"filterId": {
+					"type": "string",
+					"description": "ID of an exception filter returned by the 'exceptionBreakpointFilters' capability."
+				},
+				"condition": {
+					"type": "string",
+					"description": "An optional expression for conditional exceptions.\nThe exception will break into the debugger if the result of the condition is true."
+				}
+			},
+			"required": [ "filterId" ]
+		},
+
+		"ExceptionOptions": {
+			"type": "object",
+			"description": "An ExceptionOptions assigns configuration options to a set of exceptions.",
+			"properties": {
+				"path": {
+					"type": "array",
+					"items": {
+						"$ref": "#/definitions/ExceptionPathSegment"
+					},
+					"description": "A path that selects a single or multiple exceptions in a tree. If 'path' is missing, the whole tree is selected.\nBy convention the first segment of the path is a category that is used to group exceptions in the UI."
+				},
+				"breakMode": {
+					"$ref": "#/definitions/ExceptionBreakMode",
+					"description": "Condition when a thrown exception should result in a break."
+				}
+			},
+			"required": [ "breakMode" ]
+		},
+
+		"ExceptionBreakMode": {
+			"type": "string",
+			"description": "This enumeration defines all possible conditions when a thrown exception should result in a break.\nnever: never breaks,\nalways: always breaks,\nunhandled: breaks when exception unhandled,\nuserUnhandled: breaks if the exception is not handled by user code.",
+			"enum": [ "never", "always", "unhandled", "userUnhandled" ]
+		},
+
+		"ExceptionPathSegment": {
+			"type": "object",
+			"description": "An ExceptionPathSegment represents a segment in a path that is used to match leafs or nodes in a tree of exceptions.\nIf a segment consists of more than one name, it matches the names provided if 'negate' is false or missing or\nit matches anything except the names provided if 'negate' is true.",
+			"properties": {
+				"negate": {
+					"type": "boolean",
+					"description": "If false or missing this segment matches the names provided, otherwise it matches anything except the names provided."
+				},
+				"names": {
+					"type": "array",
+					"items": {
+						"type": "string"
+					},
+					"description": "Depending on the value of 'negate' the names that should match or not match."
+				}
+			},
+			"required": [ "names" ]
+		},
+
+		"ExceptionDetails": {
+			"type": "object",
+			"description": "Detailed information about an exception that has occurred.",
+			"properties": {
+				"message": {
+					"type": "string",
+					"description": "Message contained in the exception."
+				},
+				"typeName": {
+					"type": "string",
+					"description": "Short type name of the exception object."
+				},
+				"fullTypeName": {
+					"type": "string",
+					"description": "Fully-qualified type name of the exception object."
+				},
+				"evaluateName": {
+					"type": "string",
+					"description": "Optional expression that can be evaluated in the current scope to obtain the exception object."
+				},
+				"stackTrace": {
+					"type": "string",
+					"description": "Stack trace at the time the exception was thrown."
+				},
+				"innerException": {
+					"type": "array",
+					"items": {
+						"$ref": "#/definitions/ExceptionDetails"
+					},
+					"description": "Details of the exception contained by this exception, if any."
+				}
+			}
+		},
+
+		"DisassembledInstruction": {
+			"type": "object",
+			"description": "Represents a single disassembled instruction.",
+			"properties": {
+				"address": {
+					"type": "string",
+					"description": "The address of the instruction. Treated as a hex value if prefixed with '0x', or as a decimal value otherwise."
+				},
+				"instructionBytes": {
+					"type": "string",
+					"description": "Optional raw bytes representing the instruction and its operands, in an implementation-defined format."
+				},
+				"instruction": {
+					"type": "string",
+					"description": "Text representing the instruction and its operands, in an implementation-defined format."
+				},
+				"symbol": {
+					"type": "string",
+					"description": "Name of the symbol that corresponds with the location of this instruction, if any."
+				},
+				"location": {
+					"$ref": "#/definitions/Source",
+					"description": "Source location that corresponds to this instruction, if any.\nShould always be set (if available) on the first instruction returned,\nbut can be omitted afterwards if this instruction maps to the same source file as the previous instruction."
+				},
+				"line": {
+					"type": "integer",
+					"description": "The line within the source location that corresponds to this instruction, if any."
+				},
+				"column": {
+					"type": "integer",
+					"description": "The column within the line that corresponds to this instruction, if any."
+				},
+				"endLine": {
+					"type": "integer",
+					"description": "The end line of the range that corresponds to this instruction, if any."
+				},
+				"endColumn": {
+					"type": "integer",
+					"description": "The end column of the range that corresponds to this instruction, if any."
+				}
+			},
+			"required": [ "address", "instruction" ]
+		},
+
+		"InvalidatedAreas": {
+			"type": "string",
+			"description": "Logical areas that can be invalidated by the 'invalidated' event.",
+			"_enum": [ "all", "stacks", "threads", "variables" ],
+			"enumDescriptions": [
+				"All previously fetched data has become invalid and needs to be refetched.",
+				"Previously fetched stack related data has become invalid and needs to be refetched.",
+				"Previously fetched thread related data has become invalid and needs to be refetched.",
+				"Previously fetched variable data has become invalid and needs to be refetched."
+			]
+		}
+
+	}
+}
diff --git a/pkg/dds/tool/dap/external_dap_spec/debugAdapterProtocol.license.txt b/pkg/dds/tool/dap/external_dap_spec/debugAdapterProtocol.license.txt
new file mode 100644
index 0000000..8a02f14
--- /dev/null
+++ b/pkg/dds/tool/dap/external_dap_spec/debugAdapterProtocol.license.txt
@@ -0,0 +1,23 @@
+debugAdapterProtocol.json is an unmodified copy of the DAP Specification,
+downloaded from:
+
+  https://raw.githubusercontent.com/microsoft/debug-adapter-protocol/gh-pages/debugAdapterProtocol.json
+
+The licence for this file is included below. This accompanying file is the
+version of the specification that was used to generate a portion of the Dart
+code used to support the protocol.
+
+To regenerate the generated code, run the script in "tool/dap/generate_all.dart"
+with no arguments. To download the latest version of the specification before
+regenerating the code, run the same script with the "--download" argument.
+
+---
+
+Copyright (c) Microsoft Corporation.
+ 
+All rights reserved. 
+
+Distributed under the following terms:
+
+1.	Documentation is licensed under the Creative Commons Attribution 3.0 United States License. Code is licensed under the MIT License.
+2.	This license does not grant you rights to use any trademarks or logos of Microsoft. For Microsoft’s general trademark guidelines, go to http://go.microsoft.com/fwlink/?LinkID=254653
diff --git a/pkg/dds/tool/dap/generate_all.dart b/pkg/dds/tool/dap/generate_all.dart
new file mode 100644
index 0000000..8fe4b60
--- /dev/null
+++ b/pkg/dds/tool/dap/generate_all.dart
@@ -0,0 +1,95 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:args/args.dart';
+import 'package:http/http.dart' as http;
+import 'package:path/path.dart' as path;
+
+import 'codegen.dart';
+import 'json_schema.dart';
+
+Future<void> main(List<String> arguments) async {
+  final args = argParser.parse(arguments);
+  if (args[argHelp]) {
+    print(argParser.usage);
+    return;
+  }
+
+  if (args[argDownload]) {
+    await downloadSpec();
+  }
+
+  final schemaContent = await File(specFile).readAsString();
+  final schemaJson = jsonDecode(schemaContent);
+  final schema = JsonSchema.fromJson(schemaJson);
+
+  final buffer = IndentableStringBuffer();
+  CodeGenerator().writeAll(buffer, schema);
+  final generatedCode = buffer.toString();
+  await File(generatedCodeFile)
+      .writeAsString('$codeFileHeader\n$generatedCode');
+
+  // Format the generated code.
+  await Process.run(Platform.resolvedExecutable, ['format', generatedCodeFile]);
+}
+
+const argDownload = 'download';
+const argHelp = 'help';
+const codeFileHeader = '''
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This code was auto-generated by tool/dap/generate_all.dart - do not hand-edit!
+
+import 'package:dds/src/dap/protocol_common.dart';
+import 'package:dds/src/dap/protocol_special.dart';
+''';
+final argParser = ArgParser()
+  ..addFlag(argHelp, hide: true)
+  ..addFlag(argDownload,
+      negatable: false,
+      abbr: 'd',
+      help: 'Download latest version of the DAP spec before generating types');
+final generatedCodeFile =
+    path.join(toolFolder, '../../lib/src/dap/protocol_generated.dart');
+final licenseFile = path.join(specFolder, 'debugAdapterProtocol.license.txt');
+final specFile = path.join(specFolder, 'debugAdapterProtocol.json');
+final specFolder = path.join(toolFolder, 'external_dap_spec');
+final specLicenseUri = Uri.parse(
+    'https://raw.githubusercontent.com/microsoft/debug-adapter-protocol/main/License.txt');
+final specUri = Uri.parse(
+    'https://raw.githubusercontent.com/microsoft/debug-adapter-protocol/gh-pages/debugAdapterProtocol.json');
+final toolFolder = path.dirname(Platform.script.toFilePath());
+
+Future<void> downloadSpec() async {
+  final specResp = await http.get(specUri);
+  final licenseResp = await http.get(specLicenseUri);
+
+  assert(specResp.statusCode == 200);
+  assert(licenseResp.statusCode == 200);
+
+  final licenseHeader = '''
+debugAdapterProtocol.json is an unmodified copy of the DAP Specification,
+downloaded from:
+
+  $specUri
+
+The licence for this file is included below. This accompanying file is the
+version of the specification that was used to generate a portion of the Dart
+code used to support the protocol.
+
+To regenerate the generated code, run the script in "tool/dap/generate_all.dart"
+with no arguments. To download the latest version of the specification before
+regenerating the code, run the same script with the "--download" argument.
+
+---
+''';
+
+  await File(specFile).writeAsString(specResp.body);
+  await File(licenseFile).writeAsString('$licenseHeader\n${licenseResp.body}');
+}
diff --git a/pkg/dds/tool/dap/json_schema.dart b/pkg/dds/tool/dap/json_schema.dart
new file mode 100644
index 0000000..123882e
--- /dev/null
+++ b/pkg/dds/tool/dap/json_schema.dart
@@ -0,0 +1,90 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:dds/src/dap/protocol_special.dart';
+
+class JsonSchema {
+  late final Uri dollarSchema;
+  late final Map<String, JsonType> definitions;
+
+  JsonSchema.fromJson(Map<String, Object?> json) {
+    dollarSchema = Uri.parse(json[r'$schema'] as String);
+    definitions = (json['definitions'] as Map<String, Object?>).map((key,
+            value) =>
+        MapEntry(key, JsonType.fromJson(this, value as Map<String, Object?>)));
+  }
+}
+
+class JsonType {
+  final JsonSchema root;
+  final List<JsonType>? allOf;
+  final List<JsonType>? oneOf;
+  final String? description;
+  final String? dollarRef;
+  final List<String>? enumValues;
+  final JsonType? items;
+  final Map<String, JsonType>? properties;
+  final List<String>? required;
+  final String? title;
+  final Either2<String, List<String>>? type;
+
+  JsonType.empty(this.root)
+      : allOf = null,
+        oneOf = null,
+        description = null,
+        dollarRef = null,
+        enumValues = null,
+        items = null,
+        properties = null,
+        required = null,
+        title = null,
+        type = null;
+
+  JsonType.fromJson(this.root, Map<String, Object?> json)
+      : allOf = json['allOf'] == null
+            ? null
+            : (json['allOf'] as List<Object?>)
+                .cast<Map<String, Object?>>()
+                .map((item) => JsonType.fromJson(root, item))
+                .toList(),
+        description = json['description'] as String?,
+        dollarRef = json[r'$ref'] as String?,
+        enumValues = (json['enum'] as List<Object?>?)?.cast<String>(),
+        items = json['items'] == null
+            ? null
+            : JsonType.fromJson(root, json['items'] as Map<String, Object?>),
+        oneOf = json['oneOf'] == null
+            ? null
+            : (json['oneOf'] as List<Object?>)
+                .cast<Map<String, Object?>>()
+                .map((item) => JsonType.fromJson(root, item))
+                .toList(),
+        properties = json['properties'] == null
+            ? null
+            : (json['properties'] as Map<String, Object?>).map((key, value) =>
+                MapEntry(key,
+                    JsonType.fromJson(root, value as Map<String, Object?>))),
+        required = (json['required'] as List<Object?>?)?.cast<String>(),
+        title = json['title'] as String?,
+        type = json['type'] == null
+            ? null
+            : json['type'] is String
+                ? Either2<String, List<String>>.t1(json['type'] as String)
+                : Either2<String, List<String>>.t2(
+                    (json['type'] as List<Object?>).cast<String>());
+
+  /// Creates a dummy type to represent a type that exists outside of the
+  /// generated code (in 'lib/src/dap/protocol_common.dart').
+  JsonType.named(this.root, String name)
+      : allOf = null,
+        oneOf = null,
+        description = null,
+        dollarRef = '#/definitions/$name',
+        enumValues = null,
+        items = null,
+        properties = null,
+        required = null,
+        title = null,
+        type = null;
+}
diff --git a/pkg/dds/tool/dap/json_schema_extensions.dart b/pkg/dds/tool/dap/json_schema_extensions.dart
new file mode 100644
index 0000000..a84cafd
--- /dev/null
+++ b/pkg/dds/tool/dap/json_schema_extensions.dart
@@ -0,0 +1,155 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:collection/collection.dart';
+
+import 'json_schema.dart';
+
+String _toDartType(String type) {
+  if (type.startsWith('#/definitions/')) {
+    return type.replaceAll('#/definitions/', '');
+  }
+  switch (type) {
+    case 'object':
+      return 'Map<String, Object?>';
+    case 'integer':
+      return 'int';
+    case 'number':
+      return 'num';
+    case 'string':
+      return 'String';
+    case 'boolean':
+      return 'bool';
+    case 'null':
+      return 'Null';
+    default:
+      return type;
+  }
+}
+
+String _toDartUnionType(List<String> types) {
+  const allLiteralTypes = {
+    'array',
+    'boolean',
+    'integer',
+    'null',
+    'number',
+    'object',
+    'string'
+  };
+  if (types.length == 7 && allLiteralTypes.containsAll(types)) {
+    return 'Object';
+  }
+  return 'Either${types.length}<${types.map(_toDartType).join(', ')}>';
+}
+
+extension JsonSchemaExtensions on JsonSchema {
+  JsonType typeFor(JsonType type) => type.dollarRef != null
+      // TODO(dantup): Do we need to support more than just refs to definitions?
+      ? definitions[type.refName]!
+      : type;
+
+  Map<String, JsonType> propertiesFor(JsonType type,
+      {bool includeBase = true}) {
+    // Merge this types direct properties with anything from the included
+    // (allOf) types, but excluding those that come from the base class.
+    final baseType = type.baseType;
+    final includedBaseTypes =
+        (type.allOf ?? []).where((t) => includeBase || t != baseType);
+    final properties = {
+      for (final other in includedBaseTypes) ...propertiesFor(typeFor(other)),
+      ...?type.properties,
+    };
+
+    return properties;
+  }
+}
+
+extension JsonTypeExtensions on JsonType {
+  String asDartType({bool isOptional = false}) {
+    final dartType = dollarRef != null
+        ? _toDartType(dollarRef!)
+        : oneOf != null
+            ? _toDartUnionType(oneOf!.map((item) => item.asDartType()).toList())
+            : type!.valueEquals('array')
+                ? 'List<${items!.asDartType()}>'
+                : type!.map(_toDartType, _toDartUnionType);
+
+    return isOptional ? '$dartType?' : dartType;
+  }
+
+  /// Whether this type can have any type of value (Object/dynamic/any).
+  bool get isAny => asDartType() == 'Object';
+
+  /// Whether this type represents a List.
+  bool get isList => type?.valueEquals('array') ?? false;
+
+  /// Whether this type is a simple value that does not need any special handling.
+  bool get isSimple {
+    const _dartSimpleTypes = {
+      'bool',
+      'int',
+      'num',
+      'String',
+      'Map<String, Object?>',
+      'Null',
+    };
+    return _dartSimpleTypes.contains(asDartType());
+  }
+
+  /// Whether this type is a Union type using JSON schema's "oneOf" of where its
+  /// [type] is a list of types.
+  bool get isUnion =>
+      oneOf != null || type != null && type!.map((_) => false, (_) => true);
+
+  /// Whether this type is a reference to another spec type (using `dollarRef`).
+  bool get isSpecType => dollarRef != null;
+
+  /// Whether [propertyName] is a required for this type or its base types.
+  bool requiresField(String propertyName) {
+    if (required?.contains(propertyName) ?? false) {
+      return true;
+    }
+    if (allOf?.any((type) => root.typeFor(type).requiresField(propertyName)) ??
+        false) {
+      return true;
+    }
+
+    return false;
+  }
+
+  /// The name of the type that this one references.
+  String get refName => dollarRef!.replaceAll('#/definitions/', '');
+
+  /// The literal value of this type, if it can have only one.
+  ///
+  /// These are represented in the spec using an enum with only a single value.
+  String? get literalValue => enumValues?.singleOrNull;
+
+  /// The base type for this type. Base types are inferred by a type using
+  /// allOf and the first listed type being a reference (dollarRef) to another
+  /// spec type.
+  JsonType? get baseType {
+    final all = allOf;
+    if (all != null && all.length > 1 && all.first.dollarRef != null) {
+      return all.first;
+    }
+    return null;
+  }
+
+  /// The list of possible types allowed by this union.
+  ///
+  /// May be represented using `oneOf` or a list of types in `type`.
+  List<JsonType> get unionTypes {
+    final types = oneOf ??
+        // Fabricate a union for types where "type" is an array of literal types:
+        // ['a', 'b']
+        type!.map(
+          (_) => throw 'unexpected non-union in isUnion condition',
+          (types) =>
+              types.map((t) => JsonType.fromJson(root, {'type': t})).toList(),
+        )!;
+    return types;
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index 2956b23..388009a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -1994,27 +1994,32 @@
 
     final Constant receiver = _evaluateSubexpression(node.receiver);
     if (receiver is AbortConstant) return receiver;
-    final List<Constant>? arguments =
+    final List<Constant>? positionalArguments =
         _evaluatePositionalArguments(node.arguments);
 
-    if (arguments == null) {
+    if (positionalArguments == null) {
       AbortConstant error = _gotError!;
       _gotError = null;
       return error;
     }
     assert(_gotError == null);
     // ignore: unnecessary_null_comparison
-    assert(arguments != null);
+    assert(positionalArguments != null);
 
     if (shouldBeUnevaluated) {
       return unevaluated(
           node,
-          new DynamicInvocation(node.kind, extract(receiver), node.name,
-              unevaluatedArguments(arguments, {}, node.arguments.types))
+          new DynamicInvocation(
+              node.kind,
+              extract(receiver),
+              node.name,
+              unevaluatedArguments(
+                  positionalArguments, {}, node.arguments.types))
             ..fileOffset = node.fileOffset);
     }
 
-    return _handleInvocation(node, node.name, receiver, arguments);
+    return _handleInvocation(node, node.name, receiver, positionalArguments,
+        arguments: node.arguments);
   }
 
   @override
@@ -2033,30 +2038,35 @@
 
     final Constant receiver = _evaluateSubexpression(node.receiver);
     if (receiver is AbortConstant) return receiver;
-    final List<Constant>? arguments =
+    final List<Constant>? positionalArguments =
         _evaluatePositionalArguments(node.arguments);
 
-    if (arguments == null) {
+    if (positionalArguments == null) {
       AbortConstant error = _gotError!;
       _gotError = null;
       return error;
     }
     assert(_gotError == null);
     // ignore: unnecessary_null_comparison
-    assert(arguments != null);
+    assert(positionalArguments != null);
 
     if (shouldBeUnevaluated) {
       return unevaluated(
           node,
-          new InstanceInvocation(node.kind, extract(receiver), node.name,
-              unevaluatedArguments(arguments, {}, node.arguments.types),
+          new InstanceInvocation(
+              node.kind,
+              extract(receiver),
+              node.name,
+              unevaluatedArguments(
+                  positionalArguments, {}, node.arguments.types),
               functionType: node.functionType,
               interfaceTarget: node.interfaceTarget)
             ..fileOffset = node.fileOffset
             ..flags = node.flags);
     }
 
-    return _handleInvocation(node, node.name, receiver, arguments);
+    return _handleInvocation(node, node.name, receiver, positionalArguments,
+        arguments: node.arguments);
   }
 
   @override
@@ -2181,9 +2191,9 @@
     }
   }
 
-  Constant _handleInvocation(
-      Expression node, Name name, Constant receiver, List<Constant> arguments,
-      {List<DartType>? typeArguments, Map<String, Constant>? namedArguments}) {
+  Constant _handleInvocation(Expression node, Name name, Constant receiver,
+      List<Constant> positionalArguments,
+      {required Arguments arguments}) {
     final String op = name.text;
 
     // TODO(kallentu): Handle all constant toString methods.
@@ -2195,15 +2205,15 @@
 
     // Handle == and != first (it's common between all types). Since `a != b` is
     // parsed as `!(a == b)` it is handled implicitly through ==.
-    if (arguments.length == 1 && op == '==') {
-      final Constant right = arguments[0];
+    if (positionalArguments.length == 1 && op == '==') {
+      final Constant right = positionalArguments[0];
       return _handleEquals(node, receiver, right);
     }
 
     // This is a white-listed set of methods we need to support on constants.
     if (receiver is StringConstant) {
-      if (arguments.length == 1) {
-        final Constant other = arguments[0];
+      if (positionalArguments.length == 1) {
+        final Constant other = positionalArguments[0];
         switch (op) {
           case '+':
             if (other is StringConstant) {
@@ -2240,10 +2250,10 @@
         }
       }
     } else if (intFolder.isInt(receiver)) {
-      if (arguments.length == 0) {
+      if (positionalArguments.length == 0) {
         return canonicalize(intFolder.foldUnaryOperator(node, op, receiver));
-      } else if (arguments.length == 1) {
-        final Constant other = arguments[0];
+      } else if (positionalArguments.length == 1) {
+        final Constant other = positionalArguments[0];
         if (intFolder.isInt(other)) {
           return canonicalize(
               intFolder.foldBinaryOperator(node, op, receiver, other));
@@ -2284,13 +2294,13 @@
                 receiver.getType(_staticTypeContext!),
                 isNonNullableByDefault));
       }
-      if (arguments.length == 0) {
+      if (positionalArguments.length == 0) {
         switch (op) {
           case 'unary-':
             return canonicalize(new DoubleConstant(-receiver.value));
         }
-      } else if (arguments.length == 1) {
-        final Constant other = arguments[0];
+      } else if (positionalArguments.length == 1) {
+        final Constant other = positionalArguments[0];
 
         if (other is IntConstant || other is DoubleConstant) {
           final num value = (other as PrimitiveConstant<num>).value;
@@ -2307,8 +2317,8 @@
                 isNonNullableByDefault));
       }
     } else if (receiver is BoolConstant) {
-      if (arguments.length == 1) {
-        final Constant other = arguments[0];
+      if (positionalArguments.length == 1) {
+        final Constant other = positionalArguments[0];
         if (other is BoolConstant) {
           switch (op) {
             case '|':
@@ -2326,8 +2336,8 @@
     } else if (receiver is NullConstant) {
       return createErrorConstant(node, messageConstEvalNullValue);
     } else if (receiver is ListConstant && enableConstFunctions) {
-      if (arguments.length == 1) {
-        final Constant other = arguments[0];
+      if (positionalArguments.length == 1) {
+        final Constant other = positionalArguments[0];
         switch (op) {
           case '[]':
             int? index = intFolder.asInt(other);
@@ -2355,8 +2365,8 @@
         }
       }
     } else if (receiver is MapConstant && enableConstFunctions) {
-      if (arguments.length == 1) {
-        final Constant other = arguments[0];
+      if (positionalArguments.length == 1) {
+        final Constant other = positionalArguments[0];
         switch (op) {
           case '[]':
             for (ConstantMapEntry entry in receiver.entries) {
@@ -2367,41 +2377,70 @@
             return new NullConstant();
         }
       }
-    } else if (receiver is InstanceConstant && enableConstFunctions) {
-      final Class instanceClass = receiver.classNode;
-      assert(typeEnvironment.hierarchy is ClassHierarchy);
-      final Member member = (typeEnvironment.hierarchy as ClassHierarchy)
-          .getDispatchTarget(instanceClass, name)!;
-      final FunctionNode? function = member.function;
-
-      // TODO(kallentu): Implement [Object] class methods which have backend
-      // specific functions that cannot be run by the constant evaluator.
-      final bool isObjectMember = member.enclosingClass != null &&
-          member.enclosingClass!.name == "Object";
-      if (function != null && !isObjectMember) {
-        // TODO(johnniwinther): Make [typeArguments] and [namedArguments]
-        // required and non-nullable.
-        return withNewInstanceBuilder(instanceClass, typeArguments!, () {
-          final EvaluationEnvironment newEnv = new EvaluationEnvironment();
-          for (int i = 0; i < instanceClass.typeParameters.length; i++) {
-            newEnv.addTypeParameterValue(
-                instanceClass.typeParameters[i], receiver.typeArguments[i]);
-          }
-
-          // Ensure that fields are visible for instance access.
-          receiver.fieldValues.forEach((Reference fieldRef, Constant value) =>
-              instanceBuilder!.setFieldValue(fieldRef.asField, value));
-          return _handleFunctionInvocation(
-              function, receiver.typeArguments, arguments, namedArguments!,
-              functionEnvironment: newEnv);
-        });
+    } else if (enableConstFunctions) {
+      // Evaluate type arguments of the method invoked.
+      List<DartType>? typeArguments = _evaluateTypeArguments(node, arguments);
+      if (typeArguments == null) {
+        AbortConstant error = _gotError!;
+        _gotError = null;
+        return error;
       }
+      assert(_gotError == null);
+      // ignore: unnecessary_null_comparison
+      assert(typeArguments != null);
 
-      switch (op) {
-        case 'toString':
-          // Default value for toString() of instances.
-          return new StringConstant(
-              "Instance of '${receiver.classReference.toStringInternal()}'");
+      // Evaluate named arguments of the method invoked.
+      final Map<String, Constant>? namedArguments =
+          _evaluateNamedArguments(arguments);
+      if (namedArguments == null) {
+        AbortConstant error = _gotError!;
+        _gotError = null;
+        return error;
+      }
+      assert(_gotError == null);
+      // ignore: unnecessary_null_comparison
+      assert(namedArguments != null);
+
+      if (receiver is FunctionValue && name == Name.callName) {
+        return _handleFunctionInvocation(receiver.function, typeArguments,
+            positionalArguments, namedArguments,
+            functionEnvironment: receiver.environment);
+      } else if (receiver is InstanceConstant) {
+        final Class instanceClass = receiver.classNode;
+        assert(typeEnvironment.hierarchy is ClassHierarchy);
+        final Member member = (typeEnvironment.hierarchy as ClassHierarchy)
+            .getDispatchTarget(instanceClass, name)!;
+        final FunctionNode? function = member.function;
+
+        // TODO(kallentu): Implement [Object] class methods which have backend
+        // specific functions that cannot be run by the constant evaluator.
+        final bool isObjectMember = member.enclosingClass != null &&
+            member.enclosingClass!.name == "Object";
+        if (function != null && !isObjectMember) {
+          // TODO(johnniwinther): Make [typeArguments] and [namedArguments]
+          // required and non-nullable.
+          return withNewInstanceBuilder(instanceClass, typeArguments, () {
+            final EvaluationEnvironment newEnv = new EvaluationEnvironment();
+            for (int i = 0; i < instanceClass.typeParameters.length; i++) {
+              newEnv.addTypeParameterValue(
+                  instanceClass.typeParameters[i], receiver.typeArguments[i]);
+            }
+
+            // Ensure that fields are visible for instance access.
+            receiver.fieldValues.forEach((Reference fieldRef, Constant value) =>
+                instanceBuilder!.setFieldValue(fieldRef.asField, value));
+            return _handleFunctionInvocation(function, receiver.typeArguments,
+                positionalArguments, namedArguments,
+                functionEnvironment: newEnv);
+          });
+        }
+
+        switch (op) {
+          case 'toString':
+            // Default value for toString() of instances.
+            return new StringConstant(
+                "Instance of '${receiver.classReference.toStringInternal()}'");
+        }
       }
     }
 
@@ -2428,51 +2467,17 @@
     final Constant receiver = _evaluateSubexpression(node.receiver);
     if (receiver is AbortConstant) return receiver;
 
-    final List<Constant>? arguments =
+    final List<Constant>? positionalArguments =
         _evaluatePositionalArguments(node.arguments);
 
-    if (arguments == null) {
+    if (positionalArguments == null) {
       AbortConstant error = _gotError!;
       _gotError = null;
       return error;
     }
     assert(_gotError == null);
     // ignore: unnecessary_null_comparison
-    assert(arguments != null);
-
-    if (enableConstFunctions) {
-      // Evaluate type arguments of the method invoked.
-      List<DartType>? types = _evaluateTypeArguments(node, node.arguments);
-      if (types == null) {
-        AbortConstant error = _gotError!;
-        _gotError = null;
-        return error;
-      }
-      assert(_gotError == null);
-      // ignore: unnecessary_null_comparison
-      assert(types != null);
-
-      // Evaluate named arguments of the method invoked.
-      final Map<String, Constant>? named =
-          _evaluateNamedArguments(node.arguments);
-      if (named == null) {
-        AbortConstant error = _gotError!;
-        _gotError = null;
-        return error;
-      }
-      assert(_gotError == null);
-      // ignore: unnecessary_null_comparison
-      assert(named != null);
-
-      if (receiver is FunctionValue) {
-        return _handleFunctionInvocation(
-            receiver.function, types, arguments, named,
-            functionEnvironment: receiver.environment);
-      }
-
-      return _handleInvocation(node, node.name, receiver, arguments,
-          typeArguments: types, namedArguments: named);
-    }
+    assert(positionalArguments != null);
 
     if (shouldBeUnevaluated) {
       return unevaluated(
@@ -2480,13 +2485,15 @@
           new MethodInvocation(
               extract(receiver),
               node.name,
-              unevaluatedArguments(arguments, {}, node.arguments.types),
+              unevaluatedArguments(
+                  positionalArguments, {}, node.arguments.types),
               node.interfaceTarget)
             ..fileOffset = node.fileOffset
             ..flags = node.flags);
     }
 
-    return _handleInvocation(node, node.name, receiver, arguments);
+    return _handleInvocation(node, node.name, receiver, positionalArguments,
+        arguments: node.arguments);
   }
 
   @override
diff --git a/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.expect b/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.expect
index 979b373..5ddce97 100644
--- a/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.expect
+++ b/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.expect
@@ -76,6 +76,6 @@
   #C2 = TypeLiteralConstant(<T extends core::Object? = dynamic>() →* void)
   #C3 = TypeLiteralConstant(<T extends core::Object? = dynamic>() →* T*)
   #C4 = TypeLiteralConstant(<T extends core::Object? = dynamic>(T*) →* void)
-  #C5 = TypeLiteralConstant(<T extends <S extends core::Object? = dynamic>(S*) →* S*>(T*) →* T*)
-  #C6 = TypeLiteralConstant(<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T*, S*, <V extends S*, U extends core::Object? = dynamic>(T*, U*, V*, core::Map<S*, U*>*) →* V*) →* T*)
+  #C5 = TypeLiteralConstant(<T extends <S extends core::Object? = dynamic>(S*) →* S* = dynamic>(T*) →* T*)
+  #C6 = TypeLiteralConstant(<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T*, S*, <V extends S* = dynamic, U extends core::Object? = dynamic>(T*, U*, V*, core::Map<S*, U*>*) →* V*) →* T*)
 }
diff --git a/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.transformed.expect b/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.transformed.expect
index 979b373..5ddce97 100644
--- a/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.transformed.expect
@@ -76,6 +76,6 @@
   #C2 = TypeLiteralConstant(<T extends core::Object? = dynamic>() →* void)
   #C3 = TypeLiteralConstant(<T extends core::Object? = dynamic>() →* T*)
   #C4 = TypeLiteralConstant(<T extends core::Object? = dynamic>(T*) →* void)
-  #C5 = TypeLiteralConstant(<T extends <S extends core::Object? = dynamic>(S*) →* S*>(T*) →* T*)
-  #C6 = TypeLiteralConstant(<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T*, S*, <V extends S*, U extends core::Object? = dynamic>(T*, U*, V*, core::Map<S*, U*>*) →* V*) →* T*)
+  #C5 = TypeLiteralConstant(<T extends <S extends core::Object? = dynamic>(S*) →* S* = dynamic>(T*) →* T*)
+  #C6 = TypeLiteralConstant(<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T*, S*, <V extends S* = dynamic, U extends core::Object? = dynamic>(T*, U*, V*, core::Map<S*, U*>*) →* V*) →* T*)
 }
diff --git a/pkg/front_end/testcases/nnbd/issue44857.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue44857.dart.weak.expect
index bfb240b..528dcbd 100644
--- a/pkg/front_end/testcases/nnbd/issue44857.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue44857.dart.weak.expect
@@ -9,5 +9,5 @@
 }
 
 constants  {
-  #C1 = TypeLiteralConstant((<T extends Never*>(Never*) →* void) →* Never*)
+  #C1 = TypeLiteralConstant((<T extends Never* = dynamic>(Never*) →* void) →* Never*)
 }
diff --git a/pkg/front_end/testcases/nnbd/issue44857.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue44857.dart.weak.transformed.expect
index e19c801..c8b0ca6 100644
--- a/pkg/front_end/testcases/nnbd/issue44857.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue44857.dart.weak.transformed.expect
@@ -9,7 +9,7 @@
 }
 
 constants  {
-  #C1 = TypeLiteralConstant((<T extends Never*>(Never*) →* void) →* Never*)
+  #C1 = TypeLiteralConstant((<T extends Never* = dynamic>(Never*) →* void) →* Never*)
 }
 
 Extra constant evaluation status:
diff --git a/pkg/kernel/lib/src/const_canonical_type.dart b/pkg/kernel/lib/src/const_canonical_type.dart
index 4c00536..fe1e7c6 100644
--- a/pkg/kernel/lib/src/const_canonical_type.dart
+++ b/pkg/kernel/lib/src/const_canonical_type.dart
@@ -2,11 +2,50 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE.md file.
 
-import 'package:kernel/src/bounds_checks.dart';
-
 import '../ast.dart';
 import '../core_types.dart';
-import '../type_algebra.dart';
+
+import 'replacement_visitor.dart';
+
+class _ConstCanonicalTypeVisitor extends ReplacementVisitor {
+  final CoreTypes coreTypes;
+  final bool isNonNullableByDefault;
+
+  _ConstCanonicalTypeVisitor(this.coreTypes,
+      {required this.isNonNullableByDefault});
+
+  @override
+  DartType? visitDynamicType(DynamicType node, int variance) {
+    // CONST_CANONICAL_TYPE(T) = T if T is dynamic, void, Null
+    return null;
+  }
+
+  @override
+  DartType? visitVoidType(VoidType node, int variance) {
+    // CONST_CANONICAL_TYPE(T) = T if T is dynamic, void, Null
+    return null;
+  }
+
+  @override
+  DartType? visitNullType(NullType node, int variance) {
+    // CONST_CANONICAL_TYPE(T) = T if T is dynamic, void, Null
+    return null;
+  }
+
+  @override
+  Nullability? visitNullability(DartType node) {
+    if (node.declaredNullability == Nullability.nullable ||
+        node.declaredNullability == Nullability.legacy) {
+      return null;
+    } else if (node.declaredNullability == Nullability.nonNullable ||
+        node.declaredNullability == Nullability.undetermined) {
+      return Nullability.legacy;
+    } else {
+      throw new StateError("Unhandled '${node.declaredNullability}' "
+          "of a '${node.runtimeType}'.");
+    }
+  }
+}
 
 /// Computes CONST_CANONICAL_TYPE
 ///
@@ -14,206 +53,11 @@
 /// https://github.com/dart-lang/language/blob/master/accepted/future-releases/nnbd/feature-specification.md#constant-instances
 DartType? computeConstCanonicalType(DartType type, CoreTypes coreTypes,
     {required bool isNonNullableByDefault}) {
-  // TODO(johnniwinther,dmitryas): Support returning `null` when the resulting
-  // type is the same as the input type.
-  return _computeConstCanonicalType(type, coreTypes,
-      isNonNullableByDefault: isNonNullableByDefault);
-}
-
-DartType _computeConstCanonicalType(DartType type, CoreTypes coreTypes,
-    {required bool isNonNullableByDefault}) {
   // ignore: unnecessary_null_comparison
   assert(isNonNullableByDefault != null);
 
-  if (type is InvalidType) {
-    return type;
-  }
-
-  // CONST_CANONICAL_TYPE(T) = T if T is dynamic, void, Null
-  if (type is DynamicType || type is VoidType || type is NullType) {
-    return type;
-  }
-
-  // CONST_CANONICAL_TYPE(T) = T* if T is Never or Object
-  if (type is NeverType &&
-      type.declaredNullability == Nullability.nonNullable) {
-    return const NeverType.legacy();
-  }
-  if (type == coreTypes.objectNonNullableRawType) {
-    return coreTypes.objectLegacyRawType;
-  }
-
-  // CONST_CANONICAL_TYPE(FutureOr<T>) = FutureOr<S>*
-  // where S is CONST_CANONICAL_TYPE(T)
-  if (type is FutureOrType &&
-      isTypeWithoutNullabilityMarker(type,
-          isNonNullableByDefault: isNonNullableByDefault)) {
-    return new FutureOrType(
-        _computeConstCanonicalType(type.typeArgument, coreTypes,
-            isNonNullableByDefault: isNonNullableByDefault),
-        Nullability.legacy);
-  }
-
-  // CONST_CANONICAL_TYPE(T?) =
-  // let S be CONST_CANONICAL_TYPE(T)
-  // if S is R* then R?
-  // else S?
-  if (isNullableTypeConstructorApplication(type)) {
-    return _computeConstCanonicalType(
-            computeTypeWithoutNullabilityMarker(type,
-                isNonNullableByDefault: isNonNullableByDefault),
-            coreTypes,
-            isNonNullableByDefault: isNonNullableByDefault)
-        .withDeclaredNullability(Nullability.nullable);
-  }
-
-  // CONST_CANONICAL_TYPE(T*) = CONST_CANONICAL_TYPE(T)
-  if (isLegacyTypeConstructorApplication(type,
-      isNonNullableByDefault: isNonNullableByDefault)) {
-    return _computeConstCanonicalType(
-        computeTypeWithoutNullabilityMarker(type,
-            isNonNullableByDefault: isNonNullableByDefault),
-        coreTypes,
-        isNonNullableByDefault: isNonNullableByDefault);
-  }
-
-  // CONST_CANONICAL_TYPE(X extends T) = X*
-  if (type is TypeParameterType && type.promotedBound == null) {
-    return type.withDeclaredNullability(Nullability.legacy);
-  }
-
-  // CONST_CANONICAL_TYPE(X & T) =
-  // This case should not occur, since intersection types are not permitted as
-  // generic arguments.
-  assert(!(type is TypeParameterType && type.promotedBound != null),
-      "Intersection types are not permitted as generic arguments: '${type}'.");
-
-  // CONST_CANONICAL_TYPE(C<T0, ..., Tn>) = C<R0, ..., Rn>*
-  // where Ri is CONST_CANONICAL_TYPE(Ti)
-  // Note this includes the case of an interface type with no generic parameters
-  // (e.g int).
-  if (type is InterfaceType) {
-    assert(type.declaredNullability == Nullability.nonNullable);
-    List<DartType> typeArguments;
-    if (type.typeArguments.isEmpty) {
-      typeArguments = const <DartType>[];
-    } else {
-      typeArguments =
-          new List<DartType>.of(type.typeArguments, growable: false);
-      for (int i = 0; i < typeArguments.length; ++i) {
-        typeArguments[i] = _computeConstCanonicalType(
-            typeArguments[i], coreTypes,
-            isNonNullableByDefault: isNonNullableByDefault);
-      }
-    }
-    return new InterfaceType(type.classNode, Nullability.legacy, typeArguments);
-  }
-
-  // CONST_CANONICAL_TYPE(R Function<X extends B>(S)) = F*
-  // where F = R1 Function<X extends B1>(S1)
-  // and R1 = CONST_CANONICAL_TYPE(R)
-  // and B1 = CONST_CANONICAL_TYPE(B)
-  // and S1 = CONST_CANONICAL_TYPE(S)
-  // Note, this generalizes to arbitrary number of type and term parameters.
-  if (type is FunctionType) {
-    assert(type.declaredNullability == Nullability.nonNullable);
-
-    List<TypeParameter> canonicalizedTypeParameters;
-    Substitution? substitution;
-    if (type.typeParameters.isEmpty) {
-      canonicalizedTypeParameters = const <TypeParameter>[];
-      substitution = null;
-    } else {
-      FreshTypeParameters freshTypeParameters =
-          getFreshTypeParameters(type.typeParameters);
-      substitution = freshTypeParameters.substitution;
-      canonicalizedTypeParameters = freshTypeParameters.freshTypeParameters;
-      for (TypeParameter parameter in canonicalizedTypeParameters) {
-        parameter.bound = _computeConstCanonicalType(parameter.bound, coreTypes,
-            isNonNullableByDefault: isNonNullableByDefault);
-      }
-      List<DartType> defaultTypes = calculateBoundsInternal(
-          canonicalizedTypeParameters, coreTypes.objectClass,
-          isNonNullableByDefault: isNonNullableByDefault);
-      for (int i = 0; i < canonicalizedTypeParameters.length; ++i) {
-        canonicalizedTypeParameters[i].defaultType = defaultTypes[i];
-      }
-    }
-
-    List<DartType> canonicalizedPositionalParameters;
-    if (type.positionalParameters.isEmpty) {
-      canonicalizedPositionalParameters = const <DartType>[];
-    } else {
-      canonicalizedPositionalParameters =
-          new List<DartType>.of(type.positionalParameters, growable: false);
-      for (int i = 0; i < canonicalizedPositionalParameters.length; ++i) {
-        DartType canonicalized = _computeConstCanonicalType(
-            canonicalizedPositionalParameters[i], coreTypes,
-            isNonNullableByDefault: isNonNullableByDefault);
-        if (substitution != null) {
-          canonicalized = substitution.substituteType(canonicalized);
-        }
-        canonicalizedPositionalParameters[i] = canonicalized;
-      }
-    }
-
-    List<NamedType> canonicalizedNamedParameters;
-    if (type.namedParameters.isEmpty) {
-      canonicalizedNamedParameters = const <NamedType>[];
-    } else {
-      canonicalizedNamedParameters =
-          new List<NamedType>.of(type.namedParameters, growable: false);
-      for (int i = 0; i < canonicalizedNamedParameters.length; ++i) {
-        DartType canonicalized = _computeConstCanonicalType(
-            canonicalizedNamedParameters[i].type, coreTypes,
-            isNonNullableByDefault: isNonNullableByDefault);
-        if (substitution != null) {
-          canonicalized = substitution.substituteType(canonicalized);
-        }
-        canonicalizedNamedParameters[i] = new NamedType(
-            canonicalizedNamedParameters[i].name, canonicalized,
-            isRequired: canonicalizedNamedParameters[i].isRequired);
-      }
-    }
-
-    DartType canonicalizedReturnType = _computeConstCanonicalType(
-        type.returnType, coreTypes,
-        isNonNullableByDefault: isNonNullableByDefault);
-    if (substitution != null) {
-      canonicalizedReturnType =
-          substitution.substituteType(canonicalizedReturnType);
-    }
-
-    // Canonicalize typedef type, just in case.
-    TypedefType? canonicalizedTypedefType;
-    TypedefType? typedefType = type.typedefType;
-    if (typedefType == null) {
-      canonicalizedTypedefType = null;
-    } else {
-      List<DartType> canonicalizedTypeArguments;
-      if (typedefType.typeArguments.isEmpty) {
-        canonicalizedTypeArguments = const <DartType>[];
-      } else {
-        canonicalizedTypeArguments =
-            new List<DartType>.of(typedefType.typeArguments, growable: false);
-        for (int i = 0; i < canonicalizedTypeArguments.length; ++i) {
-          canonicalizedTypeArguments[i] = _computeConstCanonicalType(
-              canonicalizedTypeArguments[i], coreTypes,
-              isNonNullableByDefault: isNonNullableByDefault);
-        }
-      }
-      canonicalizedTypedefType = new TypedefType(typedefType.typedefNode,
-          Nullability.legacy, canonicalizedTypeArguments);
-    }
-
-    return new FunctionType(canonicalizedPositionalParameters,
-        canonicalizedReturnType, Nullability.legacy,
-        namedParameters: canonicalizedNamedParameters,
-        typeParameters: canonicalizedTypeParameters,
-        requiredParameterCount: type.requiredParameterCount,
-        typedefType: canonicalizedTypedefType);
-  }
-
-  throw new StateError(
-      "Unhandled '${type.runtimeType}' in 'computeConstCanonicalType'.");
+  return type.accept1(
+      new _ConstCanonicalTypeVisitor(coreTypes,
+          isNonNullableByDefault: isNonNullableByDefault),
+      Variance.covariant);
 }
diff --git a/tools/VERSION b/tools/VERSION
index 89bbb25..63d4572 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 138
+PRERELEASE 139
 PRERELEASE_PATCH 0
\ No newline at end of file
