| var baseGetTag = require('./_baseGetTag'), | 
 |     getPrototype = require('./_getPrototype'), | 
 |     isObjectLike = require('./isObjectLike'); | 
 |  | 
 | /** `Object#toString` result references. */ | 
 | var objectTag = '[object Object]'; | 
 |  | 
 | /** Used for built-in method references. */ | 
 | var funcProto = Function.prototype, | 
 |     objectProto = Object.prototype; | 
 |  | 
 | /** Used to resolve the decompiled source of functions. */ | 
 | var funcToString = funcProto.toString; | 
 |  | 
 | /** Used to check objects for own properties. */ | 
 | var hasOwnProperty = objectProto.hasOwnProperty; | 
 |  | 
 | /** Used to infer the `Object` constructor. */ | 
 | var objectCtorString = funcToString.call(Object); | 
 |  | 
 | /** | 
 |  * Checks if `value` is a plain object, that is, an object created by the | 
 |  * `Object` constructor or one with a `[[Prototype]]` of `null`. | 
 |  * | 
 |  * @static | 
 |  * @memberOf _ | 
 |  * @since 0.8.0 | 
 |  * @category Lang | 
 |  * @param {*} value The value to check. | 
 |  * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. | 
 |  * @example | 
 |  * | 
 |  * function Foo() { | 
 |  *   this.a = 1; | 
 |  * } | 
 |  * | 
 |  * _.isPlainObject(new Foo); | 
 |  * // => false | 
 |  * | 
 |  * _.isPlainObject([1, 2, 3]); | 
 |  * // => false | 
 |  * | 
 |  * _.isPlainObject({ 'x': 0, 'y': 0 }); | 
 |  * // => true | 
 |  * | 
 |  * _.isPlainObject(Object.create(null)); | 
 |  * // => true | 
 |  */ | 
 | function isPlainObject(value) { | 
 |   if (!isObjectLike(value) || baseGetTag(value) != objectTag) { | 
 |     return false; | 
 |   } | 
 |   var proto = getPrototype(value); | 
 |   if (proto === null) { | 
 |     return true; | 
 |   } | 
 |   var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; | 
 |   return typeof Ctor == 'function' && Ctor instanceof Ctor && | 
 |     funcToString.call(Ctor) == objectCtorString; | 
 | } | 
 |  | 
 | module.exports = isPlainObject; |