anchor.diff:      builder.add(
           sublist(latestCrashData, offset + crashingAt, latestCrashData.length));
       candidate = builder.takeBytes();
  -    if (!await crashesOnCompile(
  -        fs, main, candidate, compilerContext, initialComponent)) {
  +    fs.data[uri] = candidate;
  +    if (!await crashesOnCompile(initialComponent)) {
         throw "Error in binary search.";
       }
       latestCrashData = candidate;
     }
  -  return latestCrashData;
  -}
  -
  -Future<Uint8List> deleteLines(Uint8List data, MemoryFileSystem fs, Uri main,
  -    CompilerContext compilerContext, Component initialComponent) async {
  +
  +  fs.data[uri] = latestCrashData;
  +}
  +
  +void _tryToRemoveUnreferencedFileContent(Component initialComponent) async {
  +  // Check if there now are any unused files.
  +  if (_latestComponent == null) return;
  +  Set<Uri> neededUris = _latestComponent.uriToSource.keys.toSet();
  +  Map<Uri, Uint8List> copy = new Map.from(fs.data);
  +  bool removedSome = false;
  +  for (MapEntry<Uri, Uint8List> entry in fs.data.entries) {
  +    if (entry.value == null || entry.value.isEmpty) continue;
  +    if (!entry.key.toString().endsWith(".dart")) continue;
  +    if (!neededUris.contains(entry.key)) {
  +      fs.data[entry.key] = new Uint8List(0);
  +      print(" => Can probably also delete ${entry.key}");
  +      removedSome = true;
  +    }
  +  }
  +  if (removedSome) {
  +    if (await crashesOnCompile(initialComponent)) {
  +      print(" => Yes; Could remove those too!");
  +    } else {
  +      print(" => No; Couldn't remove those too!");
  +      fs.data.clear();
  +      fs.data.addAll(copy);
  +    }
  +  }
  +}
  +
  +void deleteContent(List<Uri> uris, int uriIndex, bool limitTo1,
  +    Component initialComponent) async {
  +  if (!limitTo1) {
  +    Map<Uri, Uint8List> copy = new Map.from(fs.data);
  +    // Try to remove content of i and the next 9 (10 files in total).
  +    for (int j = uriIndex; j < uriIndex + 10 && j < uris.length; j++) {
  +      Uri uri = uris[j];
  +      fs.data[uri] = new Uint8List(0);
  +    }
  +    if (!await crashesOnCompile(initialComponent)) {
  +      // Couldn't delete all 10 files. Restore and try the single one.
  +      fs.data.clear();
  +      fs.data.addAll(copy);
  +    } else {
  +      for (int j = uriIndex; j < uriIndex + 10 && j < uris.length; j++) {
  +        Uri uri = uris[j];
  +        print("Can delete all content of file $uri");
  +      }
  +      await _tryToRemoveUnreferencedFileContent(initialComponent);
  +      return;
  +    }
  +  }
  +
  +  Uri uri = uris[uriIndex];
  +  Uint8List data = fs.data[uri];
  +  fs.data[uri] = new Uint8List(0);
  +  if (!await crashesOnCompile(initialComponent)) {
  +    print("Can't delete all content of file $uri -- keeping it (for now)");
  +    fs.data[uri] = data;
  +  } else {
  +    print("Can delete all content of file $uri");
  +    await _tryToRemoveUnreferencedFileContent(initialComponent);
  +  }
  +}
  +
  +void deleteLines(Uri uri, Component initialComponent) async {
     // Try to delete "lines".
  +  Uint8List data = fs.data[uri];
     const int $LF = 10;
  -  Uint8List latestCrashData = data;
     List<Uint8List> lines = [];
     int start = 0;
     for (int i = 0; i < data.length; i++) {
  
positive.code: 
  import 'package:kernel/ast.dart' show Component;
  
  import 'parser_test_listener.dart' show ParserTestListener;
  
  import 'parser_suite.dart' as parser_suite;
  
  import 'incremental_load_from_dill_suite.dart' show getOptions;
  
  Uri sdkRoot = computePlatformBinariesLocation(forceBuildDir: true);
  Uri base = Uri.parse("org-dartlang-test:///");
  Uri sdkSummary = base.resolve("vm_platform.dill");
  Uri platformUri = sdkRoot.resolve("vm_platform_strong.dill");
  
  main(List<String> arguments) async {
    String filename;
    bool nnbd = false;
    for (String arg in arguments) {
      if (arg.startsWith("--")) {
        if (arg == "--nnbd") {
          nnbd = true;
        } else {
          throw "Unknown option $arg";
        }
  
negative.code:       builder
            .add(sublist(latestCrashData, offset + mid, latestCrashData.length));
        candidate = builder.takeBytes();
        fs.data[uri] = candidate;
        if (await crashesOnCompile(initialComponent)) {
          crashingAt = mid;
        } else {
          // [noLongerCrashingAt] might actually crash now.
  