| exports.fetch = isFunction(global.fetch) && isFunction(global.ReadableStream) | 
|   | 
| exports.writableStream = isFunction(global.WritableStream) | 
|   | 
| exports.abortController = isFunction(global.AbortController) | 
|   | 
| exports.blobConstructor = false | 
| try { | 
|     new Blob([new ArrayBuffer(1)]) | 
|     exports.blobConstructor = true | 
| } catch (e) {} | 
|   | 
| // The xhr request to example.com may violate some restrictive CSP configurations, | 
| // so if we're running in a browser that supports `fetch`, avoid calling getXHR() | 
| // and assume support for certain features below. | 
| var xhr | 
| function getXHR () { | 
|     // Cache the xhr value | 
|     if (xhr !== undefined) return xhr | 
|   | 
|     if (global.XMLHttpRequest) { | 
|         xhr = new global.XMLHttpRequest() | 
|         // If XDomainRequest is available (ie only, where xhr might not work | 
|         // cross domain), use the page location. Otherwise use example.com | 
|         // Note: this doesn't actually make an http request. | 
|         try { | 
|             xhr.open('GET', global.XDomainRequest ? '/' : 'https://example.com') | 
|         } catch(e) { | 
|             xhr = null | 
|         } | 
|     } else { | 
|         // Service workers don't have XHR | 
|         xhr = null | 
|     } | 
|     return xhr | 
| } | 
|   | 
| function checkTypeSupport (type) { | 
|     var xhr = getXHR() | 
|     if (!xhr) return false | 
|     try { | 
|         xhr.responseType = type | 
|         return xhr.responseType === type | 
|     } catch (e) {} | 
|     return false | 
| } | 
|   | 
| // For some strange reason, Safari 7.0 reports typeof global.ArrayBuffer === 'object'. | 
| // Safari 7.1 appears to have fixed this bug. | 
| var haveArrayBuffer = typeof global.ArrayBuffer !== 'undefined' | 
| var haveSlice = haveArrayBuffer && isFunction(global.ArrayBuffer.prototype.slice) | 
|   | 
| // If fetch is supported, then arraybuffer will be supported too. Skip calling | 
| // checkTypeSupport(), since that calls getXHR(). | 
| exports.arraybuffer = exports.fetch || (haveArrayBuffer && checkTypeSupport('arraybuffer')) | 
|   | 
| // These next two tests unavoidably show warnings in Chrome. Since fetch will always | 
| // be used if it's available, just return false for these to avoid the warnings. | 
| exports.msstream = !exports.fetch && haveSlice && checkTypeSupport('ms-stream') | 
| exports.mozchunkedarraybuffer = !exports.fetch && haveArrayBuffer && | 
|     checkTypeSupport('moz-chunked-arraybuffer') | 
|   | 
| // If fetch is supported, then overrideMimeType will be supported too. Skip calling | 
| // getXHR(). | 
| exports.overrideMimeType = exports.fetch || (getXHR() ? isFunction(getXHR().overrideMimeType) : false) | 
|   | 
| exports.vbArray = isFunction(global.VBArray) | 
|   | 
| function isFunction (value) { | 
|     return typeof value === 'function' | 
| } | 
|   | 
| xhr = null // Help gc |