anchor.diff:  
       var path = versions[i];
   
  -    var versionString =
  -        await HttpRequest.getString("$_storageBase/${path}VERSION");
  +    String versionString;
  +    try {
  +      versionString =
  +          await HttpRequest.getString("$_storageBase/${path}VERSION");
  +    } catch (_) {
  +      continue;
  +    }
   
       var json = JSON.decode(versionString) as Map<String, String>;
   
  
positive.code:     }
      _goButton.disabled = true;
  
      _updateStatus('Calculating diff');
  
      int left =
          int.parse(_leftVersionSelect.selectedOptions[0].attributes['value']);
      int right =
  
negative.code: 
      // TODO: validate left is "before" right
  
      try {
        await _compareVersions(
            _versionMaps[left], _versionMaps[right], includeComments);
        _updateStatus();
      } catch (e, stack) {
        print('Error comparing versions');
        print(e);
        print(stack);
        _updateStatus('Error comparing versions. See console output.');
      }
    } finally {
      _goButton.disabled = false;
    }
  }
  
  Future _compareVersions(Map left, Map right, bool includeComments) async {
    var leftData = await _getData(left['channel'], left['revision']);
    var rightData = await _getData(right['channel'], right['revision']);
  
    _updateStatus('Calculating diff');
    compareZips(
        left, leftData, right, rightData, includeComments, _diffContainer);
  }
  
  Future<ByteBuffer> _getData(String channel, String revision) async {
    var uri = '$_storageBase/channels/$channel/${_flavor}/${revision}'
        '/api-docs/dart-api-docs.zip';
  
    _updateStatus('Downloading docs: $channel $revision');
    return await getBinaryContent(uri);
  }
  