| 'use strict'; | 
|   | 
| var implementation = require('./implementation'); | 
|   | 
| var lacksProperEnumerationOrder = function () { | 
|     if (!Object.assign) { | 
|         return false; | 
|     } | 
|     /* | 
|      * v8, specifically in node 4.x, has a bug with incorrect property enumeration order | 
|      * note: this does not detect the bug unless there's 20 characters | 
|      */ | 
|     var str = 'abcdefghijklmnopqrst'; | 
|     var letters = str.split(''); | 
|     var map = {}; | 
|     for (var i = 0; i < letters.length; ++i) { | 
|         map[letters[i]] = letters[i]; | 
|     } | 
|     var obj = Object.assign({}, map); | 
|     var actual = ''; | 
|     for (var k in obj) { | 
|         actual += k; | 
|     } | 
|     return str !== actual; | 
| }; | 
|   | 
| var assignHasPendingExceptions = function () { | 
|     if (!Object.assign || !Object.preventExtensions) { | 
|         return false; | 
|     } | 
|     /* | 
|      * Firefox 37 still has "pending exception" logic in its Object.assign implementation, | 
|      * which is 72% slower than our shim, and Firefox 40's native implementation. | 
|      */ | 
|     var thrower = Object.preventExtensions({ 1: 2 }); | 
|     try { | 
|         Object.assign(thrower, 'xy'); | 
|     } catch (e) { | 
|         return thrower[1] === 'y'; | 
|     } | 
|     return false; | 
| }; | 
|   | 
| module.exports = function getPolyfill() { | 
|     if (!Object.assign) { | 
|         return implementation; | 
|     } | 
|     if (lacksProperEnumerationOrder()) { | 
|         return implementation; | 
|     } | 
|     if (assignHasPendingExceptions()) { | 
|         return implementation; | 
|     } | 
|     return Object.assign; | 
| }; |