| /*! Amaze UI v2.7.0 ~ IE8 Fucker | by Amaze UI Team | (c) 2016 AllMobilize, Inc. | Licensed under MIT | 2016-05-24T10:02:50+0800 */  | 
| /*! | 
|  * https://github.com/es-shims/es5-shim | 
|  * @license es5-shim Copyright 2009-2015 by contributors, MIT License | 
|  * see https://github.com/es-shims/es5-shim/blob/master/LICENSE | 
|  */ | 
|   | 
| // vim: ts=4 sts=4 sw=4 expandtab | 
|   | 
| // Add semicolon to prevent IIFE from being passed as argument to concatenated code. | 
| ; | 
|   | 
| // UMD (Universal Module Definition) | 
| // see https://github.com/umdjs/umd/blob/master/templates/returnExports.js | 
| (function (root, factory) { | 
|     'use strict'; | 
|   | 
|     /* global define, exports, module */ | 
|     if (typeof define === 'function' && define.amd) { | 
|         // AMD. Register as an anonymous module. | 
|         define(factory); | 
|     } else if (typeof exports === 'object') { | 
|         // Node. Does not work with strict CommonJS, but | 
|         // only CommonJS-like enviroments that support module.exports, | 
|         // like Node. | 
|         module.exports = factory(); | 
|     } else { | 
|         // Browser globals (root is window) | 
|         root.returnExports = factory(); | 
|     } | 
| }(this, function () { | 
|   | 
| /** | 
|  * Brings an environment as close to ECMAScript 5 compliance | 
|  * as is possible with the facilities of erstwhile engines. | 
|  * | 
|  * Annotated ES5: http://es5.github.com/ (specific links below) | 
|  * ES5 Spec: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf | 
|  * Required reading: http://javascriptweblog.wordpress.com/2011/12/05/extending-javascript-natives/ | 
|  */ | 
|   | 
| // Shortcut to an often accessed properties, in order to avoid multiple | 
| // dereference that costs universally. This also holds a reference to known-good | 
| // functions. | 
| var $Array = Array; | 
| var ArrayPrototype = $Array.prototype; | 
| var $Object = Object; | 
| var ObjectPrototype = $Object.prototype; | 
| var $Function = Function; | 
| var FunctionPrototype = $Function.prototype; | 
| var $String = String; | 
| var StringPrototype = $String.prototype; | 
| var $Number = Number; | 
| var NumberPrototype = $Number.prototype; | 
| var array_slice = ArrayPrototype.slice; | 
| var array_splice = ArrayPrototype.splice; | 
| var array_push = ArrayPrototype.push; | 
| var array_unshift = ArrayPrototype.unshift; | 
| var array_concat = ArrayPrototype.concat; | 
| var array_join = ArrayPrototype.join; | 
| var call = FunctionPrototype.call; | 
| var apply = FunctionPrototype.apply; | 
| var max = Math.max; | 
| var min = Math.min; | 
|   | 
| // Having a toString local variable name breaks in Opera so use to_string. | 
| var to_string = ObjectPrototype.toString; | 
|   | 
| /* global Symbol */ | 
| /* eslint-disable one-var-declaration-per-line, no-redeclare */ | 
| var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol'; | 
| var isCallable; /* inlined from https://npmjs.com/is-callable */ var fnToStr = Function.prototype.toString, constructorRegex = /^\s*class /, isES6ClassFn = function isES6ClassFn(value) { try { var fnStr = fnToStr.call(value); var singleStripped = fnStr.replace(/\/\/.*\n/g, ''); var multiStripped = singleStripped.replace(/\/\*[.\s\S]*\*\//g, ''); var spaceStripped = multiStripped.replace(/\n/mg, ' ').replace(/ {2}/g, ' '); return constructorRegex.test(spaceStripped); } catch (e) { return false; /* not a function */ } }, tryFunctionObject = function tryFunctionObject(value) { try { if (isES6ClassFn(value)) { return false; } fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object Function]', genClass = '[object GeneratorFunction]', isCallable = function isCallable(value) { if (!value) { return false; } if (typeof value !== 'function' && typeof value !== 'object') { return false; } if (hasToStringTag) { return tryFunctionObject(value); } if (isES6ClassFn(value)) { return false; } var strClass = to_string.call(value); return strClass === fnClass || strClass === genClass; }; | 
|   | 
| var isRegex; /* inlined from https://npmjs.com/is-regex */ var regexExec = RegExp.prototype.exec, tryRegexExec = function tryRegexExec(value) { try { regexExec.call(value); return true; } catch (e) { return false; } }, regexClass = '[object RegExp]'; isRegex = function isRegex(value) { if (typeof value !== 'object') { return false; } return hasToStringTag ? tryRegexExec(value) : to_string.call(value) === regexClass; }; | 
| var isString; /* inlined from https://npmjs.com/is-string */ var strValue = String.prototype.valueOf, tryStringObject = function tryStringObject(value) { try { strValue.call(value); return true; } catch (e) { return false; } }, stringClass = '[object String]'; isString = function isString(value) { if (typeof value === 'string') { return true; } if (typeof value !== 'object') { return false; } return hasToStringTag ? tryStringObject(value) : to_string.call(value) === stringClass; }; | 
| /* eslint-enable one-var-declaration-per-line, no-redeclare */ | 
|   | 
| /* inlined from http://npmjs.com/define-properties */ | 
| var supportsDescriptors = $Object.defineProperty && (function () { | 
|     try { | 
|         var obj = {}; | 
|         $Object.defineProperty(obj, 'x', { enumerable: false, value: obj }); | 
|         for (var _ in obj) { return false; } | 
|         return obj.x === obj; | 
|     } catch (e) { /* this is ES3 */ | 
|         return false; | 
|     } | 
| }()); | 
| var defineProperties = (function (has) { | 
|   // Define configurable, writable, and non-enumerable props | 
|   // if they don't exist. | 
|   var defineProperty; | 
|   if (supportsDescriptors) { | 
|       defineProperty = function (object, name, method, forceAssign) { | 
|           if (!forceAssign && (name in object)) { return; } | 
|           $Object.defineProperty(object, name, { | 
|               configurable: true, | 
|               enumerable: false, | 
|               writable: true, | 
|               value: method | 
|           }); | 
|       }; | 
|   } else { | 
|       defineProperty = function (object, name, method, forceAssign) { | 
|           if (!forceAssign && (name in object)) { return; } | 
|           object[name] = method; | 
|       }; | 
|   } | 
|   return function defineProperties(object, map, forceAssign) { | 
|       for (var name in map) { | 
|           if (has.call(map, name)) { | 
|             defineProperty(object, name, map[name], forceAssign); | 
|           } | 
|       } | 
|   }; | 
| }(ObjectPrototype.hasOwnProperty)); | 
|   | 
| // | 
| // Util | 
| // ====== | 
| // | 
|   | 
| /* replaceable with https://npmjs.com/package/es-abstract /helpers/isPrimitive */ | 
| var isPrimitive = function isPrimitive(input) { | 
|     var type = typeof input; | 
|     return input === null || (type !== 'object' && type !== 'function'); | 
| }; | 
|   | 
| var isActualNaN = $Number.isNaN || function (x) { return x !== x; }; | 
|   | 
| var ES = { | 
|     // ES5 9.4 | 
|     // http://es5.github.com/#x9.4 | 
|     // http://jsperf.com/to-integer | 
|     /* replaceable with https://npmjs.com/package/es-abstract ES5.ToInteger */ | 
|     ToInteger: function ToInteger(num) { | 
|         var n = +num; | 
|         if (isActualNaN(n)) { | 
|             n = 0; | 
|         } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) { | 
|             n = (n > 0 || -1) * Math.floor(Math.abs(n)); | 
|         } | 
|         return n; | 
|     }, | 
|   | 
|     /* replaceable with https://npmjs.com/package/es-abstract ES5.ToPrimitive */ | 
|     ToPrimitive: function ToPrimitive(input) { | 
|         var val, valueOf, toStr; | 
|         if (isPrimitive(input)) { | 
|             return input; | 
|         } | 
|         valueOf = input.valueOf; | 
|         if (isCallable(valueOf)) { | 
|             val = valueOf.call(input); | 
|             if (isPrimitive(val)) { | 
|                 return val; | 
|             } | 
|         } | 
|         toStr = input.toString; | 
|         if (isCallable(toStr)) { | 
|             val = toStr.call(input); | 
|             if (isPrimitive(val)) { | 
|                 return val; | 
|             } | 
|         } | 
|         throw new TypeError(); | 
|     }, | 
|   | 
|     // ES5 9.9 | 
|     // http://es5.github.com/#x9.9 | 
|     /* replaceable with https://npmjs.com/package/es-abstract ES5.ToObject */ | 
|     ToObject: function (o) { | 
|         if (o == null) { // this matches both null and undefined | 
|             throw new TypeError("can't convert " + o + ' to object'); | 
|         } | 
|         return $Object(o); | 
|     }, | 
|   | 
|     /* replaceable with https://npmjs.com/package/es-abstract ES5.ToUint32 */ | 
|     ToUint32: function ToUint32(x) { | 
|         return x >>> 0; | 
|     } | 
| }; | 
|   | 
| // | 
| // Function | 
| // ======== | 
| // | 
|   | 
| // ES-5 15.3.4.5 | 
| // http://es5.github.com/#x15.3.4.5 | 
|   | 
| var Empty = function Empty() {}; | 
|   | 
| defineProperties(FunctionPrototype, { | 
|     bind: function bind(that) { // .length is 1 | 
|         // 1. Let Target be the this value. | 
|         var target = this; | 
|         // 2. If IsCallable(Target) is false, throw a TypeError exception. | 
|         if (!isCallable(target)) { | 
|             throw new TypeError('Function.prototype.bind called on incompatible ' + target); | 
|         } | 
|         // 3. Let A be a new (possibly empty) internal list of all of the | 
|         //   argument values provided after thisArg (arg1, arg2 etc), in order. | 
|         // XXX slicedArgs will stand in for "A" if used | 
|         var args = array_slice.call(arguments, 1); // for normal call | 
|         // 4. Let F be a new native ECMAScript object. | 
|         // 11. Set the [[Prototype]] internal property of F to the standard | 
|         //   built-in Function prototype object as specified in 15.3.3.1. | 
|         // 12. Set the [[Call]] internal property of F as described in | 
|         //   15.3.4.5.1. | 
|         // 13. Set the [[Construct]] internal property of F as described in | 
|         //   15.3.4.5.2. | 
|         // 14. Set the [[HasInstance]] internal property of F as described in | 
|         //   15.3.4.5.3. | 
|         var bound; | 
|         var binder = function () { | 
|   | 
|             if (this instanceof bound) { | 
|                 // 15.3.4.5.2 [[Construct]] | 
|                 // When the [[Construct]] internal method of a function object, | 
|                 // F that was created using the bind function is called with a | 
|                 // list of arguments ExtraArgs, the following steps are taken: | 
|                 // 1. Let target be the value of F's [[TargetFunction]] | 
|                 //   internal property. | 
|                 // 2. If target has no [[Construct]] internal method, a | 
|                 //   TypeError exception is thrown. | 
|                 // 3. Let boundArgs be the value of F's [[BoundArgs]] internal | 
|                 //   property. | 
|                 // 4. Let args be a new list containing the same values as the | 
|                 //   list boundArgs in the same order followed by the same | 
|                 //   values as the list ExtraArgs in the same order. | 
|                 // 5. Return the result of calling the [[Construct]] internal | 
|                 //   method of target providing args as the arguments. | 
|   | 
|                 var result = apply.call( | 
|                     target, | 
|                     this, | 
|                     array_concat.call(args, array_slice.call(arguments)) | 
|                 ); | 
|                 if ($Object(result) === result) { | 
|                     return result; | 
|                 } | 
|                 return this; | 
|   | 
|             } else { | 
|                 // 15.3.4.5.1 [[Call]] | 
|                 // When the [[Call]] internal method of a function object, F, | 
|                 // which was created using the bind function is called with a | 
|                 // this value and a list of arguments ExtraArgs, the following | 
|                 // steps are taken: | 
|                 // 1. Let boundArgs be the value of F's [[BoundArgs]] internal | 
|                 //   property. | 
|                 // 2. Let boundThis be the value of F's [[BoundThis]] internal | 
|                 //   property. | 
|                 // 3. Let target be the value of F's [[TargetFunction]] internal | 
|                 //   property. | 
|                 // 4. Let args be a new list containing the same values as the | 
|                 //   list boundArgs in the same order followed by the same | 
|                 //   values as the list ExtraArgs in the same order. | 
|                 // 5. Return the result of calling the [[Call]] internal method | 
|                 //   of target providing boundThis as the this value and | 
|                 //   providing args as the arguments. | 
|   | 
|                 // equiv: target.call(this, ...boundArgs, ...args) | 
|                 return apply.call( | 
|                     target, | 
|                     that, | 
|                     array_concat.call(args, array_slice.call(arguments)) | 
|                 ); | 
|   | 
|             } | 
|   | 
|         }; | 
|   | 
|         // 15. If the [[Class]] internal property of Target is "Function", then | 
|         //     a. Let L be the length property of Target minus the length of A. | 
|         //     b. Set the length own property of F to either 0 or L, whichever is | 
|         //       larger. | 
|         // 16. Else set the length own property of F to 0. | 
|   | 
|         var boundLength = max(0, target.length - args.length); | 
|   | 
|         // 17. Set the attributes of the length own property of F to the values | 
|         //   specified in 15.3.5.1. | 
|         var boundArgs = []; | 
|         for (var i = 0; i < boundLength; i++) { | 
|             array_push.call(boundArgs, '$' + i); | 
|         } | 
|   | 
|         // XXX Build a dynamic function with desired amount of arguments is the only | 
|         // way to set the length property of a function. | 
|         // In environments where Content Security Policies enabled (Chrome extensions, | 
|         // for ex.) all use of eval or Function costructor throws an exception. | 
|         // However in all of these environments Function.prototype.bind exists | 
|         // and so this code will never be executed. | 
|         bound = $Function('binder', 'return function (' + array_join.call(boundArgs, ',') + '){ return binder.apply(this, arguments); }')(binder); | 
|   | 
|         if (target.prototype) { | 
|             Empty.prototype = target.prototype; | 
|             bound.prototype = new Empty(); | 
|             // Clean up dangling references. | 
|             Empty.prototype = null; | 
|         } | 
|   | 
|         // TODO | 
|         // 18. Set the [[Extensible]] internal property of F to true. | 
|   | 
|         // TODO | 
|         // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3). | 
|         // 20. Call the [[DefineOwnProperty]] internal method of F with | 
|         //   arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]: | 
|         //   thrower, [[Enumerable]]: false, [[Configurable]]: false}, and | 
|         //   false. | 
|         // 21. Call the [[DefineOwnProperty]] internal method of F with | 
|         //   arguments "arguments", PropertyDescriptor {[[Get]]: thrower, | 
|         //   [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, | 
|         //   and false. | 
|   | 
|         // TODO | 
|         // NOTE Function objects created using Function.prototype.bind do not | 
|         // have a prototype property or the [[Code]], [[FormalParameters]], and | 
|         // [[Scope]] internal properties. | 
|         // XXX can't delete prototype in pure-js. | 
|   | 
|         // 22. Return F. | 
|         return bound; | 
|     } | 
| }); | 
|   | 
| // _Please note: Shortcuts are defined after `Function.prototype.bind` as we | 
| // use it in defining shortcuts. | 
| var owns = call.bind(ObjectPrototype.hasOwnProperty); | 
| var toStr = call.bind(ObjectPrototype.toString); | 
| var arraySlice = call.bind(array_slice); | 
| var arraySliceApply = apply.bind(array_slice); | 
| var strSlice = call.bind(StringPrototype.slice); | 
| var strSplit = call.bind(StringPrototype.split); | 
| var strIndexOf = call.bind(StringPrototype.indexOf); | 
| var pushCall = call.bind(array_push); | 
| var isEnum = call.bind(ObjectPrototype.propertyIsEnumerable); | 
| var arraySort = call.bind(ArrayPrototype.sort); | 
|   | 
| // | 
| // Array | 
| // ===== | 
| // | 
|   | 
| var isArray = $Array.isArray || function isArray(obj) { | 
|     return toStr(obj) === '[object Array]'; | 
| }; | 
|   | 
| // ES5 15.4.4.12 | 
| // http://es5.github.com/#x15.4.4.13 | 
| // Return len+argCount. | 
| // [bugfix, ielt8] | 
| // IE < 8 bug: [].unshift(0) === undefined but should be "1" | 
| var hasUnshiftReturnValueBug = [].unshift(0) !== 1; | 
| defineProperties(ArrayPrototype, { | 
|     unshift: function () { | 
|         array_unshift.apply(this, arguments); | 
|         return this.length; | 
|     } | 
| }, hasUnshiftReturnValueBug); | 
|   | 
| // ES5 15.4.3.2 | 
| // http://es5.github.com/#x15.4.3.2 | 
| // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray | 
| defineProperties($Array, { isArray: isArray }); | 
|   | 
| // The IsCallable() check in the Array functions | 
| // has been replaced with a strict check on the | 
| // internal class of the object to trap cases where | 
| // the provided function was actually a regular | 
| // expression literal, which in V8 and | 
| // JavaScriptCore is a typeof "function".  Only in | 
| // V8 are regular expression literals permitted as | 
| // reduce parameters, so it is desirable in the | 
| // general case for the shim to match the more | 
| // strict and common behavior of rejecting regular | 
| // expressions. | 
|   | 
| // ES5 15.4.4.18 | 
| // http://es5.github.com/#x15.4.4.18 | 
| // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach | 
|   | 
| // Check failure of by-index access of string characters (IE < 9) | 
| // and failure of `0 in boxedString` (Rhino) | 
| var boxedString = $Object('a'); | 
| var splitString = boxedString[0] !== 'a' || !(0 in boxedString); | 
|   | 
| var properlyBoxesContext = function properlyBoxed(method) { | 
|     // Check node 0.6.21 bug where third parameter is not boxed | 
|     var properlyBoxesNonStrict = true; | 
|     var properlyBoxesStrict = true; | 
|     var threwException = false; | 
|     if (method) { | 
|         try { | 
|             method.call('foo', function (_, __, context) { | 
|                 if (typeof context !== 'object') { properlyBoxesNonStrict = false; } | 
|             }); | 
|   | 
|             method.call([1], function () { | 
|                 'use strict'; | 
|   | 
|                 properlyBoxesStrict = typeof this === 'string'; | 
|             }, 'x'); | 
|         } catch (e) { | 
|             threwException = true; | 
|         } | 
|     } | 
|     return !!method && !threwException && properlyBoxesNonStrict && properlyBoxesStrict; | 
| }; | 
|   | 
| defineProperties(ArrayPrototype, { | 
|     forEach: function forEach(callbackfn/*, thisArg*/) { | 
|         var object = ES.ToObject(this); | 
|         var self = splitString && isString(this) ? strSplit(this, '') : object; | 
|         var i = -1; | 
|         var length = ES.ToUint32(self.length); | 
|         var T; | 
|         if (arguments.length > 1) { | 
|           T = arguments[1]; | 
|         } | 
|   | 
|         // If no callback function or if callback is not a callable function | 
|         if (!isCallable(callbackfn)) { | 
|             throw new TypeError('Array.prototype.forEach callback must be a function'); | 
|         } | 
|   | 
|         while (++i < length) { | 
|             if (i in self) { | 
|                 // Invoke the callback function with call, passing arguments: | 
|                 // context, property value, property key, thisArg object | 
|                 if (typeof T === 'undefined') { | 
|                     callbackfn(self[i], i, object); | 
|                 } else { | 
|                     callbackfn.call(T, self[i], i, object); | 
|                 } | 
|             } | 
|         } | 
|     } | 
| }, !properlyBoxesContext(ArrayPrototype.forEach)); | 
|   | 
| // ES5 15.4.4.19 | 
| // http://es5.github.com/#x15.4.4.19 | 
| // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map | 
| defineProperties(ArrayPrototype, { | 
|     map: function map(callbackfn/*, thisArg*/) { | 
|         var object = ES.ToObject(this); | 
|         var self = splitString && isString(this) ? strSplit(this, '') : object; | 
|         var length = ES.ToUint32(self.length); | 
|         var result = $Array(length); | 
|         var T; | 
|         if (arguments.length > 1) { | 
|             T = arguments[1]; | 
|         } | 
|   | 
|         // If no callback function or if callback is not a callable function | 
|         if (!isCallable(callbackfn)) { | 
|             throw new TypeError('Array.prototype.map callback must be a function'); | 
|         } | 
|   | 
|         for (var i = 0; i < length; i++) { | 
|             if (i in self) { | 
|                 if (typeof T === 'undefined') { | 
|                     result[i] = callbackfn(self[i], i, object); | 
|                 } else { | 
|                     result[i] = callbackfn.call(T, self[i], i, object); | 
|                 } | 
|             } | 
|         } | 
|         return result; | 
|     } | 
| }, !properlyBoxesContext(ArrayPrototype.map)); | 
|   | 
| // ES5 15.4.4.20 | 
| // http://es5.github.com/#x15.4.4.20 | 
| // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter | 
| defineProperties(ArrayPrototype, { | 
|     filter: function filter(callbackfn/*, thisArg*/) { | 
|         var object = ES.ToObject(this); | 
|         var self = splitString && isString(this) ? strSplit(this, '') : object; | 
|         var length = ES.ToUint32(self.length); | 
|         var result = []; | 
|         var value; | 
|         var T; | 
|         if (arguments.length > 1) { | 
|             T = arguments[1]; | 
|         } | 
|   | 
|         // If no callback function or if callback is not a callable function | 
|         if (!isCallable(callbackfn)) { | 
|             throw new TypeError('Array.prototype.filter callback must be a function'); | 
|         } | 
|   | 
|         for (var i = 0; i < length; i++) { | 
|             if (i in self) { | 
|                 value = self[i]; | 
|                 if (typeof T === 'undefined' ? callbackfn(value, i, object) : callbackfn.call(T, value, i, object)) { | 
|                     pushCall(result, value); | 
|                 } | 
|             } | 
|         } | 
|         return result; | 
|     } | 
| }, !properlyBoxesContext(ArrayPrototype.filter)); | 
|   | 
| // ES5 15.4.4.16 | 
| // http://es5.github.com/#x15.4.4.16 | 
| // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every | 
| defineProperties(ArrayPrototype, { | 
|     every: function every(callbackfn/*, thisArg*/) { | 
|         var object = ES.ToObject(this); | 
|         var self = splitString && isString(this) ? strSplit(this, '') : object; | 
|         var length = ES.ToUint32(self.length); | 
|         var T; | 
|         if (arguments.length > 1) { | 
|             T = arguments[1]; | 
|         } | 
|   | 
|         // If no callback function or if callback is not a callable function | 
|         if (!isCallable(callbackfn)) { | 
|             throw new TypeError('Array.prototype.every callback must be a function'); | 
|         } | 
|   | 
|         for (var i = 0; i < length; i++) { | 
|             if (i in self && !(typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) { | 
|                 return false; | 
|             } | 
|         } | 
|         return true; | 
|     } | 
| }, !properlyBoxesContext(ArrayPrototype.every)); | 
|   | 
| // ES5 15.4.4.17 | 
| // http://es5.github.com/#x15.4.4.17 | 
| // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some | 
| defineProperties(ArrayPrototype, { | 
|     some: function some(callbackfn/*, thisArg */) { | 
|         var object = ES.ToObject(this); | 
|         var self = splitString && isString(this) ? strSplit(this, '') : object; | 
|         var length = ES.ToUint32(self.length); | 
|         var T; | 
|         if (arguments.length > 1) { | 
|             T = arguments[1]; | 
|         } | 
|   | 
|         // If no callback function or if callback is not a callable function | 
|         if (!isCallable(callbackfn)) { | 
|             throw new TypeError('Array.prototype.some callback must be a function'); | 
|         } | 
|   | 
|         for (var i = 0; i < length; i++) { | 
|             if (i in self && (typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) { | 
|                 return true; | 
|             } | 
|         } | 
|         return false; | 
|     } | 
| }, !properlyBoxesContext(ArrayPrototype.some)); | 
|   | 
| // ES5 15.4.4.21 | 
| // http://es5.github.com/#x15.4.4.21 | 
| // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce | 
| var reduceCoercesToObject = false; | 
| if (ArrayPrototype.reduce) { | 
|     reduceCoercesToObject = typeof ArrayPrototype.reduce.call('es5', function (_, __, ___, list) { return list; }) === 'object'; | 
| } | 
| defineProperties(ArrayPrototype, { | 
|     reduce: function reduce(callbackfn/*, initialValue*/) { | 
|         var object = ES.ToObject(this); | 
|         var self = splitString && isString(this) ? strSplit(this, '') : object; | 
|         var length = ES.ToUint32(self.length); | 
|   | 
|         // If no callback function or if callback is not a callable function | 
|         if (!isCallable(callbackfn)) { | 
|             throw new TypeError('Array.prototype.reduce callback must be a function'); | 
|         } | 
|   | 
|         // no value to return if no initial value and an empty array | 
|         if (length === 0 && arguments.length === 1) { | 
|             throw new TypeError('reduce of empty array with no initial value'); | 
|         } | 
|   | 
|         var i = 0; | 
|         var result; | 
|         if (arguments.length >= 2) { | 
|             result = arguments[1]; | 
|         } else { | 
|             do { | 
|                 if (i in self) { | 
|                     result = self[i++]; | 
|                     break; | 
|                 } | 
|   | 
|                 // if array contains no values, no initial value to return | 
|                 if (++i >= length) { | 
|                     throw new TypeError('reduce of empty array with no initial value'); | 
|                 } | 
|             } while (true); | 
|         } | 
|   | 
|         for (; i < length; i++) { | 
|             if (i in self) { | 
|                 result = callbackfn(result, self[i], i, object); | 
|             } | 
|         } | 
|   | 
|         return result; | 
|     } | 
| }, !reduceCoercesToObject); | 
|   | 
| // ES5 15.4.4.22 | 
| // http://es5.github.com/#x15.4.4.22 | 
| // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight | 
| var reduceRightCoercesToObject = false; | 
| if (ArrayPrototype.reduceRight) { | 
|     reduceRightCoercesToObject = typeof ArrayPrototype.reduceRight.call('es5', function (_, __, ___, list) { return list; }) === 'object'; | 
| } | 
| defineProperties(ArrayPrototype, { | 
|     reduceRight: function reduceRight(callbackfn/*, initial*/) { | 
|         var object = ES.ToObject(this); | 
|         var self = splitString && isString(this) ? strSplit(this, '') : object; | 
|         var length = ES.ToUint32(self.length); | 
|   | 
|         // If no callback function or if callback is not a callable function | 
|         if (!isCallable(callbackfn)) { | 
|             throw new TypeError('Array.prototype.reduceRight callback must be a function'); | 
|         } | 
|   | 
|         // no value to return if no initial value, empty array | 
|         if (length === 0 && arguments.length === 1) { | 
|             throw new TypeError('reduceRight of empty array with no initial value'); | 
|         } | 
|   | 
|         var result; | 
|         var i = length - 1; | 
|         if (arguments.length >= 2) { | 
|             result = arguments[1]; | 
|         } else { | 
|             do { | 
|                 if (i in self) { | 
|                     result = self[i--]; | 
|                     break; | 
|                 } | 
|   | 
|                 // if array contains no values, no initial value to return | 
|                 if (--i < 0) { | 
|                     throw new TypeError('reduceRight of empty array with no initial value'); | 
|                 } | 
|             } while (true); | 
|         } | 
|   | 
|         if (i < 0) { | 
|             return result; | 
|         } | 
|   | 
|         do { | 
|             if (i in self) { | 
|                 result = callbackfn(result, self[i], i, object); | 
|             } | 
|         } while (i--); | 
|   | 
|         return result; | 
|     } | 
| }, !reduceRightCoercesToObject); | 
|   | 
| // ES5 15.4.4.14 | 
| // http://es5.github.com/#x15.4.4.14 | 
| // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf | 
| var hasFirefox2IndexOfBug = ArrayPrototype.indexOf && [0, 1].indexOf(1, 2) !== -1; | 
| defineProperties(ArrayPrototype, { | 
|     indexOf: function indexOf(searchElement/*, fromIndex */) { | 
|         var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this); | 
|         var length = ES.ToUint32(self.length); | 
|   | 
|         if (length === 0) { | 
|             return -1; | 
|         } | 
|   | 
|         var i = 0; | 
|         if (arguments.length > 1) { | 
|             i = ES.ToInteger(arguments[1]); | 
|         } | 
|   | 
|         // handle negative indices | 
|         i = i >= 0 ? i : max(0, length + i); | 
|         for (; i < length; i++) { | 
|             if (i in self && self[i] === searchElement) { | 
|                 return i; | 
|             } | 
|         } | 
|         return -1; | 
|     } | 
| }, hasFirefox2IndexOfBug); | 
|   | 
| // ES5 15.4.4.15 | 
| // http://es5.github.com/#x15.4.4.15 | 
| // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf | 
| var hasFirefox2LastIndexOfBug = ArrayPrototype.lastIndexOf && [0, 1].lastIndexOf(0, -3) !== -1; | 
| defineProperties(ArrayPrototype, { | 
|     lastIndexOf: function lastIndexOf(searchElement/*, fromIndex */) { | 
|         var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this); | 
|         var length = ES.ToUint32(self.length); | 
|   | 
|         if (length === 0) { | 
|             return -1; | 
|         } | 
|         var i = length - 1; | 
|         if (arguments.length > 1) { | 
|             i = min(i, ES.ToInteger(arguments[1])); | 
|         } | 
|         // handle negative indices | 
|         i = i >= 0 ? i : length - Math.abs(i); | 
|         for (; i >= 0; i--) { | 
|             if (i in self && searchElement === self[i]) { | 
|                 return i; | 
|             } | 
|         } | 
|         return -1; | 
|     } | 
| }, hasFirefox2LastIndexOfBug); | 
|   | 
| // ES5 15.4.4.12 | 
| // http://es5.github.com/#x15.4.4.12 | 
| var spliceNoopReturnsEmptyArray = (function () { | 
|     var a = [1, 2]; | 
|     var result = a.splice(); | 
|     return a.length === 2 && isArray(result) && result.length === 0; | 
| }()); | 
| defineProperties(ArrayPrototype, { | 
|     // Safari 5.0 bug where .splice() returns undefined | 
|     splice: function splice(start, deleteCount) { | 
|         if (arguments.length === 0) { | 
|             return []; | 
|         } else { | 
|             return array_splice.apply(this, arguments); | 
|         } | 
|     } | 
| }, !spliceNoopReturnsEmptyArray); | 
|   | 
| var spliceWorksWithEmptyObject = (function () { | 
|     var obj = {}; | 
|     ArrayPrototype.splice.call(obj, 0, 0, 1); | 
|     return obj.length === 1; | 
| }()); | 
| defineProperties(ArrayPrototype, { | 
|     splice: function splice(start, deleteCount) { | 
|         if (arguments.length === 0) { return []; } | 
|         var args = arguments; | 
|         this.length = max(ES.ToInteger(this.length), 0); | 
|         if (arguments.length > 0 && typeof deleteCount !== 'number') { | 
|             args = arraySlice(arguments); | 
|             if (args.length < 2) { | 
|                 pushCall(args, this.length - start); | 
|             } else { | 
|                 args[1] = ES.ToInteger(deleteCount); | 
|             } | 
|         } | 
|         return array_splice.apply(this, args); | 
|     } | 
| }, !spliceWorksWithEmptyObject); | 
| var spliceWorksWithLargeSparseArrays = (function () { | 
|     // Per https://github.com/es-shims/es5-shim/issues/295 | 
|     // Safari 7/8 breaks with sparse arrays of size 1e5 or greater | 
|     var arr = new $Array(1e5); | 
|     // note: the index MUST be 8 or larger or the test will false pass | 
|     arr[8] = 'x'; | 
|     arr.splice(1, 1); | 
|     // note: this test must be defined *after* the indexOf shim | 
|     // per https://github.com/es-shims/es5-shim/issues/313 | 
|     return arr.indexOf('x') === 7; | 
| }()); | 
| var spliceWorksWithSmallSparseArrays = (function () { | 
|     // Per https://github.com/es-shims/es5-shim/issues/295 | 
|     // Opera 12.15 breaks on this, no idea why. | 
|     var n = 256; | 
|     var arr = []; | 
|     arr[n] = 'a'; | 
|     arr.splice(n + 1, 0, 'b'); | 
|     return arr[n] === 'a'; | 
| }()); | 
| defineProperties(ArrayPrototype, { | 
|     splice: function splice(start, deleteCount) { | 
|         var O = ES.ToObject(this); | 
|         var A = []; | 
|         var len = ES.ToUint32(O.length); | 
|         var relativeStart = ES.ToInteger(start); | 
|         var actualStart = relativeStart < 0 ? max((len + relativeStart), 0) : min(relativeStart, len); | 
|         var actualDeleteCount = min(max(ES.ToInteger(deleteCount), 0), len - actualStart); | 
|   | 
|         var k = 0; | 
|         var from; | 
|         while (k < actualDeleteCount) { | 
|             from = $String(actualStart + k); | 
|             if (owns(O, from)) { | 
|                 A[k] = O[from]; | 
|             } | 
|             k += 1; | 
|         } | 
|   | 
|         var items = arraySlice(arguments, 2); | 
|         var itemCount = items.length; | 
|         var to; | 
|         if (itemCount < actualDeleteCount) { | 
|             k = actualStart; | 
|             var maxK = len - actualDeleteCount; | 
|             while (k < maxK) { | 
|                 from = $String(k + actualDeleteCount); | 
|                 to = $String(k + itemCount); | 
|                 if (owns(O, from)) { | 
|                     O[to] = O[from]; | 
|                 } else { | 
|                     delete O[to]; | 
|                 } | 
|                 k += 1; | 
|             } | 
|             k = len; | 
|             var minK = len - actualDeleteCount + itemCount; | 
|             while (k > minK) { | 
|                 delete O[k - 1]; | 
|                 k -= 1; | 
|             } | 
|         } else if (itemCount > actualDeleteCount) { | 
|             k = len - actualDeleteCount; | 
|             while (k > actualStart) { | 
|                 from = $String(k + actualDeleteCount - 1); | 
|                 to = $String(k + itemCount - 1); | 
|                 if (owns(O, from)) { | 
|                     O[to] = O[from]; | 
|                 } else { | 
|                     delete O[to]; | 
|                 } | 
|                 k -= 1; | 
|             } | 
|         } | 
|         k = actualStart; | 
|         for (var i = 0; i < items.length; ++i) { | 
|             O[k] = items[i]; | 
|             k += 1; | 
|         } | 
|         O.length = len - actualDeleteCount + itemCount; | 
|   | 
|         return A; | 
|     } | 
| }, !spliceWorksWithLargeSparseArrays || !spliceWorksWithSmallSparseArrays); | 
|   | 
| var originalJoin = ArrayPrototype.join; | 
| var hasStringJoinBug; | 
| try { | 
|     hasStringJoinBug = Array.prototype.join.call('123', ',') !== '1,2,3'; | 
| } catch (e) { | 
|     hasStringJoinBug = true; | 
| } | 
| if (hasStringJoinBug) { | 
|     defineProperties(ArrayPrototype, { | 
|         join: function join(separator) { | 
|             var sep = typeof separator === 'undefined' ? ',' : separator; | 
|             return originalJoin.call(isString(this) ? strSplit(this, '') : this, sep); | 
|         } | 
|     }, hasStringJoinBug); | 
| } | 
|   | 
| var hasJoinUndefinedBug = [1, 2].join(undefined) !== '1,2'; | 
| if (hasJoinUndefinedBug) { | 
|     defineProperties(ArrayPrototype, { | 
|         join: function join(separator) { | 
|             var sep = typeof separator === 'undefined' ? ',' : separator; | 
|             return originalJoin.call(this, sep); | 
|         } | 
|     }, hasJoinUndefinedBug); | 
| } | 
|   | 
| var pushShim = function push(item) { | 
|     var O = ES.ToObject(this); | 
|     var n = ES.ToUint32(O.length); | 
|     var i = 0; | 
|     while (i < arguments.length) { | 
|         O[n + i] = arguments[i]; | 
|         i += 1; | 
|     } | 
|     O.length = n + i; | 
|     return n + i; | 
| }; | 
|   | 
| var pushIsNotGeneric = (function () { | 
|     var obj = {}; | 
|     var result = Array.prototype.push.call(obj, undefined); | 
|     return result !== 1 || obj.length !== 1 || typeof obj[0] !== 'undefined' || !owns(obj, 0); | 
| }()); | 
| defineProperties(ArrayPrototype, { | 
|     push: function push(item) { | 
|         if (isArray(this)) { | 
|             return array_push.apply(this, arguments); | 
|         } | 
|         return pushShim.apply(this, arguments); | 
|     } | 
| }, pushIsNotGeneric); | 
|   | 
| // This fixes a very weird bug in Opera 10.6 when pushing `undefined | 
| var pushUndefinedIsWeird = (function () { | 
|     var arr = []; | 
|     var result = arr.push(undefined); | 
|     return result !== 1 || arr.length !== 1 || typeof arr[0] !== 'undefined' || !owns(arr, 0); | 
| }()); | 
| defineProperties(ArrayPrototype, { push: pushShim }, pushUndefinedIsWeird); | 
|   | 
| // ES5 15.2.3.14 | 
| // http://es5.github.io/#x15.4.4.10 | 
| // Fix boxed string bug | 
| defineProperties(ArrayPrototype, { | 
|     slice: function (start, end) { | 
|         var arr = isString(this) ? strSplit(this, '') : this; | 
|         return arraySliceApply(arr, arguments); | 
|     } | 
| }, splitString); | 
|   | 
| var sortIgnoresNonFunctions = (function () { | 
|     try { | 
|         [1, 2].sort(null); | 
|         [1, 2].sort({}); | 
|         return true; | 
|     } catch (e) { /**/ } | 
|     return false; | 
| }()); | 
| var sortThrowsOnRegex = (function () { | 
|     // this is a problem in Firefox 4, in which `typeof /a/ === 'function'` | 
|     try { | 
|         [1, 2].sort(/a/); | 
|         return false; | 
|     } catch (e) { /**/ } | 
|     return true; | 
| }()); | 
| var sortIgnoresUndefined = (function () { | 
|     // applies in IE 8, for one. | 
|     try { | 
|         [1, 2].sort(undefined); | 
|         return true; | 
|     } catch (e) { /**/ } | 
|     return false; | 
| }()); | 
| defineProperties(ArrayPrototype, { | 
|     sort: function sort(compareFn) { | 
|         if (typeof compareFn === 'undefined') { | 
|             return arraySort(this); | 
|         } | 
|         if (!isCallable(compareFn)) { | 
|             throw new TypeError('Array.prototype.sort callback must be a function'); | 
|         } | 
|         return arraySort(this, compareFn); | 
|     } | 
| }, sortIgnoresNonFunctions || !sortIgnoresUndefined || !sortThrowsOnRegex); | 
|   | 
| // | 
| // Object | 
| // ====== | 
| // | 
|   | 
| // ES5 15.2.3.14 | 
| // http://es5.github.com/#x15.2.3.14 | 
|   | 
| // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation | 
| var hasDontEnumBug = !({ 'toString': null }).propertyIsEnumerable('toString'); | 
| var hasProtoEnumBug = function () {}.propertyIsEnumerable('prototype'); | 
| var hasStringEnumBug = !owns('x', '0'); | 
| var equalsConstructorPrototype = function (o) { | 
|     var ctor = o.constructor; | 
|     return ctor && ctor.prototype === o; | 
| }; | 
| var blacklistedKeys = { | 
|     $window: true, | 
|     $console: true, | 
|     $parent: true, | 
|     $self: true, | 
|     $frame: true, | 
|     $frames: true, | 
|     $frameElement: true, | 
|     $webkitIndexedDB: true, | 
|     $webkitStorageInfo: true, | 
|     $external: true | 
| }; | 
| var hasAutomationEqualityBug = (function () { | 
|     /* globals window */ | 
|     if (typeof window === 'undefined') { return false; } | 
|     for (var k in window) { | 
|         try { | 
|             if (!blacklistedKeys['$' + k] && owns(window, k) && window[k] !== null && typeof window[k] === 'object') { | 
|                 equalsConstructorPrototype(window[k]); | 
|             } | 
|         } catch (e) { | 
|             return true; | 
|         } | 
|     } | 
|     return false; | 
| }()); | 
| var equalsConstructorPrototypeIfNotBuggy = function (object) { | 
|     if (typeof window === 'undefined' || !hasAutomationEqualityBug) { return equalsConstructorPrototype(object); } | 
|     try { | 
|         return equalsConstructorPrototype(object); | 
|     } catch (e) { | 
|         return false; | 
|     } | 
| }; | 
| var dontEnums = [ | 
|     'toString', | 
|     'toLocaleString', | 
|     'valueOf', | 
|     'hasOwnProperty', | 
|     'isPrototypeOf', | 
|     'propertyIsEnumerable', | 
|     'constructor' | 
| ]; | 
| var dontEnumsLength = dontEnums.length; | 
|   | 
| // taken directly from https://github.com/ljharb/is-arguments/blob/master/index.js | 
| // can be replaced with require('is-arguments') if we ever use a build process instead | 
| var isStandardArguments = function isArguments(value) { | 
|     return toStr(value) === '[object Arguments]'; | 
| }; | 
| var isLegacyArguments = function isArguments(value) { | 
|     return value !== null && | 
|         typeof value === 'object' && | 
|         typeof value.length === 'number' && | 
|         value.length >= 0 && | 
|         !isArray(value) && | 
|         isCallable(value.callee); | 
| }; | 
| var isArguments = isStandardArguments(arguments) ? isStandardArguments : isLegacyArguments; | 
|   | 
| defineProperties($Object, { | 
|     keys: function keys(object) { | 
|         var isFn = isCallable(object); | 
|         var isArgs = isArguments(object); | 
|         var isObject = object !== null && typeof object === 'object'; | 
|         var isStr = isObject && isString(object); | 
|   | 
|         if (!isObject && !isFn && !isArgs) { | 
|             throw new TypeError('Object.keys called on a non-object'); | 
|         } | 
|   | 
|         var theKeys = []; | 
|         var skipProto = hasProtoEnumBug && isFn; | 
|         if ((isStr && hasStringEnumBug) || isArgs) { | 
|             for (var i = 0; i < object.length; ++i) { | 
|                 pushCall(theKeys, $String(i)); | 
|             } | 
|         } | 
|   | 
|         if (!isArgs) { | 
|             for (var name in object) { | 
|                 if (!(skipProto && name === 'prototype') && owns(object, name)) { | 
|                     pushCall(theKeys, $String(name)); | 
|                 } | 
|             } | 
|         } | 
|   | 
|         if (hasDontEnumBug) { | 
|             var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object); | 
|             for (var j = 0; j < dontEnumsLength; j++) { | 
|                 var dontEnum = dontEnums[j]; | 
|                 if (!(skipConstructor && dontEnum === 'constructor') && owns(object, dontEnum)) { | 
|                     pushCall(theKeys, dontEnum); | 
|                 } | 
|             } | 
|         } | 
|         return theKeys; | 
|     } | 
| }); | 
|   | 
| var keysWorksWithArguments = $Object.keys && (function () { | 
|     // Safari 5.0 bug | 
|     return $Object.keys(arguments).length === 2; | 
| }(1, 2)); | 
| var keysHasArgumentsLengthBug = $Object.keys && (function () { | 
|     var argKeys = $Object.keys(arguments); | 
|     return arguments.length !== 1 || argKeys.length !== 1 || argKeys[0] !== 1; | 
| }(1)); | 
| var originalKeys = $Object.keys; | 
| defineProperties($Object, { | 
|     keys: function keys(object) { | 
|         if (isArguments(object)) { | 
|             return originalKeys(arraySlice(object)); | 
|         } else { | 
|             return originalKeys(object); | 
|         } | 
|     } | 
| }, !keysWorksWithArguments || keysHasArgumentsLengthBug); | 
|   | 
| // | 
| // Date | 
| // ==== | 
| // | 
|   | 
| var hasNegativeMonthYearBug = new Date(-3509827329600292).getUTCMonth() !== 0; | 
| var aNegativeTestDate = new Date(-1509842289600292); | 
| var aPositiveTestDate = new Date(1449662400000); | 
| var hasToUTCStringFormatBug = aNegativeTestDate.toUTCString() !== 'Mon, 01 Jan -45875 11:59:59 GMT'; | 
| var hasToDateStringFormatBug; | 
| var hasToStringFormatBug; | 
| var timeZoneOffset = aNegativeTestDate.getTimezoneOffset(); | 
| if (timeZoneOffset < -720) { | 
|     hasToDateStringFormatBug = aNegativeTestDate.toDateString() !== 'Tue Jan 02 -45875'; | 
|     hasToStringFormatBug = !(/^Thu Dec 10 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/).test(aPositiveTestDate.toString()); | 
| } else { | 
|     hasToDateStringFormatBug = aNegativeTestDate.toDateString() !== 'Mon Jan 01 -45875'; | 
|     hasToStringFormatBug = !(/^Wed Dec 09 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/).test(aPositiveTestDate.toString()); | 
| } | 
|   | 
| var originalGetFullYear = call.bind(Date.prototype.getFullYear); | 
| var originalGetMonth = call.bind(Date.prototype.getMonth); | 
| var originalGetDate = call.bind(Date.prototype.getDate); | 
| var originalGetUTCFullYear = call.bind(Date.prototype.getUTCFullYear); | 
| var originalGetUTCMonth = call.bind(Date.prototype.getUTCMonth); | 
| var originalGetUTCDate = call.bind(Date.prototype.getUTCDate); | 
| var originalGetUTCDay = call.bind(Date.prototype.getUTCDay); | 
| var originalGetUTCHours = call.bind(Date.prototype.getUTCHours); | 
| var originalGetUTCMinutes = call.bind(Date.prototype.getUTCMinutes); | 
| var originalGetUTCSeconds = call.bind(Date.prototype.getUTCSeconds); | 
| var originalGetUTCMilliseconds = call.bind(Date.prototype.getUTCMilliseconds); | 
| var dayName = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; | 
| var monthName = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; | 
| var daysInMonth = function daysInMonth(month, year) { | 
|     return originalGetDate(new Date(year, month, 0)); | 
| }; | 
|   | 
| defineProperties(Date.prototype, { | 
|     getFullYear: function getFullYear() { | 
|         if (!this || !(this instanceof Date)) { | 
|             throw new TypeError('this is not a Date object.'); | 
|         } | 
|         var year = originalGetFullYear(this); | 
|         if (year < 0 && originalGetMonth(this) > 11) { | 
|             return year + 1; | 
|         } | 
|         return year; | 
|     }, | 
|     getMonth: function getMonth() { | 
|         if (!this || !(this instanceof Date)) { | 
|             throw new TypeError('this is not a Date object.'); | 
|         } | 
|         var year = originalGetFullYear(this); | 
|         var month = originalGetMonth(this); | 
|         if (year < 0 && month > 11) { | 
|             return 0; | 
|         } | 
|         return month; | 
|     }, | 
|     getDate: function getDate() { | 
|         if (!this || !(this instanceof Date)) { | 
|             throw new TypeError('this is not a Date object.'); | 
|         } | 
|         var year = originalGetFullYear(this); | 
|         var month = originalGetMonth(this); | 
|         var date = originalGetDate(this); | 
|         if (year < 0 && month > 11) { | 
|             if (month === 12) { | 
|                 return date; | 
|             } | 
|             var days = daysInMonth(0, year + 1); | 
|             return (days - date) + 1; | 
|         } | 
|         return date; | 
|     }, | 
|     getUTCFullYear: function getUTCFullYear() { | 
|         if (!this || !(this instanceof Date)) { | 
|             throw new TypeError('this is not a Date object.'); | 
|         } | 
|         var year = originalGetUTCFullYear(this); | 
|         if (year < 0 && originalGetUTCMonth(this) > 11) { | 
|             return year + 1; | 
|         } | 
|         return year; | 
|     }, | 
|     getUTCMonth: function getUTCMonth() { | 
|         if (!this || !(this instanceof Date)) { | 
|             throw new TypeError('this is not a Date object.'); | 
|         } | 
|         var year = originalGetUTCFullYear(this); | 
|         var month = originalGetUTCMonth(this); | 
|         if (year < 0 && month > 11) { | 
|             return 0; | 
|         } | 
|         return month; | 
|     }, | 
|     getUTCDate: function getUTCDate() { | 
|         if (!this || !(this instanceof Date)) { | 
|             throw new TypeError('this is not a Date object.'); | 
|         } | 
|         var year = originalGetUTCFullYear(this); | 
|         var month = originalGetUTCMonth(this); | 
|         var date = originalGetUTCDate(this); | 
|         if (year < 0 && month > 11) { | 
|             if (month === 12) { | 
|                 return date; | 
|             } | 
|             var days = daysInMonth(0, year + 1); | 
|             return (days - date) + 1; | 
|         } | 
|         return date; | 
|     } | 
| }, hasNegativeMonthYearBug); | 
|   | 
| defineProperties(Date.prototype, { | 
|     toUTCString: function toUTCString() { | 
|         if (!this || !(this instanceof Date)) { | 
|             throw new TypeError('this is not a Date object.'); | 
|         } | 
|         var day = originalGetUTCDay(this); | 
|         var date = originalGetUTCDate(this); | 
|         var month = originalGetUTCMonth(this); | 
|         var year = originalGetUTCFullYear(this); | 
|         var hour = originalGetUTCHours(this); | 
|         var minute = originalGetUTCMinutes(this); | 
|         var second = originalGetUTCSeconds(this); | 
|         return dayName[day] + ', ' + | 
|             (date < 10 ? '0' + date : date) + ' ' + | 
|             monthName[month] + ' ' + | 
|             year + ' ' + | 
|             (hour < 10 ? '0' + hour : hour) + ':' + | 
|             (minute < 10 ? '0' + minute : minute) + ':' + | 
|             (second < 10 ? '0' + second : second) + ' GMT'; | 
|     } | 
| }, hasNegativeMonthYearBug || hasToUTCStringFormatBug); | 
|   | 
| // Opera 12 has `,` | 
| defineProperties(Date.prototype, { | 
|     toDateString: function toDateString() { | 
|         if (!this || !(this instanceof Date)) { | 
|             throw new TypeError('this is not a Date object.'); | 
|         } | 
|         var day = this.getDay(); | 
|         var date = this.getDate(); | 
|         var month = this.getMonth(); | 
|         var year = this.getFullYear(); | 
|         return dayName[day] + ' ' + | 
|             monthName[month] + ' ' + | 
|             (date < 10 ? '0' + date : date) + ' ' + | 
|             year; | 
|     } | 
| }, hasNegativeMonthYearBug || hasToDateStringFormatBug); | 
|   | 
| // can't use defineProperties here because of toString enumeration issue in IE <= 8 | 
| if (hasNegativeMonthYearBug || hasToStringFormatBug) { | 
|     Date.prototype.toString = function toString() { | 
|         if (!this || !(this instanceof Date)) { | 
|             throw new TypeError('this is not a Date object.'); | 
|         } | 
|         var day = this.getDay(); | 
|         var date = this.getDate(); | 
|         var month = this.getMonth(); | 
|         var year = this.getFullYear(); | 
|         var hour = this.getHours(); | 
|         var minute = this.getMinutes(); | 
|         var second = this.getSeconds(); | 
|         var timezoneOffset = this.getTimezoneOffset(); | 
|         var hoursOffset = Math.floor(Math.abs(timezoneOffset) / 60); | 
|         var minutesOffset = Math.floor(Math.abs(timezoneOffset) % 60); | 
|         return dayName[day] + ' ' + | 
|             monthName[month] + ' ' + | 
|             (date < 10 ? '0' + date : date) + ' ' + | 
|             year + ' ' + | 
|             (hour < 10 ? '0' + hour : hour) + ':' + | 
|             (minute < 10 ? '0' + minute : minute) + ':' + | 
|             (second < 10 ? '0' + second : second) + ' GMT' + | 
|             (timezoneOffset > 0 ? '-' : '+') + | 
|             (hoursOffset < 10 ? '0' + hoursOffset : hoursOffset) + | 
|             (minutesOffset < 10 ? '0' + minutesOffset : minutesOffset); | 
|     }; | 
|     if (supportsDescriptors) { | 
|         $Object.defineProperty(Date.prototype, 'toString', { | 
|             configurable: true, | 
|             enumerable: false, | 
|             writable: true | 
|         }); | 
|     } | 
| } | 
|   | 
| // ES5 15.9.5.43 | 
| // http://es5.github.com/#x15.9.5.43 | 
| // This function returns a String value represent the instance in time | 
| // represented by this Date object. The format of the String is the Date Time | 
| // string format defined in 15.9.1.15. All fields are present in the String. | 
| // The time zone is always UTC, denoted by the suffix Z. If the time value of | 
| // this object is not a finite Number a RangeError exception is thrown. | 
| var negativeDate = -62198755200000; | 
| var negativeYearString = '-000001'; | 
| var hasNegativeDateBug = Date.prototype.toISOString && new Date(negativeDate).toISOString().indexOf(negativeYearString) === -1; | 
| var hasSafari51DateBug = Date.prototype.toISOString && new Date(-1).toISOString() !== '1969-12-31T23:59:59.999Z'; | 
|   | 
| var getTime = call.bind(Date.prototype.getTime); | 
|   | 
| defineProperties(Date.prototype, { | 
|     toISOString: function toISOString() { | 
|         if (!isFinite(this) || !isFinite(getTime(this))) { | 
|             // Adope Photoshop requires the second check. | 
|             throw new RangeError('Date.prototype.toISOString called on non-finite value.'); | 
|         } | 
|   | 
|         var year = originalGetUTCFullYear(this); | 
|   | 
|         var month = originalGetUTCMonth(this); | 
|         // see https://github.com/es-shims/es5-shim/issues/111 | 
|         year += Math.floor(month / 12); | 
|         month = (month % 12 + 12) % 12; | 
|   | 
|         // the date time string format is specified in 15.9.1.15. | 
|         var result = [month + 1, originalGetUTCDate(this), originalGetUTCHours(this), originalGetUTCMinutes(this), originalGetUTCSeconds(this)]; | 
|         year = ( | 
|             (year < 0 ? '-' : (year > 9999 ? '+' : '')) + | 
|             strSlice('00000' + Math.abs(year), (0 <= year && year <= 9999) ? -4 : -6) | 
|         ); | 
|   | 
|         for (var i = 0; i < result.length; ++i) { | 
|           // pad months, days, hours, minutes, and seconds to have two digits. | 
|           result[i] = strSlice('00' + result[i], -2); | 
|         } | 
|         // pad milliseconds to have three digits. | 
|         return ( | 
|             year + '-' + arraySlice(result, 0, 2).join('-') + | 
|             'T' + arraySlice(result, 2).join(':') + '.' + | 
|             strSlice('000' + originalGetUTCMilliseconds(this), -3) + 'Z' | 
|         ); | 
|     } | 
| }, hasNegativeDateBug || hasSafari51DateBug); | 
|   | 
| // ES5 15.9.5.44 | 
| // http://es5.github.com/#x15.9.5.44 | 
| // This function provides a String representation of a Date object for use by | 
| // JSON.stringify (15.12.3). | 
| var dateToJSONIsSupported = (function () { | 
|     try { | 
|         return Date.prototype.toJSON && | 
|             new Date(NaN).toJSON() === null && | 
|             new Date(negativeDate).toJSON().indexOf(negativeYearString) !== -1 && | 
|             Date.prototype.toJSON.call({ // generic | 
|                 toISOString: function () { return true; } | 
|             }); | 
|     } catch (e) { | 
|         return false; | 
|     } | 
| }()); | 
| if (!dateToJSONIsSupported) { | 
|     Date.prototype.toJSON = function toJSON(key) { | 
|         // When the toJSON method is called with argument key, the following | 
|         // steps are taken: | 
|   | 
|         // 1.  Let O be the result of calling ToObject, giving it the this | 
|         // value as its argument. | 
|         // 2. Let tv be ES.ToPrimitive(O, hint Number). | 
|         var O = $Object(this); | 
|         var tv = ES.ToPrimitive(O); | 
|         // 3. If tv is a Number and is not finite, return null. | 
|         if (typeof tv === 'number' && !isFinite(tv)) { | 
|             return null; | 
|         } | 
|         // 4. Let toISO be the result of calling the [[Get]] internal method of | 
|         // O with argument "toISOString". | 
|         var toISO = O.toISOString; | 
|         // 5. If IsCallable(toISO) is false, throw a TypeError exception. | 
|         if (!isCallable(toISO)) { | 
|             throw new TypeError('toISOString property is not callable'); | 
|         } | 
|         // 6. Return the result of calling the [[Call]] internal method of | 
|         //  toISO with O as the this value and an empty argument list. | 
|         return toISO.call(O); | 
|   | 
|         // NOTE 1 The argument is ignored. | 
|   | 
|         // NOTE 2 The toJSON function is intentionally generic; it does not | 
|         // require that its this value be a Date object. Therefore, it can be | 
|         // transferred to other kinds of objects for use as a method. However, | 
|         // it does require that any such object have a toISOString method. An | 
|         // object is free to use the argument key to filter its | 
|         // stringification. | 
|     }; | 
| } | 
|   | 
| // ES5 15.9.4.2 | 
| // http://es5.github.com/#x15.9.4.2 | 
| // based on work shared by Daniel Friesen (dantman) | 
| // http://gist.github.com/303249 | 
| var supportsExtendedYears = Date.parse('+033658-09-27T01:46:40.000Z') === 1e15; | 
| var acceptsInvalidDates = !isNaN(Date.parse('2012-04-04T24:00:00.500Z')) || !isNaN(Date.parse('2012-11-31T23:59:59.000Z')) || !isNaN(Date.parse('2012-12-31T23:59:60.000Z')); | 
| var doesNotParseY2KNewYear = isNaN(Date.parse('2000-01-01T00:00:00.000Z')); | 
| if (doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExtendedYears) { | 
|     // XXX global assignment won't work in embeddings that use | 
|     // an alternate object for the context. | 
|     /* global Date: true */ | 
|     /* eslint-disable no-undef */ | 
|     var maxSafeUnsigned32Bit = Math.pow(2, 31) - 1; | 
|     var hasSafariSignedIntBug = isActualNaN(new Date(1970, 0, 1, 0, 0, 0, maxSafeUnsigned32Bit + 1).getTime()); | 
|     /* eslint-disable no-implicit-globals */ | 
|     Date = (function (NativeDate) { | 
|     /* eslint-enable no-implicit-globals */ | 
|     /* eslint-enable no-undef */ | 
|         // Date.length === 7 | 
|         var DateShim = function Date(Y, M, D, h, m, s, ms) { | 
|             var length = arguments.length; | 
|             var date; | 
|             if (this instanceof NativeDate) { | 
|                 var seconds = s; | 
|                 var millis = ms; | 
|                 if (hasSafariSignedIntBug && length >= 7 && ms > maxSafeUnsigned32Bit) { | 
|                     // work around a Safari 8/9 bug where it treats the seconds as signed | 
|                     var msToShift = Math.floor(ms / maxSafeUnsigned32Bit) * maxSafeUnsigned32Bit; | 
|                     var sToShift = Math.floor(msToShift / 1e3); | 
|                     seconds += sToShift; | 
|                     millis -= sToShift * 1e3; | 
|                 } | 
|                 date = length === 1 && $String(Y) === Y ? // isString(Y) | 
|                     // We explicitly pass it through parse: | 
|                     new NativeDate(DateShim.parse(Y)) : | 
|                     // We have to manually make calls depending on argument | 
|                     // length here | 
|                     length >= 7 ? new NativeDate(Y, M, D, h, m, seconds, millis) : | 
|                     length >= 6 ? new NativeDate(Y, M, D, h, m, seconds) : | 
|                     length >= 5 ? new NativeDate(Y, M, D, h, m) : | 
|                     length >= 4 ? new NativeDate(Y, M, D, h) : | 
|                     length >= 3 ? new NativeDate(Y, M, D) : | 
|                     length >= 2 ? new NativeDate(Y, M) : | 
|                     length >= 1 ? new NativeDate(Y instanceof NativeDate ? +Y : Y) : | 
|                                   new NativeDate(); | 
|             } else { | 
|                 date = NativeDate.apply(this, arguments); | 
|             } | 
|             if (!isPrimitive(date)) { | 
|               // Prevent mixups with unfixed Date object | 
|               defineProperties(date, { constructor: DateShim }, true); | 
|             } | 
|             return date; | 
|         }; | 
|   | 
|         // 15.9.1.15 Date Time String Format. | 
|         var isoDateExpression = new RegExp('^' + | 
|             '(\\d{4}|[+-]\\d{6})' + // four-digit year capture or sign + | 
|                                       // 6-digit extended year | 
|             '(?:-(\\d{2})' + // optional month capture | 
|             '(?:-(\\d{2})' + // optional day capture | 
|             '(?:' + // capture hours:minutes:seconds.milliseconds | 
|                 'T(\\d{2})' + // hours capture | 
|                 ':(\\d{2})' + // minutes capture | 
|                 '(?:' + // optional :seconds.milliseconds | 
|                     ':(\\d{2})' + // seconds capture | 
|                     '(?:(\\.\\d{1,}))?' + // milliseconds capture | 
|                 ')?' + | 
|             '(' + // capture UTC offset component | 
|                 'Z|' + // UTC capture | 
|                 '(?:' + // offset specifier +/-hours:minutes | 
|                     '([-+])' + // sign capture | 
|                     '(\\d{2})' + // hours offset capture | 
|                     ':(\\d{2})' + // minutes offset capture | 
|                 ')' + | 
|             ')?)?)?)?' + | 
|         '$'); | 
|   | 
|         var months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365]; | 
|   | 
|         var dayFromMonth = function dayFromMonth(year, month) { | 
|             var t = month > 1 ? 1 : 0; | 
|             return ( | 
|                 months[month] + | 
|                 Math.floor((year - 1969 + t) / 4) - | 
|                 Math.floor((year - 1901 + t) / 100) + | 
|                 Math.floor((year - 1601 + t) / 400) + | 
|                 365 * (year - 1970) | 
|             ); | 
|         }; | 
|   | 
|         var toUTC = function toUTC(t) { | 
|             var s = 0; | 
|             var ms = t; | 
|             if (hasSafariSignedIntBug && ms > maxSafeUnsigned32Bit) { | 
|                 // work around a Safari 8/9 bug where it treats the seconds as signed | 
|                 var msToShift = Math.floor(ms / maxSafeUnsigned32Bit) * maxSafeUnsigned32Bit; | 
|                 var sToShift = Math.floor(msToShift / 1e3); | 
|                 s += sToShift; | 
|                 ms -= sToShift * 1e3; | 
|             } | 
|             return $Number(new NativeDate(1970, 0, 1, 0, 0, s, ms)); | 
|         }; | 
|   | 
|         // Copy any custom methods a 3rd party library may have added | 
|         for (var key in NativeDate) { | 
|             if (owns(NativeDate, key)) { | 
|                 DateShim[key] = NativeDate[key]; | 
|             } | 
|         } | 
|   | 
|         // Copy "native" methods explicitly; they may be non-enumerable | 
|         defineProperties(DateShim, { | 
|             now: NativeDate.now, | 
|             UTC: NativeDate.UTC | 
|         }, true); | 
|         DateShim.prototype = NativeDate.prototype; | 
|         defineProperties(DateShim.prototype, { | 
|             constructor: DateShim | 
|         }, true); | 
|   | 
|         // Upgrade Date.parse to handle simplified ISO 8601 strings | 
|         var parseShim = function parse(string) { | 
|             var match = isoDateExpression.exec(string); | 
|             if (match) { | 
|                 // parse months, days, hours, minutes, seconds, and milliseconds | 
|                 // provide default values if necessary | 
|                 // parse the UTC offset component | 
|                 var year = $Number(match[1]), | 
|                     month = $Number(match[2] || 1) - 1, | 
|                     day = $Number(match[3] || 1) - 1, | 
|                     hour = $Number(match[4] || 0), | 
|                     minute = $Number(match[5] || 0), | 
|                     second = $Number(match[6] || 0), | 
|                     millisecond = Math.floor($Number(match[7] || 0) * 1000), | 
|                     // When time zone is missed, local offset should be used | 
|                     // (ES 5.1 bug) | 
|                     // see https://bugs.ecmascript.org/show_bug.cgi?id=112 | 
|                     isLocalTime = Boolean(match[4] && !match[8]), | 
|                     signOffset = match[9] === '-' ? 1 : -1, | 
|                     hourOffset = $Number(match[10] || 0), | 
|                     minuteOffset = $Number(match[11] || 0), | 
|                     result; | 
|                 var hasMinutesOrSecondsOrMilliseconds = minute > 0 || second > 0 || millisecond > 0; | 
|                 if ( | 
|                     hour < (hasMinutesOrSecondsOrMilliseconds ? 24 : 25) && | 
|                     minute < 60 && second < 60 && millisecond < 1000 && | 
|                     month > -1 && month < 12 && hourOffset < 24 && | 
|                     minuteOffset < 60 && // detect invalid offsets | 
|                     day > -1 && | 
|                     day < (dayFromMonth(year, month + 1) - dayFromMonth(year, month)) | 
|                 ) { | 
|                     result = ( | 
|                         (dayFromMonth(year, month) + day) * 24 + | 
|                         hour + | 
|                         hourOffset * signOffset | 
|                     ) * 60; | 
|                     result = ( | 
|                         (result + minute + minuteOffset * signOffset) * 60 + | 
|                         second | 
|                     ) * 1000 + millisecond; | 
|                     if (isLocalTime) { | 
|                         result = toUTC(result); | 
|                     } | 
|                     if (-8.64e15 <= result && result <= 8.64e15) { | 
|                         return result; | 
|                     } | 
|                 } | 
|                 return NaN; | 
|             } | 
|             return NativeDate.parse.apply(this, arguments); | 
|         }; | 
|         defineProperties(DateShim, { parse: parseShim }); | 
|   | 
|         return DateShim; | 
|     }(Date)); | 
|     /* global Date: false */ | 
| } | 
|   | 
| // ES5 15.9.4.4 | 
| // http://es5.github.com/#x15.9.4.4 | 
| if (!Date.now) { | 
|     Date.now = function now() { | 
|         return new Date().getTime(); | 
|     }; | 
| } | 
|   | 
| // | 
| // Number | 
| // ====== | 
| // | 
|   | 
| // ES5.1 15.7.4.5 | 
| // http://es5.github.com/#x15.7.4.5 | 
| var hasToFixedBugs = NumberPrototype.toFixed && ( | 
|   (0.00008).toFixed(3) !== '0.000' || | 
|   (0.9).toFixed(0) !== '1' || | 
|   (1.255).toFixed(2) !== '1.25' || | 
|   (1000000000000000128).toFixed(0) !== '1000000000000000128' | 
| ); | 
|   | 
| var toFixedHelpers = { | 
|   base: 1e7, | 
|   size: 6, | 
|   data: [0, 0, 0, 0, 0, 0], | 
|   multiply: function multiply(n, c) { | 
|       var i = -1; | 
|       var c2 = c; | 
|       while (++i < toFixedHelpers.size) { | 
|           c2 += n * toFixedHelpers.data[i]; | 
|           toFixedHelpers.data[i] = c2 % toFixedHelpers.base; | 
|           c2 = Math.floor(c2 / toFixedHelpers.base); | 
|       } | 
|   }, | 
|   divide: function divide(n) { | 
|       var i = toFixedHelpers.size; | 
|       var c = 0; | 
|       while (--i >= 0) { | 
|           c += toFixedHelpers.data[i]; | 
|           toFixedHelpers.data[i] = Math.floor(c / n); | 
|           c = (c % n) * toFixedHelpers.base; | 
|       } | 
|   }, | 
|   numToString: function numToString() { | 
|       var i = toFixedHelpers.size; | 
|       var s = ''; | 
|       while (--i >= 0) { | 
|           if (s !== '' || i === 0 || toFixedHelpers.data[i] !== 0) { | 
|               var t = $String(toFixedHelpers.data[i]); | 
|               if (s === '') { | 
|                   s = t; | 
|               } else { | 
|                   s += strSlice('0000000', 0, 7 - t.length) + t; | 
|               } | 
|           } | 
|       } | 
|       return s; | 
|   }, | 
|   pow: function pow(x, n, acc) { | 
|       return (n === 0 ? acc : (n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc))); | 
|   }, | 
|   log: function log(x) { | 
|       var n = 0; | 
|       var x2 = x; | 
|       while (x2 >= 4096) { | 
|           n += 12; | 
|           x2 /= 4096; | 
|       } | 
|       while (x2 >= 2) { | 
|           n += 1; | 
|           x2 /= 2; | 
|       } | 
|       return n; | 
|   } | 
| }; | 
|   | 
| var toFixedShim = function toFixed(fractionDigits) { | 
|     var f, x, s, m, e, z, j, k; | 
|   | 
|     // Test for NaN and round fractionDigits down | 
|     f = $Number(fractionDigits); | 
|     f = isActualNaN(f) ? 0 : Math.floor(f); | 
|   | 
|     if (f < 0 || f > 20) { | 
|         throw new RangeError('Number.toFixed called with invalid number of decimals'); | 
|     } | 
|   | 
|     x = $Number(this); | 
|   | 
|     if (isActualNaN(x)) { | 
|         return 'NaN'; | 
|     } | 
|   | 
|     // If it is too big or small, return the string value of the number | 
|     if (x <= -1e21 || x >= 1e21) { | 
|         return $String(x); | 
|     } | 
|   | 
|     s = ''; | 
|   | 
|     if (x < 0) { | 
|         s = '-'; | 
|         x = -x; | 
|     } | 
|   | 
|     m = '0'; | 
|   | 
|     if (x > 1e-21) { | 
|         // 1e-21 < x < 1e21 | 
|         // -70 < log2(x) < 70 | 
|         e = toFixedHelpers.log(x * toFixedHelpers.pow(2, 69, 1)) - 69; | 
|         z = (e < 0 ? x * toFixedHelpers.pow(2, -e, 1) : x / toFixedHelpers.pow(2, e, 1)); | 
|         z *= 0x10000000000000; // Math.pow(2, 52); | 
|         e = 52 - e; | 
|   | 
|         // -18 < e < 122 | 
|         // x = z / 2 ^ e | 
|         if (e > 0) { | 
|             toFixedHelpers.multiply(0, z); | 
|             j = f; | 
|   | 
|             while (j >= 7) { | 
|                 toFixedHelpers.multiply(1e7, 0); | 
|                 j -= 7; | 
|             } | 
|   | 
|             toFixedHelpers.multiply(toFixedHelpers.pow(10, j, 1), 0); | 
|             j = e - 1; | 
|   | 
|             while (j >= 23) { | 
|                 toFixedHelpers.divide(1 << 23); | 
|                 j -= 23; | 
|             } | 
|   | 
|             toFixedHelpers.divide(1 << j); | 
|             toFixedHelpers.multiply(1, 1); | 
|             toFixedHelpers.divide(2); | 
|             m = toFixedHelpers.numToString(); | 
|         } else { | 
|             toFixedHelpers.multiply(0, z); | 
|             toFixedHelpers.multiply(1 << (-e), 0); | 
|             m = toFixedHelpers.numToString() + strSlice('0.00000000000000000000', 2, 2 + f); | 
|         } | 
|     } | 
|   | 
|     if (f > 0) { | 
|         k = m.length; | 
|   | 
|         if (k <= f) { | 
|             m = s + strSlice('0.0000000000000000000', 0, f - k + 2) + m; | 
|         } else { | 
|             m = s + strSlice(m, 0, k - f) + '.' + strSlice(m, k - f); | 
|         } | 
|     } else { | 
|         m = s + m; | 
|     } | 
|   | 
|     return m; | 
| }; | 
| defineProperties(NumberPrototype, { toFixed: toFixedShim }, hasToFixedBugs); | 
|   | 
| var hasToPrecisionUndefinedBug = (function () { | 
|     try { | 
|         return 1.0.toPrecision(undefined) === '1'; | 
|     } catch (e) { | 
|         return true; | 
|     } | 
| }()); | 
| var originalToPrecision = NumberPrototype.toPrecision; | 
| defineProperties(NumberPrototype, { | 
|     toPrecision: function toPrecision(precision) { | 
|         return typeof precision === 'undefined' ? originalToPrecision.call(this) : originalToPrecision.call(this, precision); | 
|     } | 
| }, hasToPrecisionUndefinedBug); | 
|   | 
| // | 
| // String | 
| // ====== | 
| // | 
|   | 
| // ES5 15.5.4.14 | 
| // http://es5.github.com/#x15.5.4.14 | 
|   | 
| // [bugfix, IE lt 9, firefox 4, Konqueror, Opera, obscure browsers] | 
| // Many browsers do not split properly with regular expressions or they | 
| // do not perform the split correctly under obscure conditions. | 
| // See http://blog.stevenlevithan.com/archives/cross-browser-split | 
| // I've tested in many browsers and this seems to cover the deviant ones: | 
| //    'ab'.split(/(?:ab)*/) should be ["", ""], not [""] | 
| //    '.'.split(/(.?)(.?)/) should be ["", ".", "", ""], not ["", ""] | 
| //    'tesst'.split(/(s)*/) should be ["t", undefined, "e", "s", "t"], not | 
| //       [undefined, "t", undefined, "e", ...] | 
| //    ''.split(/.?/) should be [], not [""] | 
| //    '.'.split(/()()/) should be ["."], not ["", "", "."] | 
|   | 
| if ( | 
|     'ab'.split(/(?:ab)*/).length !== 2 || | 
|     '.'.split(/(.?)(.?)/).length !== 4 || | 
|     'tesst'.split(/(s)*/)[1] === 't' || | 
|     'test'.split(/(?:)/, -1).length !== 4 || | 
|     ''.split(/.?/).length || | 
|     '.'.split(/()()/).length > 1 | 
| ) { | 
|     (function () { | 
|         var compliantExecNpcg = typeof (/()??/).exec('')[1] === 'undefined'; // NPCG: nonparticipating capturing group | 
|         var maxSafe32BitInt = Math.pow(2, 32) - 1; | 
|   | 
|         StringPrototype.split = function (separator, limit) { | 
|             var string = String(this); | 
|             if (typeof separator === 'undefined' && limit === 0) { | 
|                 return []; | 
|             } | 
|   | 
|             // If `separator` is not a regex, use native split | 
|             if (!isRegex(separator)) { | 
|                 return strSplit(this, separator, limit); | 
|             } | 
|   | 
|             var output = []; | 
|             var flags = (separator.ignoreCase ? 'i' : '') + | 
|                         (separator.multiline ? 'm' : '') + | 
|                         (separator.unicode ? 'u' : '') + // in ES6 | 
|                         (separator.sticky ? 'y' : ''), // Firefox 3+ and ES6 | 
|                 lastLastIndex = 0, | 
|                 // Make `global` and avoid `lastIndex` issues by working with a copy | 
|                 separator2, match, lastIndex, lastLength; | 
|             var separatorCopy = new RegExp(separator.source, flags + 'g'); | 
|             if (!compliantExecNpcg) { | 
|                 // Doesn't need flags gy, but they don't hurt | 
|                 separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\s)', flags); | 
|             } | 
|             /* Values for `limit`, per the spec: | 
|              * If undefined: 4294967295 // maxSafe32BitInt | 
|              * If 0, Infinity, or NaN: 0 | 
|              * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296; | 
|              * If negative number: 4294967296 - Math.floor(Math.abs(limit)) | 
|              * If other: Type-convert, then use the above rules | 
|              */ | 
|             var splitLimit = typeof limit === 'undefined' ? maxSafe32BitInt : ES.ToUint32(limit); | 
|             match = separatorCopy.exec(string); | 
|             while (match) { | 
|                 // `separatorCopy.lastIndex` is not reliable cross-browser | 
|                 lastIndex = match.index + match[0].length; | 
|                 if (lastIndex > lastLastIndex) { | 
|                     pushCall(output, strSlice(string, lastLastIndex, match.index)); | 
|                     // Fix browsers whose `exec` methods don't consistently return `undefined` for | 
|                     // nonparticipating capturing groups | 
|                     if (!compliantExecNpcg && match.length > 1) { | 
|                         /* eslint-disable no-loop-func */ | 
|                         match[0].replace(separator2, function () { | 
|                             for (var i = 1; i < arguments.length - 2; i++) { | 
|                                 if (typeof arguments[i] === 'undefined') { | 
|                                     match[i] = void 0; | 
|                                 } | 
|                             } | 
|                         }); | 
|                         /* eslint-enable no-loop-func */ | 
|                     } | 
|                     if (match.length > 1 && match.index < string.length) { | 
|                         array_push.apply(output, arraySlice(match, 1)); | 
|                     } | 
|                     lastLength = match[0].length; | 
|                     lastLastIndex = lastIndex; | 
|                     if (output.length >= splitLimit) { | 
|                         break; | 
|                     } | 
|                 } | 
|                 if (separatorCopy.lastIndex === match.index) { | 
|                     separatorCopy.lastIndex++; // Avoid an infinite loop | 
|                 } | 
|                 match = separatorCopy.exec(string); | 
|             } | 
|             if (lastLastIndex === string.length) { | 
|                 if (lastLength || !separatorCopy.test('')) { | 
|                     pushCall(output, ''); | 
|                 } | 
|             } else { | 
|                 pushCall(output, strSlice(string, lastLastIndex)); | 
|             } | 
|             return output.length > splitLimit ? arraySlice(output, 0, splitLimit) : output; | 
|         }; | 
|     }()); | 
|   | 
| // [bugfix, chrome] | 
| // If separator is undefined, then the result array contains just one String, | 
| // which is the this value (converted to a String). If limit is not undefined, | 
| // then the output array is truncated so that it contains no more than limit | 
| // elements. | 
| // "0".split(undefined, 0) -> [] | 
| } else if ('0'.split(void 0, 0).length) { | 
|     StringPrototype.split = function split(separator, limit) { | 
|         if (typeof separator === 'undefined' && limit === 0) { return []; } | 
|         return strSplit(this, separator, limit); | 
|     }; | 
| } | 
|   | 
| var str_replace = StringPrototype.replace; | 
| var replaceReportsGroupsCorrectly = (function () { | 
|     var groups = []; | 
|     'x'.replace(/x(.)?/g, function (match, group) { | 
|         pushCall(groups, group); | 
|     }); | 
|     return groups.length === 1 && typeof groups[0] === 'undefined'; | 
| }()); | 
|   | 
| if (!replaceReportsGroupsCorrectly) { | 
|     StringPrototype.replace = function replace(searchValue, replaceValue) { | 
|         var isFn = isCallable(replaceValue); | 
|         var hasCapturingGroups = isRegex(searchValue) && (/\)[*?]/).test(searchValue.source); | 
|         if (!isFn || !hasCapturingGroups) { | 
|             return str_replace.call(this, searchValue, replaceValue); | 
|         } else { | 
|             var wrappedReplaceValue = function (match) { | 
|                 var length = arguments.length; | 
|                 var originalLastIndex = searchValue.lastIndex; | 
|                 searchValue.lastIndex = 0; | 
|                 var args = searchValue.exec(match) || []; | 
|                 searchValue.lastIndex = originalLastIndex; | 
|                 pushCall(args, arguments[length - 2], arguments[length - 1]); | 
|                 return replaceValue.apply(this, args); | 
|             }; | 
|             return str_replace.call(this, searchValue, wrappedReplaceValue); | 
|         } | 
|     }; | 
| } | 
|   | 
| // ECMA-262, 3rd B.2.3 | 
| // Not an ECMAScript standard, although ECMAScript 3rd Edition has a | 
| // non-normative section suggesting uniform semantics and it should be | 
| // normalized across all browsers | 
| // [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE | 
| var string_substr = StringPrototype.substr; | 
| var hasNegativeSubstrBug = ''.substr && '0b'.substr(-1) !== 'b'; | 
| defineProperties(StringPrototype, { | 
|     substr: function substr(start, length) { | 
|         var normalizedStart = start; | 
|         if (start < 0) { | 
|             normalizedStart = max(this.length + start, 0); | 
|         } | 
|         return string_substr.call(this, normalizedStart, length); | 
|     } | 
| }, hasNegativeSubstrBug); | 
|   | 
| // ES5 15.5.4.20 | 
| // whitespace from: http://es5.github.io/#x15.5.4.20 | 
| var ws = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' + | 
|     '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028' + | 
|     '\u2029\uFEFF'; | 
| var zeroWidth = '\u200b'; | 
| var wsRegexChars = '[' + ws + ']'; | 
| var trimBeginRegexp = new RegExp('^' + wsRegexChars + wsRegexChars + '*'); | 
| var trimEndRegexp = new RegExp(wsRegexChars + wsRegexChars + '*$'); | 
| var hasTrimWhitespaceBug = StringPrototype.trim && (ws.trim() || !zeroWidth.trim()); | 
| defineProperties(StringPrototype, { | 
|     // http://blog.stevenlevithan.com/archives/faster-trim-javascript | 
|     // http://perfectionkills.com/whitespace-deviations/ | 
|     trim: function trim() { | 
|         if (typeof this === 'undefined' || this === null) { | 
|             throw new TypeError("can't convert " + this + ' to object'); | 
|         } | 
|         return $String(this).replace(trimBeginRegexp, '').replace(trimEndRegexp, ''); | 
|     } | 
| }, hasTrimWhitespaceBug); | 
| var trim = call.bind(String.prototype.trim); | 
|   | 
| var hasLastIndexBug = StringPrototype.lastIndexOf && 'abcあい'.lastIndexOf('あい', 2) !== -1; | 
| defineProperties(StringPrototype, { | 
|     lastIndexOf: function lastIndexOf(searchString) { | 
|         if (typeof this === 'undefined' || this === null) { | 
|             throw new TypeError("can't convert " + this + ' to object'); | 
|         } | 
|         var S = $String(this); | 
|         var searchStr = $String(searchString); | 
|         var numPos = arguments.length > 1 ? $Number(arguments[1]) : NaN; | 
|         var pos = isActualNaN(numPos) ? Infinity : ES.ToInteger(numPos); | 
|         var start = min(max(pos, 0), S.length); | 
|         var searchLen = searchStr.length; | 
|         var k = start + searchLen; | 
|         while (k > 0) { | 
|             k = max(0, k - searchLen); | 
|             var index = strIndexOf(strSlice(S, k, start + searchLen), searchStr); | 
|             if (index !== -1) { | 
|                 return k + index; | 
|             } | 
|         } | 
|         return -1; | 
|     } | 
| }, hasLastIndexBug); | 
|   | 
| var originalLastIndexOf = StringPrototype.lastIndexOf; | 
| defineProperties(StringPrototype, { | 
|     lastIndexOf: function lastIndexOf(searchString) { | 
|         return originalLastIndexOf.apply(this, arguments); | 
|     } | 
| }, StringPrototype.lastIndexOf.length !== 1); | 
|   | 
| // ES-5 15.1.2.2 | 
| /* eslint-disable radix */ | 
| if (parseInt(ws + '08') !== 8 || parseInt(ws + '0x16') !== 22) { | 
| /* eslint-enable radix */ | 
|     /* global parseInt: true */ | 
|     parseInt = (function (origParseInt) { | 
|         var hexRegex = /^[\-+]?0[xX]/; | 
|         return function parseInt(str, radix) { | 
|             var string = trim(str); | 
|             var defaultedRadix = $Number(radix) || (hexRegex.test(string) ? 16 : 10); | 
|             return origParseInt(string, defaultedRadix); | 
|         }; | 
|     }(parseInt)); | 
| } | 
|   | 
| // https://es5.github.io/#x15.1.2.3 | 
| if (1 / parseFloat('-0') !== -Infinity) { | 
|     /* global parseFloat: true */ | 
|     parseFloat = (function (origParseFloat) { | 
|         return function parseFloat(string) { | 
|             var inputString = trim(string); | 
|             var result = origParseFloat(inputString); | 
|             return result === 0 && strSlice(inputString, 0, 1) === '-' ? -0 : result; | 
|         }; | 
|     }(parseFloat)); | 
| } | 
|   | 
| if (String(new RangeError('test')) !== 'RangeError: test') { | 
|     var errorToStringShim = function toString() { | 
|         if (typeof this === 'undefined' || this === null) { | 
|             throw new TypeError("can't convert " + this + ' to object'); | 
|         } | 
|         var name = this.name; | 
|         if (typeof name === 'undefined') { | 
|             name = 'Error'; | 
|         } else if (typeof name !== 'string') { | 
|             name = $String(name); | 
|         } | 
|         var msg = this.message; | 
|         if (typeof msg === 'undefined') { | 
|             msg = ''; | 
|         } else if (typeof msg !== 'string') { | 
|             msg = $String(msg); | 
|         } | 
|         if (!name) { | 
|             return msg; | 
|         } | 
|         if (!msg) { | 
|             return name; | 
|         } | 
|         return name + ': ' + msg; | 
|     }; | 
|     // can't use defineProperties here because of toString enumeration issue in IE <= 8 | 
|     Error.prototype.toString = errorToStringShim; | 
| } | 
|   | 
| if (supportsDescriptors) { | 
|     var ensureNonEnumerable = function (obj, prop) { | 
|         if (isEnum(obj, prop)) { | 
|             var desc = Object.getOwnPropertyDescriptor(obj, prop); | 
|             desc.enumerable = false; | 
|             Object.defineProperty(obj, prop, desc); | 
|         } | 
|     }; | 
|     ensureNonEnumerable(Error.prototype, 'message'); | 
|     if (Error.prototype.message !== '') { | 
|       Error.prototype.message = ''; | 
|     } | 
|     ensureNonEnumerable(Error.prototype, 'name'); | 
| } | 
|   | 
| if (String(/a/mig) !== '/a/gim') { | 
|     var regexToString = function toString() { | 
|         var str = '/' + this.source + '/'; | 
|         if (this.global) { | 
|             str += 'g'; | 
|         } | 
|         if (this.ignoreCase) { | 
|             str += 'i'; | 
|         } | 
|         if (this.multiline) { | 
|             str += 'm'; | 
|         } | 
|         return str; | 
|     }; | 
|     // can't use defineProperties here because of toString enumeration issue in IE <= 8 | 
|     RegExp.prototype.toString = regexToString; | 
| } | 
|   | 
| })); | 
|   | 
| /*! | 
|  * https://github.com/es-shims/es5-shim | 
|  * @license es5-shim Copyright 2009-2015 by contributors, MIT License | 
|  * see https://github.com/es-shims/es5-shim/blob/master/LICENSE | 
|  */ | 
|   | 
| // vim: ts=4 sts=4 sw=4 expandtab | 
|   | 
| // Add semicolon to prevent IIFE from being passed as argument to concatenated code. | 
| ; | 
|   | 
| // UMD (Universal Module Definition) | 
| // see https://github.com/umdjs/umd/blob/master/templates/returnExports.js | 
| (function (root, factory) { | 
|     'use strict'; | 
|   | 
|     /* global define, exports, module */ | 
|     if (typeof define === 'function' && define.amd) { | 
|         // AMD. Register as an anonymous module. | 
|         define(factory); | 
|     } else if (typeof exports === 'object') { | 
|         // Node. Does not work with strict CommonJS, but | 
|         // only CommonJS-like enviroments that support module.exports, | 
|         // like Node. | 
|         module.exports = factory(); | 
|     } else { | 
|         // Browser globals (root is window) | 
|         root.returnExports = factory(); | 
|   } | 
| }(this, function () { | 
|   | 
| var call = Function.call; | 
| var prototypeOfObject = Object.prototype; | 
| var owns = call.bind(prototypeOfObject.hasOwnProperty); | 
| var isEnumerable = call.bind(prototypeOfObject.propertyIsEnumerable); | 
| var toStr = call.bind(prototypeOfObject.toString); | 
|   | 
| // If JS engine supports accessors creating shortcuts. | 
| var defineGetter; | 
| var defineSetter; | 
| var lookupGetter; | 
| var lookupSetter; | 
| var supportsAccessors = owns(prototypeOfObject, '__defineGetter__'); | 
| if (supportsAccessors) { | 
|     /* eslint-disable no-underscore-dangle */ | 
|     defineGetter = call.bind(prototypeOfObject.__defineGetter__); | 
|     defineSetter = call.bind(prototypeOfObject.__defineSetter__); | 
|     lookupGetter = call.bind(prototypeOfObject.__lookupGetter__); | 
|     lookupSetter = call.bind(prototypeOfObject.__lookupSetter__); | 
|     /* eslint-enable no-underscore-dangle */ | 
| } | 
|   | 
| // ES5 15.2.3.2 | 
| // http://es5.github.com/#x15.2.3.2 | 
| if (!Object.getPrototypeOf) { | 
|     // https://github.com/es-shims/es5-shim/issues#issue/2 | 
|     // http://ejohn.org/blog/objectgetprototypeof/ | 
|     // recommended by fschaefer on github | 
|     // | 
|     // sure, and webreflection says ^_^ | 
|     // ... this will nerever possibly return null | 
|     // ... Opera Mini breaks here with infinite loops | 
|     Object.getPrototypeOf = function getPrototypeOf(object) { | 
|         /* eslint-disable no-proto */ | 
|         var proto = object.__proto__; | 
|         /* eslint-enable no-proto */ | 
|         if (proto || proto === null) { | 
|             return proto; | 
|         } else if (toStr(object.constructor) === '[object Function]') { | 
|             return object.constructor.prototype; | 
|         } else if (object instanceof Object) { | 
|           return prototypeOfObject; | 
|         } else { | 
|           // Correctly return null for Objects created with `Object.create(null)` | 
|           // (shammed or native) or `{ __proto__: null}`.  Also returns null for | 
|           // cross-realm objects on browsers that lack `__proto__` support (like | 
|           // IE <11), but that's the best we can do. | 
|           return null; | 
|         } | 
|     }; | 
| } | 
|   | 
| // ES5 15.2.3.3 | 
| // http://es5.github.com/#x15.2.3.3 | 
|   | 
| var doesGetOwnPropertyDescriptorWork = function doesGetOwnPropertyDescriptorWork(object) { | 
|     try { | 
|         object.sentinel = 0; | 
|         return Object.getOwnPropertyDescriptor(object, 'sentinel').value === 0; | 
|     } catch (exception) { | 
|         return false; | 
|     } | 
| }; | 
|   | 
| // check whether getOwnPropertyDescriptor works if it's given. Otherwise, shim partially. | 
| if (Object.defineProperty) { | 
|     var getOwnPropertyDescriptorWorksOnObject = doesGetOwnPropertyDescriptorWork({}); | 
|     var getOwnPropertyDescriptorWorksOnDom = typeof document === 'undefined' || | 
|     doesGetOwnPropertyDescriptorWork(document.createElement('div')); | 
|     if (!getOwnPropertyDescriptorWorksOnDom || !getOwnPropertyDescriptorWorksOnObject) { | 
|         var getOwnPropertyDescriptorFallback = Object.getOwnPropertyDescriptor; | 
|     } | 
| } | 
|   | 
| if (!Object.getOwnPropertyDescriptor || getOwnPropertyDescriptorFallback) { | 
|     var ERR_NON_OBJECT = 'Object.getOwnPropertyDescriptor called on a non-object: '; | 
|   | 
|     /* eslint-disable no-proto */ | 
|     Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) { | 
|         if ((typeof object !== 'object' && typeof object !== 'function') || object === null) { | 
|             throw new TypeError(ERR_NON_OBJECT + object); | 
|         } | 
|   | 
|         // make a valiant attempt to use the real getOwnPropertyDescriptor | 
|         // for I8's DOM elements. | 
|         if (getOwnPropertyDescriptorFallback) { | 
|             try { | 
|                 return getOwnPropertyDescriptorFallback.call(Object, object, property); | 
|             } catch (exception) { | 
|                 // try the shim if the real one doesn't work | 
|             } | 
|         } | 
|   | 
|         var descriptor; | 
|   | 
|         // If object does not owns property return undefined immediately. | 
|         if (!owns(object, property)) { | 
|             return descriptor; | 
|         } | 
|   | 
|         // If object has a property then it's for sure `configurable`, and | 
|         // probably `enumerable`. Detect enumerability though. | 
|         descriptor = { | 
|             enumerable: isEnumerable(object, property), | 
|             configurable: true | 
|         }; | 
|   | 
|         // If JS engine supports accessor properties then property may be a | 
|         // getter or setter. | 
|         if (supportsAccessors) { | 
|             // Unfortunately `__lookupGetter__` will return a getter even | 
|             // if object has own non getter property along with a same named | 
|             // inherited getter. To avoid misbehavior we temporary remove | 
|             // `__proto__` so that `__lookupGetter__` will return getter only | 
|             // if it's owned by an object. | 
|             var prototype = object.__proto__; | 
|             var notPrototypeOfObject = object !== prototypeOfObject; | 
|             // avoid recursion problem, breaking in Opera Mini when | 
|             // Object.getOwnPropertyDescriptor(Object.prototype, 'toString') | 
|             // or any other Object.prototype accessor | 
|             if (notPrototypeOfObject) { | 
|                 object.__proto__ = prototypeOfObject; | 
|             } | 
|   | 
|             var getter = lookupGetter(object, property); | 
|             var setter = lookupSetter(object, property); | 
|   | 
|             if (notPrototypeOfObject) { | 
|                 // Once we have getter and setter we can put values back. | 
|                 object.__proto__ = prototype; | 
|             } | 
|   | 
|             if (getter || setter) { | 
|                 if (getter) { | 
|                     descriptor.get = getter; | 
|                 } | 
|                 if (setter) { | 
|                     descriptor.set = setter; | 
|                 } | 
|                 // If it was accessor property we're done and return here | 
|                 // in order to avoid adding `value` to the descriptor. | 
|                 return descriptor; | 
|             } | 
|         } | 
|   | 
|         // If we got this far we know that object has an own property that is | 
|         // not an accessor so we set it as a value and return descriptor. | 
|         descriptor.value = object[property]; | 
|         descriptor.writable = true; | 
|         return descriptor; | 
|     }; | 
|     /* eslint-enable no-proto */ | 
| } | 
|   | 
| // ES5 15.2.3.4 | 
| // http://es5.github.com/#x15.2.3.4 | 
| if (!Object.getOwnPropertyNames) { | 
|     Object.getOwnPropertyNames = function getOwnPropertyNames(object) { | 
|         return Object.keys(object); | 
|     }; | 
| } | 
|   | 
| // ES5 15.2.3.5 | 
| // http://es5.github.com/#x15.2.3.5 | 
| if (!Object.create) { | 
|   | 
|     // Contributed by Brandon Benvie, October, 2012 | 
|     var createEmpty; | 
|     var supportsProto = !({ __proto__: null } instanceof Object); | 
|                         // the following produces false positives | 
|                         // in Opera Mini => not a reliable check | 
|                         // Object.prototype.__proto__ === null | 
|   | 
|     // Check for document.domain and active x support | 
|     // No need to use active x approach when document.domain is not set | 
|     // see https://github.com/es-shims/es5-shim/issues/150 | 
|     // variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 | 
|     /* global ActiveXObject */ | 
|     var shouldUseActiveX = function shouldUseActiveX() { | 
|         // return early if document.domain not set | 
|         if (!document.domain) { | 
|             return false; | 
|         } | 
|   | 
|         try { | 
|             return !!new ActiveXObject('htmlfile'); | 
|         } catch (exception) { | 
|             return false; | 
|         } | 
|     }; | 
|   | 
|     // This supports IE8 when document.domain is used | 
|     // see https://github.com/es-shims/es5-shim/issues/150 | 
|     // variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 | 
|     var getEmptyViaActiveX = function getEmptyViaActiveX() { | 
|         var empty; | 
|         var xDoc; | 
|   | 
|         xDoc = new ActiveXObject('htmlfile'); | 
|   | 
|         xDoc.write('<script><\/script>'); | 
|         xDoc.close(); | 
|   | 
|         empty = xDoc.parentWindow.Object.prototype; | 
|         xDoc = null; | 
|   | 
|         return empty; | 
|     }; | 
|   | 
|     // The original implementation using an iframe | 
|     // before the activex approach was added | 
|     // see https://github.com/es-shims/es5-shim/issues/150 | 
|     var getEmptyViaIFrame = function getEmptyViaIFrame() { | 
|         var iframe = document.createElement('iframe'); | 
|         var parent = document.body || document.documentElement; | 
|         var empty; | 
|   | 
|         iframe.style.display = 'none'; | 
|         parent.appendChild(iframe); | 
|         /* eslint-disable no-script-url */ | 
|         iframe.src = 'javascript:'; | 
|         /* eslint-enable no-script-url */ | 
|   | 
|         empty = iframe.contentWindow.Object.prototype; | 
|         parent.removeChild(iframe); | 
|         iframe = null; | 
|   | 
|         return empty; | 
|     }; | 
|   | 
|     /* global document */ | 
|     if (supportsProto || typeof document === 'undefined') { | 
|         createEmpty = function () { | 
|             return { __proto__: null }; | 
|         }; | 
|     } else { | 
|         // In old IE __proto__ can't be used to manually set `null`, nor does | 
|         // any other method exist to make an object that inherits from nothing, | 
|         // aside from Object.prototype itself. Instead, create a new global | 
|         // object and *steal* its Object.prototype and strip it bare. This is | 
|         // used as the prototype to create nullary objects. | 
|         createEmpty = function () { | 
|             // Determine which approach to use | 
|             // see https://github.com/es-shims/es5-shim/issues/150 | 
|             var empty = shouldUseActiveX() ? getEmptyViaActiveX() : getEmptyViaIFrame(); | 
|   | 
|             delete empty.constructor; | 
|             delete empty.hasOwnProperty; | 
|             delete empty.propertyIsEnumerable; | 
|             delete empty.isPrototypeOf; | 
|             delete empty.toLocaleString; | 
|             delete empty.toString; | 
|             delete empty.valueOf; | 
|   | 
|             var Empty = function Empty() {}; | 
|             Empty.prototype = empty; | 
|             // short-circuit future calls | 
|             createEmpty = function () { | 
|                 return new Empty(); | 
|             }; | 
|             return new Empty(); | 
|         }; | 
|     } | 
|   | 
|     Object.create = function create(prototype, properties) { | 
|   | 
|         var object; | 
|         var Type = function Type() {}; // An empty constructor. | 
|   | 
|         if (prototype === null) { | 
|             object = createEmpty(); | 
|         } else { | 
|             if (typeof prototype !== 'object' && typeof prototype !== 'function') { | 
|                 // In the native implementation `parent` can be `null` | 
|                 // OR *any* `instanceof Object`  (Object|Function|Array|RegExp|etc) | 
|                 // Use `typeof` tho, b/c in old IE, DOM elements are not `instanceof Object` | 
|                 // like they are in modern browsers. Using `Object.create` on DOM elements | 
|                 // is...err...probably inappropriate, but the native version allows for it. | 
|                 throw new TypeError('Object prototype may only be an Object or null'); // same msg as Chrome | 
|             } | 
|             Type.prototype = prototype; | 
|             object = new Type(); | 
|             // IE has no built-in implementation of `Object.getPrototypeOf` | 
|             // neither `__proto__`, but this manually setting `__proto__` will | 
|             // guarantee that `Object.getPrototypeOf` will work as expected with | 
|             // objects created using `Object.create` | 
|             /* eslint-disable no-proto */ | 
|             object.__proto__ = prototype; | 
|             /* eslint-enable no-proto */ | 
|         } | 
|   | 
|         if (properties !== void 0) { | 
|             Object.defineProperties(object, properties); | 
|         } | 
|   | 
|         return object; | 
|     }; | 
| } | 
|   | 
| // ES5 15.2.3.6 | 
| // http://es5.github.com/#x15.2.3.6 | 
|   | 
| // Patch for WebKit and IE8 standard mode | 
| // Designed by hax <hax.github.com> | 
| // related issue: https://github.com/es-shims/es5-shim/issues#issue/5 | 
| // IE8 Reference: | 
| //     http://msdn.microsoft.com/en-us/library/dd282900.aspx | 
| //     http://msdn.microsoft.com/en-us/library/dd229916.aspx | 
| // WebKit Bugs: | 
| //     https://bugs.webkit.org/show_bug.cgi?id=36423 | 
|   | 
| var doesDefinePropertyWork = function doesDefinePropertyWork(object) { | 
|     try { | 
|         Object.defineProperty(object, 'sentinel', {}); | 
|         return 'sentinel' in object; | 
|     } catch (exception) { | 
|         return false; | 
|     } | 
| }; | 
|   | 
| // check whether defineProperty works if it's given. Otherwise, | 
| // shim partially. | 
| if (Object.defineProperty) { | 
|     var definePropertyWorksOnObject = doesDefinePropertyWork({}); | 
|     var definePropertyWorksOnDom = typeof document === 'undefined' || | 
|         doesDefinePropertyWork(document.createElement('div')); | 
|     if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) { | 
|         var definePropertyFallback = Object.defineProperty, | 
|             definePropertiesFallback = Object.defineProperties; | 
|     } | 
| } | 
|   | 
| if (!Object.defineProperty || definePropertyFallback) { | 
|     var ERR_NON_OBJECT_DESCRIPTOR = 'Property description must be an object: '; | 
|     var ERR_NON_OBJECT_TARGET = 'Object.defineProperty called on non-object: '; | 
|     var ERR_ACCESSORS_NOT_SUPPORTED = 'getters & setters can not be defined on this javascript engine'; | 
|   | 
|     Object.defineProperty = function defineProperty(object, property, descriptor) { | 
|         if ((typeof object !== 'object' && typeof object !== 'function') || object === null) { | 
|             throw new TypeError(ERR_NON_OBJECT_TARGET + object); | 
|         } | 
|         if ((typeof descriptor !== 'object' && typeof descriptor !== 'function') || descriptor === null) { | 
|             throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor); | 
|         } | 
|         // make a valiant attempt to use the real defineProperty | 
|         // for I8's DOM elements. | 
|         if (definePropertyFallback) { | 
|             try { | 
|                 return definePropertyFallback.call(Object, object, property, descriptor); | 
|             } catch (exception) { | 
|                 // try the shim if the real one doesn't work | 
|             } | 
|         } | 
|   | 
|         // If it's a data property. | 
|         if ('value' in descriptor) { | 
|             // fail silently if 'writable', 'enumerable', or 'configurable' | 
|             // are requested but not supported | 
|             /* | 
|             // alternate approach: | 
|             if ( // can't implement these features; allow false but not true | 
|                 ('writable' in descriptor && !descriptor.writable) || | 
|                 ('enumerable' in descriptor && !descriptor.enumerable) || | 
|                 ('configurable' in descriptor && !descriptor.configurable) | 
|             )) | 
|                 throw new RangeError( | 
|                     'This implementation of Object.defineProperty does not support configurable, enumerable, or writable.' | 
|                 ); | 
|             */ | 
|   | 
|             if (supportsAccessors && (lookupGetter(object, property) || lookupSetter(object, property))) { | 
|                 // As accessors are supported only on engines implementing | 
|                 // `__proto__` we can safely override `__proto__` while defining | 
|                 // a property to make sure that we don't hit an inherited | 
|                 // accessor. | 
|                 /* eslint-disable no-proto */ | 
|                 var prototype = object.__proto__; | 
|                 object.__proto__ = prototypeOfObject; | 
|                 // Deleting a property anyway since getter / setter may be | 
|                 // defined on object itself. | 
|                 delete object[property]; | 
|                 object[property] = descriptor.value; | 
|                 // Setting original `__proto__` back now. | 
|                 object.__proto__ = prototype; | 
|                 /* eslint-enable no-proto */ | 
|             } else { | 
|                 object[property] = descriptor.value; | 
|             } | 
|         } else { | 
|             if (!supportsAccessors && (('get' in descriptor) || ('set' in descriptor))) { | 
|                 throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED); | 
|             } | 
|             // If we got that far then getters and setters can be defined !! | 
|             if ('get' in descriptor) { | 
|                 defineGetter(object, property, descriptor.get); | 
|             } | 
|             if ('set' in descriptor) { | 
|                 defineSetter(object, property, descriptor.set); | 
|             } | 
|         } | 
|         return object; | 
|     }; | 
| } | 
|   | 
| // ES5 15.2.3.7 | 
| // http://es5.github.com/#x15.2.3.7 | 
| if (!Object.defineProperties || definePropertiesFallback) { | 
|     Object.defineProperties = function defineProperties(object, properties) { | 
|         // make a valiant attempt to use the real defineProperties | 
|         if (definePropertiesFallback) { | 
|             try { | 
|                 return definePropertiesFallback.call(Object, object, properties); | 
|             } catch (exception) { | 
|                 // try the shim if the real one doesn't work | 
|             } | 
|         } | 
|   | 
|         Object.keys(properties).forEach(function (property) { | 
|             if (property !== '__proto__') { | 
|                 Object.defineProperty(object, property, properties[property]); | 
|             } | 
|         }); | 
|         return object; | 
|     }; | 
| } | 
|   | 
| // ES5 15.2.3.8 | 
| // http://es5.github.com/#x15.2.3.8 | 
| if (!Object.seal) { | 
|     Object.seal = function seal(object) { | 
|         if (Object(object) !== object) { | 
|             throw new TypeError('Object.seal can only be called on Objects.'); | 
|         } | 
|         // this is misleading and breaks feature-detection, but | 
|         // allows "securable" code to "gracefully" degrade to working | 
|         // but insecure code. | 
|         return object; | 
|     }; | 
| } | 
|   | 
| // ES5 15.2.3.9 | 
| // http://es5.github.com/#x15.2.3.9 | 
| if (!Object.freeze) { | 
|     Object.freeze = function freeze(object) { | 
|         if (Object(object) !== object) { | 
|             throw new TypeError('Object.freeze can only be called on Objects.'); | 
|         } | 
|         // this is misleading and breaks feature-detection, but | 
|         // allows "securable" code to "gracefully" degrade to working | 
|         // but insecure code. | 
|         return object; | 
|     }; | 
| } | 
|   | 
| // detect a Rhino bug and patch it | 
| try { | 
|     Object.freeze(function () {}); | 
| } catch (exception) { | 
|     Object.freeze = (function (freezeObject) { | 
|         return function freeze(object) { | 
|             if (typeof object === 'function') { | 
|                 return object; | 
|             } else { | 
|                 return freezeObject(object); | 
|             } | 
|         }; | 
|     }(Object.freeze)); | 
| } | 
|   | 
| // ES5 15.2.3.10 | 
| // http://es5.github.com/#x15.2.3.10 | 
| if (!Object.preventExtensions) { | 
|     Object.preventExtensions = function preventExtensions(object) { | 
|         if (Object(object) !== object) { | 
|             throw new TypeError('Object.preventExtensions can only be called on Objects.'); | 
|         } | 
|         // this is misleading and breaks feature-detection, but | 
|         // allows "securable" code to "gracefully" degrade to working | 
|         // but insecure code. | 
|         return object; | 
|     }; | 
| } | 
|   | 
| // ES5 15.2.3.11 | 
| // http://es5.github.com/#x15.2.3.11 | 
| if (!Object.isSealed) { | 
|     Object.isSealed = function isSealed(object) { | 
|         if (Object(object) !== object) { | 
|             throw new TypeError('Object.isSealed can only be called on Objects.'); | 
|         } | 
|         return false; | 
|     }; | 
| } | 
|   | 
| // ES5 15.2.3.12 | 
| // http://es5.github.com/#x15.2.3.12 | 
| if (!Object.isFrozen) { | 
|     Object.isFrozen = function isFrozen(object) { | 
|         if (Object(object) !== object) { | 
|             throw new TypeError('Object.isFrozen can only be called on Objects.'); | 
|         } | 
|         return false; | 
|     }; | 
| } | 
|   | 
| // ES5 15.2.3.13 | 
| // http://es5.github.com/#x15.2.3.13 | 
| if (!Object.isExtensible) { | 
|     Object.isExtensible = function isExtensible(object) { | 
|         // 1. If Type(O) is not Object throw a TypeError exception. | 
|         if (Object(object) !== object) { | 
|             throw new TypeError('Object.isExtensible can only be called on Objects.'); | 
|         } | 
|         // 2. Return the Boolean value of the [[Extensible]] internal property of O. | 
|         var name = ''; | 
|         while (owns(object, name)) { | 
|             name += '?'; | 
|         } | 
|         object[name] = true; | 
|         var returnValue = owns(object, name); | 
|         delete object[name]; | 
|         return returnValue; | 
|     }; | 
| } | 
|   | 
| })); | 
|   | 
| // Console-polyfill. MIT license. | 
| // https://github.com/paulmillr/console-polyfill | 
| // Make it safe to do console.log() always. | 
| (function(global) { | 
|   'use strict'; | 
|   global.console = global.console || {}; | 
|   var con = global.console; | 
|   var prop, method; | 
|   var empty = {}; | 
|   var dummy = function() {}; | 
|   var properties = 'memory'.split(','); | 
|   var methods = ('assert,clear,count,debug,dir,dirxml,error,exception,group,' + | 
|   'groupCollapsed,groupEnd,info,log,markTimeline,profile,profiles,profileEnd,' + | 
|   'show,table,time,timeEnd,timeline,timelineEnd,timeStamp,trace,warn').split(','); | 
|   while (prop = properties.pop()) if (!con[prop]) con[prop] = empty; | 
|   while (method = methods.pop()) if (typeof con[method] !== 'function') con[method] = dummy; | 
|   // Using `this` for web workers & supports Browserify / Webpack. | 
| })(typeof window === 'undefined' ? this : window); | 
|   | 
| !window.addEventListener && (function (WindowPrototype, DocumentPrototype, ElementPrototype, addEventListener, removeEventListener, dispatchEvent, registry) { | 
|   WindowPrototype[addEventListener] = DocumentPrototype[addEventListener] = ElementPrototype[addEventListener] = function (type, listener) { | 
|     var target = this; | 
|   | 
|     registry.unshift([target, type, listener, function (event) { | 
|       event.currentTarget = target; | 
|       event.preventDefault = function () { event.returnValue = false }; | 
|       event.stopPropagation = function () { event.cancelBubble = true }; | 
|       event.target = event.srcElement || target; | 
|   | 
|       listener.call(target, event); | 
|     }]); | 
|   | 
|     this.attachEvent("on" + type, registry[0][3]); | 
|   }; | 
|   | 
|   WindowPrototype[removeEventListener] = DocumentPrototype[removeEventListener] = ElementPrototype[removeEventListener] = function (type, listener) { | 
|     for (var index = 0, register; register = registry[index]; ++index) { | 
|       if (register[0] == this && register[1] == type && register[2] == listener) { | 
|         return this.detachEvent("on" + type, registry.splice(index, 1)[0][3]); | 
|       } | 
|     } | 
|   }; | 
|   | 
|   WindowPrototype[dispatchEvent] = DocumentPrototype[dispatchEvent] = ElementPrototype[dispatchEvent] = function (eventObject) { | 
|     return this.fireEvent("on" + eventObject.type, eventObject); | 
|   }; | 
| })(Window.prototype, HTMLDocument.prototype, Element.prototype, "addEventListener", "removeEventListener", "dispatchEvent", []); | 
|   | 
| /** | 
|  * Module: rem - v1.3.4 | 
|  * Description: A polyfill to parse CSS links and rewrite pixel equivalents into head for non supporting browsers | 
|  * Date Built: 2014-07-02 | 
|  * Copyright (c) 2014  | Chuck Carpenter <chuck.carpenter@me.com>,Lucas Serven <lserven@gmail.com>; | 
|  * @see https://github.com/chuckcarpenter/REM-unit-polyfill | 
| **/ | 
|   | 
| (function (window, undefined) { | 
|   "use strict"; | 
|   // test for REM unit support | 
|   var cssremunit =  function() { | 
|       var div = document.createElement( 'div' ); | 
|       div.style.cssText = 'font-size: 1rem;'; | 
|   | 
|       return (/rem/).test(div.style.fontSize); | 
|     }, | 
|   | 
|   // filter returned links for stylesheets | 
|     isStyleSheet = function () { | 
|       var styles = document.getElementsByTagName('link'), | 
|         filteredLinks = []; | 
|   | 
|       for ( var i = 0; i < styles.length; i++) { | 
|         if ( styles[i].rel.toLowerCase() === 'stylesheet' && styles[i].getAttribute('data-norem') === null ) { | 
|   | 
|           filteredLinks.push( styles[i].href ); | 
|         } | 
|       } | 
|   | 
|       return filteredLinks; | 
|     }, | 
|   | 
|     processLinks = function () { | 
|       //prepare to match each link | 
|       for( var i = 0; i < links.length; i++ ){ | 
|         xhr( links[i], storeCSS ); | 
|       } | 
|     }, | 
|   | 
|     storeCSS = function ( response, link ) { | 
|   | 
|       preCSS.push(response.responseText); | 
|       CSSLinks.push(link); | 
|   | 
|       if( CSSLinks.length === links.length ){ | 
|         for( var j = 0; j <  CSSLinks.length; j++ ){ | 
|           matchCSS( preCSS[j], CSSLinks[j] ); | 
|         } | 
|   | 
|         if( ( links = importLinks.slice(0) ).length > 0 ){ //after finishing all current links, set links equal to the new imports found | 
|           CSSLinks = []; | 
|           preCSS = []; | 
|           importLinks = []; | 
|           processLinks(); | 
|         } else { | 
|           buildCSS(); | 
|         } | 
|       } | 
|     }, | 
|   | 
|     matchCSS = function ( sheetCSS, link ) { // collect all of the rules from the xhr response texts and match them to a pattern | 
|       var clean = removeMediaQueries( sheetCSS ).replace(/\/\*[\s\S]*?\*\//g, ''), // remove MediaQueries and comments | 
|         pattern = /[\w\d\s\-\/\\\[\]:,.'"*()<>+~%#^$_=|@]+\{[\w\d\s\-\/\\%#:!;,.'"*()]+\d*\.?\d+rem[\w\d\s\-\/\\%#:!;,.'"*()]*\}/g, //find selectors that use rem in one or more of their rules | 
|         current = clean.match(pattern), | 
|         remPattern =/\d*\.?\d+rem/g, | 
|         remCurrent = clean.match(remPattern), | 
|         sheetPathPattern = /(.*\/)/, | 
|         sheetPath = sheetPathPattern.exec(link)[0], //relative path to css file specified in @import | 
|         importPattern = /@import (?:url\()?['"]?([^'\)"]*)['"]?\)?[^;]*/gm, //matches all @import variations outlined at: https://developer.mozilla.org/en-US/docs/Web/CSS/@import | 
|         importStatement; | 
|   | 
|       while( (importStatement = importPattern.exec(sheetCSS)) !== null ){ | 
|         if( importStatement[1].indexOf("/") === 0 ) { // check if the value of importStatement[1] is a root relative path, in which case it shouldn't be concatenated with sheetPath | 
|           importLinks.push( importStatement[1] ); | 
|         } else { | 
|           importLinks.push( sheetPath + importStatement[1] ); | 
|         } | 
|       } | 
|   | 
|       if( current !== null && current.length !== 0 ){ | 
|         found = found.concat( current ); // save all of the blocks of rules with rem in a property | 
|         foundProps = foundProps.concat( remCurrent ); // save all of the properties with rem | 
|       } | 
|     }, | 
|   | 
|     buildCSS = function () { // first build each individual rule from elements in the found array and then add it to the string of rules. | 
|       var pattern = /[\w\d\s\-\/\\%#:,.'"*()]+\d*\.?\d+rem[\w\d\s\-\/\\%#:!,.'"*()]*[;}]/g; // find properties with rem values in them | 
|       for( var i = 0; i < found.length; i++ ){ | 
|         rules = rules + found[i].substr(0,found[i].indexOf("{")+1); // save the selector portion of each rule with a rem value | 
|         var current = found[i].match( pattern ); | 
|         for( var j = 0; j<current.length; j++ ){ // build a new set of with only the selector and properties that have rem in the value | 
|           rules = rules + current[j]; | 
|           if( j === current.length-1 && rules[rules.length-1] !== "}" ){ | 
|             rules = rules + "\n}"; | 
|           } | 
|         } | 
|       } | 
|   | 
|       parseCSS(); | 
|     }, | 
|   | 
|     parseCSS = function () { // replace each set of parentheses with evaluated content | 
|       for( var i = 0; i < foundProps.length; i++ ){ | 
|         css[i] = Math.round( parseFloat(foundProps[i].substr(0,foundProps[i].length-3)*fontSize) ) + 'px'; | 
|       } | 
|   | 
|       loadCSS(); | 
|     }, | 
|   | 
|     loadCSS = function () { // replace and load the new rules | 
|       for( var i = 0; i < css.length; i++ ){ // only run this loop as many times as css has entries | 
|         if( css[i] ){ | 
|           rules = rules.replace( foundProps[i],css[i] ); // replace old rules with our processed rules | 
|         } | 
|       } | 
|       var remcss = document.createElement( 'style' ); | 
|       remcss.setAttribute( 'type', 'text/css' ); | 
|       remcss.id = 'remReplace'; | 
|       document.getElementsByTagName( 'head' )[0].appendChild( remcss );   // create the new element | 
|       if( remcss.styleSheet ) { | 
|         remcss.styleSheet.cssText = rules; // IE8 will not support innerHTML on read-only elements, such as STYLE | 
|       } else { | 
|         remcss.appendChild( document.createTextNode( rules ) ); | 
|       } | 
|     }, | 
|   | 
|     xhr = function ( url, callback ) { // create new XMLHttpRequest object and run it | 
|       try { | 
|         //try to create a request object | 
|         //arranging the two conditions this way is for IE7/8's benefit | 
|         //so that it works with any combination of ActiveX or Native XHR settings, | 
|         //as long as one or the other is enabled; but if both are enabled | 
|         //it prefers ActiveX, which means it still works with local files | 
|         //(Native XHR in IE7/8 is blocked and throws "access is denied", | 
|         // but ActiveX is permitted if the user allows it [default is to prompt]) | 
|         var xhr = window.ActiveXObject ? ( new ActiveXObject('Microsoft.XMLHTTP') || new ActiveXObject('Msxml2.XMLHTTP') ) : new XMLHttpRequest(); | 
|   | 
|         xhr.open( 'GET', url, true ); | 
|         xhr.onreadystatechange = function() { | 
|           if ( xhr.readyState === 4 ){ | 
|             callback(xhr, url); | 
|           } // else { callback function on AJAX error } | 
|         }; | 
|   | 
|         xhr.send( null ); | 
|       } catch (e){ | 
|         if ( window.XDomainRequest ) { | 
|           var xdr = new XDomainRequest(); | 
|           xdr.open('get', url); | 
|           xdr.onload = function() { | 
|             callback(xdr, url); | 
|           }; | 
|           xdr.onerror = function() { | 
|             return false; // xdr load fail | 
|           }; | 
|           xdr.send(); | 
|         } | 
|       } | 
|     }, | 
|   | 
|   // Remove queries. | 
|     removeMediaQueries = function(css) { | 
|       // Test for Media Query support | 
|       if ( !window.matchMedia && !window.msMatchMedia ) { | 
|         // If the browser doesn't support media queries, we find all @media declarations in the CSS and remove them. | 
|         // Note: Since @rules can't be nested in the CSS spec, we're safe to just check for the closest following "}}" to the "@media". | 
|         css = css.replace(/@media[\s\S]*?\}\s*\}/g, ""); | 
|       } | 
|   | 
|       return css; | 
|     }; | 
|   | 
|   if( !cssremunit() ){ // this checks if the rem value is supported | 
|     var rules = '', // initialize the rules variable in this scope so it can be used later | 
|       links = isStyleSheet(), // initialize the array holding the sheets urls for use later | 
|       importLinks = [], //initialize the array holding the import sheet urls for use later | 
|       found = [], // initialize the array holding the found rules for use later | 
|       foundProps = [], // initialize the array holding the found properties for use later | 
|       preCSS = [], // initialize array that holds css before being parsed | 
|       CSSLinks = [], //initialize array holding css links returned from xhr | 
|       css = [], // initialize the array holding the parsed rules for use later | 
|       fontSize = ''; | 
|   | 
|     // Notice: rem is a "root em" that means that in case when html element size was changed by css | 
|     // or style we should not change document.documentElement.fontSize to 1em - only body size should be changed | 
|     // to 1em for calculation | 
|   | 
|     fontSize = (function () { | 
|       var doc = document, | 
|         docElement = doc.documentElement, | 
|         body = doc.body || doc.createElement('body'), | 
|         isFakeBody = !doc.body, | 
|         div = doc.createElement('div'), | 
|         currentSize = body.style.fontSize, | 
|         size; | 
|   | 
|       if ( isFakeBody ) { | 
|         docElement.appendChild( body ); | 
|       } | 
|   | 
|       div.style.cssText = 'width:1em; position:absolute; visibility:hidden; padding: 0;'; | 
|   | 
|       body.style.fontSize = '1em'; | 
|   | 
|       body.appendChild( div ); | 
|       size = div.offsetWidth; | 
|   | 
|       if ( isFakeBody ) { | 
|         docElement.removeChild( body ); | 
|       } | 
|       else { | 
|         body.removeChild( div ); | 
|         body.style.fontSize = currentSize; | 
|       } | 
|   | 
|       return size; | 
|     }()); | 
|   | 
|     processLinks(); | 
|   } // else { do nothing, you are awesome and have REM support } | 
|   | 
| })(window); | 
|   | 
| /*! Respond.js v1.4.2: min/max-width media query polyfill | 
|  * Copyright 2014 Scott Jehl | 
|  * Licensed under MIT | 
|  * http://j.mp/respondjs */ | 
|   | 
| !function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){v(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},g=function(a){return a.replace(c.regex.minmaxwh,"").match(c.regex.other)};if(c.ajax=f,c.queue=d,c.unsupportedmq=g,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,comments:/\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,maxw:/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,minmaxwh:/\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,other:/\([^\)]*\)/g},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var h,i,j,k=a.document,l=k.documentElement,m=[],n=[],o=[],p={},q=30,r=k.getElementsByTagName("head")[0]||l,s=k.getElementsByTagName("base")[0],t=r.getElementsByTagName("link"),u=function(){var a,b=k.createElement("div"),c=k.body,d=l.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=k.createElement("body"),c.style.background="none"),l.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&l.insertBefore(c,l.firstChild),a=b.offsetWidth,f?l.removeChild(c):c.removeChild(b),l.style.fontSize=d,e&&(c.style.fontSize=e),a=j=parseFloat(a)},v=function(b){var c="clientWidth",d=l[c],e="CSS1Compat"===k.compatMode&&d||k.body[c]||d,f={},g=t[t.length-1],p=(new Date).getTime();if(b&&h&&q>p-h)return a.clearTimeout(i),i=a.setTimeout(v,q),void 0;h=p;for(var s in m)if(m.hasOwnProperty(s)){var w=m[s],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?j||u():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?j||u():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(n[w.rules]))}for(var C in o)o.hasOwnProperty(C)&&o[C]&&o[C].parentNode===r&&r.removeChild(o[C]);o.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=k.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,r.insertBefore(E,g.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(k.createTextNode(F)),o.push(E)}},w=function(a,b,d){var e=a.replace(c.regex.comments,"").replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},i=!f&&d;b.length&&(b+="/"),i&&(f=1);for(var j=0;f>j;j++){var k,l,o,p;i?(k=d,n.push(h(a))):(k=e[j].match(c.regex.findStyles)&&RegExp.$1,n.push(RegExp.$2&&h(RegExp.$2))),o=k.split(","),p=o.length;for(var q=0;p>q;q++)l=o[q],g(l)||m.push({media:l.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:n.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}v()},x=function(){if(d.length){var b=d.shift();f(b.href,function(c){w(c,b.href,b.media),p[b.href]=!0,a.setTimeout(function(){x()},0)})}},y=function(){for(var b=0;b<t.length;b++){var c=t[b],e=c.href,f=c.media,g=c.rel&&"stylesheet"===c.rel.toLowerCase();e&&g&&!p[e]&&(c.styleSheet&&c.styleSheet.rawCssText?(w(c.styleSheet.rawCssText,e,f),p[e]=!0):(!/^([a-zA-Z:]*\/\/)/.test(e)&&!s||e.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&("//"===e.substring(0,2)&&(e=a.location.protocol+e),d.push({href:e,media:f})))}x()};y(),c.update=y,c.getEmValue=u,a.addEventListener?a.addEventListener("resize",b,!1):a.attachEvent&&a.attachEvent("onresize",b)}}(this); |