|  | var Stack = require('./_Stack'), | 
						
						
							|  |     arrayEach = require('./_arrayEach'), | 
						
						
							|  |     assignValue = require('./_assignValue'), | 
						
						
							|  |     baseAssign = require('./_baseAssign'), | 
						
						
							|  |     baseAssignIn = require('./_baseAssignIn'), | 
						
						
							|  |     cloneBuffer = require('./_cloneBuffer'), | 
						
						
							|  |     copyArray = require('./_copyArray'), | 
						
						
							|  |     copySymbols = require('./_copySymbols'), | 
						
						
							|  |     copySymbolsIn = require('./_copySymbolsIn'), | 
						
						
							|  |     getAllKeys = require('./_getAllKeys'), | 
						
						
							|  |     getAllKeysIn = require('./_getAllKeysIn'), | 
						
						
							|  |     getTag = require('./_getTag'), | 
						
						
							|  |     initCloneArray = require('./_initCloneArray'), | 
						
						
							|  |     initCloneByTag = require('./_initCloneByTag'), | 
						
						
							|  |     initCloneObject = require('./_initCloneObject'), | 
						
						
							|  |     isArray = require('./isArray'), | 
						
						
							|  |     isBuffer = require('./isBuffer'), | 
						
						
							|  |     isMap = require('./isMap'), | 
						
						
							|  |     isObject = require('./isObject'), | 
						
						
							|  |     isSet = require('./isSet'), | 
						
						
							|  |     keys = require('./keys'), | 
						
						
							|  |     keysIn = require('./keysIn'); | 
						
						
							|  | 
 | 
						
						
							|  | /** Used to compose bitmasks for cloning. */ | 
						
						
							|  | var CLONE_DEEP_FLAG = 1, | 
						
						
							|  |     CLONE_FLAT_FLAG = 2, | 
						
						
							|  |     CLONE_SYMBOLS_FLAG = 4; | 
						
						
							|  | 
 | 
						
						
							|  | /** `Object#toString` result references. */ | 
						
						
							|  | var argsTag = '[object Arguments]', | 
						
						
							|  |     arrayTag = '[object Array]', | 
						
						
							|  |     boolTag = '[object Boolean]', | 
						
						
							|  |     dateTag = '[object Date]', | 
						
						
							|  |     errorTag = '[object Error]', | 
						
						
							|  |     funcTag = '[object Function]', | 
						
						
							|  |     genTag = '[object GeneratorFunction]', | 
						
						
							|  |     mapTag = '[object Map]', | 
						
						
							|  |     numberTag = '[object Number]', | 
						
						
							|  |     objectTag = '[object Object]', | 
						
						
							|  |     regexpTag = '[object RegExp]', | 
						
						
							|  |     setTag = '[object Set]', | 
						
						
							|  |     stringTag = '[object String]', | 
						
						
							|  |     symbolTag = '[object Symbol]', | 
						
						
							|  |     weakMapTag = '[object WeakMap]'; | 
						
						
							|  | 
 | 
						
						
							|  | var arrayBufferTag = '[object ArrayBuffer]', | 
						
						
							|  |     dataViewTag = '[object DataView]', | 
						
						
							|  |     float32Tag = '[object Float32Array]', | 
						
						
							|  |     float64Tag = '[object Float64Array]', | 
						
						
							|  |     int8Tag = '[object Int8Array]', | 
						
						
							|  |     int16Tag = '[object Int16Array]', | 
						
						
							|  |     int32Tag = '[object Int32Array]', | 
						
						
							|  |     uint8Tag = '[object Uint8Array]', | 
						
						
							|  |     uint8ClampedTag = '[object Uint8ClampedArray]', | 
						
						
							|  |     uint16Tag = '[object Uint16Array]', | 
						
						
							|  |     uint32Tag = '[object Uint32Array]'; | 
						
						
							|  | 
 | 
						
						
							|  | /** Used to identify `toStringTag` values supported by `_.clone`. */ | 
						
						
							|  | var cloneableTags = {}; | 
						
						
							|  | cloneableTags[argsTag] = cloneableTags[arrayTag] = | 
						
						
							|  | cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = | 
						
						
							|  | cloneableTags[boolTag] = cloneableTags[dateTag] = | 
						
						
							|  | cloneableTags[float32Tag] = cloneableTags[float64Tag] = | 
						
						
							|  | cloneableTags[int8Tag] = cloneableTags[int16Tag] = | 
						
						
							|  | cloneableTags[int32Tag] = cloneableTags[mapTag] = | 
						
						
							|  | cloneableTags[numberTag] = cloneableTags[objectTag] = | 
						
						
							|  | cloneableTags[regexpTag] = cloneableTags[setTag] = | 
						
						
							|  | cloneableTags[stringTag] = cloneableTags[symbolTag] = | 
						
						
							|  | cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = | 
						
						
							|  | cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; | 
						
						
							|  | cloneableTags[errorTag] = cloneableTags[funcTag] = | 
						
						
							|  | cloneableTags[weakMapTag] = false; | 
						
						
							|  | 
 | 
						
						
							|  | /** | 
						
						
							|  |  * The base implementation of `_.clone` and `_.cloneDeep` which tracks | 
						
						
							|  |  * traversed objects. | 
						
						
							|  |  * | 
						
						
							|  |  * @private | 
						
						
							|  |  * @param {*} value The value to clone. | 
						
						
							|  |  * @param {boolean} bitmask The bitmask flags. | 
						
						
							|  |  *  1 - Deep clone | 
						
						
							|  |  *  2 - Flatten inherited properties | 
						
						
							|  |  *  4 - Clone symbols | 
						
						
							|  |  * @param {Function} [customizer] The function to customize cloning. | 
						
						
							|  |  * @param {string} [key] The key of `value`. | 
						
						
							|  |  * @param {Object} [object] The parent object of `value`. | 
						
						
							|  |  * @param {Object} [stack] Tracks traversed objects and their clone counterparts. | 
						
						
							|  |  * @returns {*} Returns the cloned value. | 
						
						
							|  |  */ | 
						
						
							|  | function baseClone(value, bitmask, customizer, key, object, stack) { | 
						
						
							|  |   var result, | 
						
						
							|  |       isDeep = bitmask & CLONE_DEEP_FLAG, | 
						
						
							|  |       isFlat = bitmask & CLONE_FLAT_FLAG, | 
						
						
							|  |       isFull = bitmask & CLONE_SYMBOLS_FLAG; | 
						
						
							|  | 
 | 
						
						
							|  |   if (customizer) { | 
						
						
							|  |     result = object ? customizer(value, key, object, stack) : customizer(value); | 
						
						
							|  |   } | 
						
						
							|  |   if (result !== undefined) { | 
						
						
							|  |     return result; | 
						
						
							|  |   } | 
						
						
							|  |   if (!isObject(value)) { | 
						
						
							|  |     return value; | 
						
						
							|  |   } | 
						
						
							|  |   var isArr = isArray(value); | 
						
						
							|  |   if (isArr) { | 
						
						
							|  |     result = initCloneArray(value); | 
						
						
							|  |     if (!isDeep) { | 
						
						
							|  |       return copyArray(value, result); | 
						
						
							|  |     } | 
						
						
							|  |   } else { | 
						
						
							|  |     var tag = getTag(value), | 
						
						
							|  |         isFunc = tag == funcTag || tag == genTag; | 
						
						
							|  | 
 | 
						
						
							|  |     if (isBuffer(value)) { | 
						
						
							|  |       return cloneBuffer(value, isDeep); | 
						
						
							|  |     } | 
						
						
							|  |     if (tag == objectTag || tag == argsTag || (isFunc && !object)) { | 
						
						
							|  |       result = (isFlat || isFunc) ? {} : initCloneObject(value); | 
						
						
							|  |       if (!isDeep) { | 
						
						
							|  |         return isFlat | 
						
						
							|  |           ? copySymbolsIn(value, baseAssignIn(result, value)) | 
						
						
							|  |           : copySymbols(value, baseAssign(result, value)); | 
						
						
							|  |       } | 
						
						
							|  |     } else { | 
						
						
							|  |       if (!cloneableTags[tag]) { | 
						
						
							|  |         return object ? value : {}; | 
						
						
							|  |       } | 
						
						
							|  |       result = initCloneByTag(value, tag, isDeep); | 
						
						
							|  |     } | 
						
						
							|  |   } | 
						
						
							|  |   // Check for circular references and return its corresponding clone. | 
						
						
							|  |   stack || (stack = new Stack); | 
						
						
							|  |   var stacked = stack.get(value); | 
						
						
							|  |   if (stacked) { | 
						
						
							|  |     return stacked; | 
						
						
							|  |   } | 
						
						
							|  |   stack.set(value, result); | 
						
						
							|  | 
 | 
						
						
							|  |   if (isSet(value)) { | 
						
						
							|  |     value.forEach(function(subValue) { | 
						
						
							|  |       result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); | 
						
						
							|  |     }); | 
						
						
							|  |   } else if (isMap(value)) { | 
						
						
							|  |     value.forEach(function(subValue, key) { | 
						
						
							|  |       result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack)); | 
						
						
							|  |     }); | 
						
						
							|  |   } | 
						
						
							|  | 
 | 
						
						
							|  |   var keysFunc = isFull | 
						
						
							|  |     ? (isFlat ? getAllKeysIn : getAllKeys) | 
						
						
							|  |     : (isFlat ? keysIn : keys); | 
						
						
							|  | 
 | 
						
						
							|  |   var props = isArr ? undefined : keysFunc(value); | 
						
						
							|  |   arrayEach(props || value, function(subValue, key) { | 
						
						
							|  |     if (props) { | 
						
						
							|  |       key = subValue; | 
						
						
							|  |       subValue = value[key]; | 
						
						
							|  |     } | 
						
						
							|  |     // Recursively populate clone (susceptible to call stack limits). | 
						
						
							|  |     assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); | 
						
						
							|  |   }); | 
						
						
							|  |   return result; | 
						
						
							|  | } | 
						
						
							|  | 
 | 
						
						
							|  | module.exports = baseClone;
 |