| Index: sdk/lib/_internal/pub/lib/src/utils.dart
 | 
| diff --git a/sdk/lib/_internal/pub/lib/src/utils.dart b/sdk/lib/_internal/pub/lib/src/utils.dart
 | 
| index 2f705f9e192fcd441ca4c91145537e20cef2b6a2..08b0fb44c26f48661fd0dcee321590223c9fa8e8 100644
 | 
| --- a/sdk/lib/_internal/pub/lib/src/utils.dart
 | 
| +++ b/sdk/lib/_internal/pub/lib/src/utils.dart
 | 
| @@ -213,6 +213,26 @@ Pair<Stream, Stream> tee(Stream stream) {
 | 
|    return new Pair<Stream, Stream>(controller1.stream, controller2.stream);
 | 
|  }
 | 
|  
 | 
| +/// Merges [stream1] and [stream2] into a single stream that emits events from
 | 
| +/// both sources.
 | 
| +Stream mergeStreams(Stream stream1, Stream stream2) {
 | 
| +  var doneCount = 0;
 | 
| +  var controller = new StreamController();
 | 
| +
 | 
| +  for (var stream in [stream1, stream2]) {
 | 
| +    stream.listen((value) {
 | 
| +      controller.add(value);
 | 
| +    }, onError: (error) {
 | 
| +      controller.addError(error);
 | 
| +    }, onDone: () {
 | 
| +      doneCount++;
 | 
| +      if (doneCount == 2) controller.close();
 | 
| +    });
 | 
| +  }
 | 
| +
 | 
| +  return controller.stream;
 | 
| +}
 | 
| +
 | 
|  /// A regular expression matching a trailing CR character.
 | 
|  final _trailingCR = new RegExp(r"\r$");
 | 
|  
 | 
| 
 |