{"version":3,"file":"/uxab/ui-core-analytics-bundle.map.jsdbx","sections":[{"offset":{"line":18,"column":0},"map":{"mappings":"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","file":"externals/@servicenow/ui-analytics-bundle/bundled-assets.min.js","names":["undefined","FUNC_ERROR_TEXT","HASH_UNDEFINED","PLACEHOLDER","WRAP_CURRY_RIGHT_FLAG","WRAP_PARTIAL_FLAG","WRAP_PARTIAL_RIGHT_FLAG","WRAP_ARY_FLAG","WRAP_REARG_FLAG","INFINITY","MAX_SAFE_INTEGER","NAN","MAX_ARRAY_LENGTH","wrapFlags","argsTag","arrayTag","boolTag","dateTag","errorTag","funcTag","genTag","mapTag","numberTag","objectTag","promiseTag","regexpTag","setTag","stringTag","symbolTag","weakMapTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEscapedHtml","reUnescapedHtml","reHasEscapedHtml","RegExp","source","reHasUnescapedHtml","reEscape","reEvaluate","reInterpolate","reIsDeepProp","reIsPlainProp","rePropName","reRegExpChar","reHasRegExpChar","reTrimStart","reWhitespace","reWrapComment","reWrapDetails","reSplitDetails","reAsciiWord","reForbiddenIdentifierChars","reEscapeChar","reEsTemplate","reFlags","reIsBadHex","reIsBinary","reIsHostCtor","reIsOctal","reIsUint","reLatin","reNoMatch","reUnescapedString","rsAstralRange","rsComboRange","rsComboMarksRange","rsDingbatRange","rsLowerRange","rsUpperRange","rsVarRange","rsBreakRange","rsMathOpRange","rsApos","rsAstral","rsBreak","rsCombo","rsDigits","rsDingbat","rsLower","rsMisc","rsFitz","rsNonAstral","rsRegional","rsSurrPair","rsUpper","rsZWJ","rsMiscLower","rsMiscUpper","rsOptContrLower","rsOptContrUpper","reOptMod","rsOptVar","rsSeq","join","rsEmoji","rsSymbol","reApos","reComboMark","reUnicode","reUnicodeWord","reHasUnicode","reHasUnicodeWord","contextProps","templateCounter","typedArrayTags","cloneableTags","stringEscapes","freeParseFloat","parseFloat","freeParseInt","parseInt","freeGlobal","global","Object","freeSelf","self","root","Function","freeExports","exports","nodeType","freeModule","module","moduleExports","freeProcess","process","nodeUtil","types","require","binding","e","nodeIsArrayBuffer","isArrayBuffer","nodeIsDate","isDate","nodeIsMap","isMap","nodeIsRegExp","isRegExp","nodeIsSet","isSet","nodeIsTypedArray","isTypedArray","apply","func","thisArg","args","length","call","arrayAggregator","array","setter","iteratee","accumulator","index","value","arrayEach","arrayEachRight","arrayEvery","predicate","arrayFilter","resIndex","result","arrayIncludes","baseIndexOf","arrayIncludesWith","comparator","arrayMap","Array","arrayPush","values","offset","arrayReduce","initAccum","arrayReduceRight","arraySome","asciiSize","baseProperty","baseFindKey","collection","eachFunc","key","baseFindIndex","fromIndex","fromRight","strictIndexOf","baseIsNaN","baseIndexOfWith","baseMean","baseSum","object","basePropertyOf","baseReduce","current","baseTimes","n","baseTrim","string","slice","trimmedEndIndex","replace","baseUnary","baseValues","props","cacheHas","cache","has","charsStartIndex","strSymbols","chrSymbols","charsEndIndex","deburrLetter","escapeHtmlChar","escapeStringChar","chr","hasUnicode","test","mapToArray","map","size","forEach","overArg","transform","arg","replaceHolders","placeholder","setToArray","set","setToPairs","stringSize","lastIndex","unicodeSize","stringToArray","match","unicodeToArray","split","asciiToArray","charAt","unescapeHtmlChar","_","runInContext","context","uid","defaults","pick","Date","Error","Math","String","TypeError","arrayProto","prototype","funcProto","objectProto","coreJsData","funcToString","toString","hasOwnProperty","idCounter","maskSrcKey","exec","keys","IE_PROTO","nativeObjectToString","objectCtorString","oldDash","reIsNative","Buffer","Symbol","Uint8Array","allocUnsafe","getPrototype","getPrototypeOf","objectCreate","create","propertyIsEnumerable","splice","spreadableSymbol","isConcatSpreadable","symIterator","iterator","symToStringTag","toStringTag","defineProperty","getNative","ctxClearTimeout","clearTimeout","ctxNow","now","ctxSetTimeout","setTimeout","nativeCeil","ceil","nativeFloor","floor","nativeGetSymbols","getOwnPropertySymbols","nativeIsBuffer","isBuffer","nativeIsFinite","isFinite","nativeJoin","nativeKeys","nativeMax","max","nativeMin","min","nativeNow","nativeParseInt","nativeRandom","random","nativeReverse","reverse","DataView","Map","Promise","Set","WeakMap","nativeCreate","metaMap","realNames","dataViewCtorString","toSource","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","symbolProto","symbolValueOf","valueOf","symbolToString","lodash","isObjectLike","isArray","LazyWrapper","LodashWrapper","wrapperClone","baseCreate","proto","isObject","baseLodash","chainAll","this","__wrapped__","__actions__","__chain__","__index__","__values__","__dir__","__filtered__","__iteratees__","__takeCount__","__views__","Hash","entries","clear","entry","ListCache","MapCache","SetCache","__data__","add","Stack","data","arrayLikeKeys","inherited","isArr","isArg","isArguments","isBuff","isType","skipIndexes","isIndex","push","arraySample","baseRandom","arraySampleSize","shuffleSelf","copyArray","baseClamp","arrayShuffle","assignMergeValue","eq","baseAssignValue","assignValue","objValue","assocIndexOf","baseAggregator","baseEach","baseAssign","copyObject","baseAt","paths","skip","get","number","lower","upper","baseClone","bitmask","customizer","stack","isDeep","isFlat","isFull","constructor","input","initCloneArray","tag","getTag","isFunc","cloneBuffer","initCloneObject","getSymbolsIn","copySymbolsIn","keysIn","baseAssignIn","getSymbols","copySymbols","Ctor","cloneArrayBuffer","dataView","buffer","byteOffset","byteLength","cloneDataView","cloneTypedArray","regexp","cloneRegExp","symbol","initCloneByTag","stacked","subValue","getAllKeysIn","getAllKeys","baseConformsTo","baseDelay","wait","baseDifference","includes","isCommon","valuesLength","outer","computed","valuesIndex","templateSettings","pop","getMapData","pairs","LARGE_ARRAY_SIZE","createBaseEach","baseForOwn","baseEachRight","baseForOwnRight","baseEvery","baseExtremum","isSymbol","baseFilter","baseFlatten","depth","isStrict","isFlattenable","baseFor","createBaseFor","baseForRight","baseFunctions","isFunction","baseGet","path","castPath","toKey","baseGetAllKeys","keysFunc","symbolsFunc","baseGetTag","isOwn","unmasked","getRawTag","objectToString","baseGt","other","baseHas","baseHasIn","baseIntersection","arrays","othLength","othIndex","caches","maxLength","Infinity","seen","baseInvoke","parent","last","baseIsArguments","baseIsEqual","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","equalArrays","name","message","convert","isPartial","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","objProps","objLength","othProps","objStacked","othStacked","skipCtor","othValue","compared","objCtor","othCtor","equalObjects","baseIsEqualDeep","baseIsMatch","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","baseIsNative","baseIteratee","identity","baseMatchesProperty","baseMatches","property","baseKeys","isPrototype","baseKeysIn","nativeKeysIn","isProto","baseLt","baseMap","isArrayLike","getMatchData","matchesStrictComparable","isKey","isStrictComparable","hasIn","baseMerge","srcIndex","mergeFunc","safeGet","newValue","isTyped","isArrayLikeObject","isPlainObject","toPlainObject","baseMergeDeep","baseNth","baseOrderBy","iteratees","orders","getIteratee","criteria","comparer","sort","baseSortBy","objCriteria","othCriteria","ordersLength","compareAscending","compareMultiple","basePickBy","baseSet","basePullAll","indexOf","basePullAt","indexes","previous","baseUnset","baseRepeat","baseRest","start","setToString","overRest","baseSample","baseSampleSize","nested","baseSetData","baseSetToString","constant","baseShuffle","baseSlice","end","baseSome","baseSortedIndex","retHighest","low","high","mid","baseSortedIndexBy","valIsNaN","valIsNull","valIsSymbol","valIsUndefined","othIsDefined","othIsNull","othIsReflexive","othIsSymbol","setLow","baseSortedUniq","baseToNumber","baseToString","baseUniq","createSet","seenIndex","baseUpdate","updater","baseWhile","isDrop","baseWrapperValue","actions","action","baseXor","baseZipObject","assignFunc","valsLength","castArrayLikeObject","castFunction","stringToPath","castRest","castSlice","id","copy","arrayBuffer","typedArray","valIsDefined","valIsReflexive","composeArgs","partials","holders","isCurried","argsIndex","argsLength","holdersLength","leftIndex","leftLength","rangeLength","isUncurried","composeArgsRight","holdersIndex","rightIndex","rightLength","isNew","createAggregator","initializer","createAssigner","assigner","sources","guard","isIterateeCall","iterable","createCaseFirst","methodName","trailing","createCompounder","callback","words","deburr","createCtor","arguments","thisBinding","createFind","findIndexFunc","createFlow","flatRest","funcs","prereq","thru","wrapper","getFuncName","funcName","getData","isLaziable","plant","createHybrid","partialsRight","holdersRight","argPos","ary","arity","isAry","isBind","isBindKey","isFlip","getHolder","holdersCount","countHolders","newHolders","createRecurry","fn","arrLength","oldArray","reorder","createInverter","toIteratee","baseInverter","createMathOperation","operator","defaultValue","createOver","arrayFunc","createPadding","chars","charsLength","createRange","step","toFinite","baseRange","createRelationalOperation","toNumber","wrapFunc","isCurry","newData","setData","setWrapToString","createRound","precision","toInteger","pair","noop","createToPairs","baseToPairs","createWrap","srcBitmask","newBitmask","isCombo","mergeData","createCurry","createPartial","createBind","customDefaultsAssignIn","customDefaultsMerge","customOmitClone","arrStacked","arrValue","flatten","otherFunc","type","getValue","stubArray","hasPath","hasFunc","isLength","ArrayBuffer","resolve","ctorString","isMaskable","stubFalse","otherArgs","shortOut","reference","details","insertWrapDetails","updateWrapDetails","getWrapDetails","count","lastCalled","stamp","remaining","rand","memoize","memoizeCapped","charCodeAt","quote","subString","clone","difference","differenceBy","differenceWith","findIndex","findLastIndex","head","intersection","mapped","intersectionBy","intersectionWith","pull","pullAll","pullAt","union","unionBy","unionWith","unzip","group","unzipWith","without","xor","xorBy","xorWith","zip","zipWith","chain","interceptor","wrapperAt","countBy","find","findLast","forEachRight","groupBy","invokeMap","keyBy","partition","sortBy","before","bind","bindKey","WRAP_BIND_FLAG","debounce","options","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","invokeFunc","time","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","leadingEdge","cancel","flush","defer","delay","resolver","memoized","Cache","negate","overArgs","transforms","funcsLength","partial","partialRight","rearg","gt","gte","isError","isInteger","isNumber","isString","lt","lte","toArray","next","done","iteratorToArray","remainder","toLength","isBinary","assign","assignIn","assignInWith","assignWith","at","propsIndex","propsLength","defaultsDeep","mergeWith","invert","invertBy","invoke","merge","omit","CLONE_DEEP_FLAG","basePick","pickBy","prop","toPairs","toPairsIn","camelCase","word","toLowerCase","capitalize","upperFirst","kebabCase","lowerCase","lowerFirst","snakeCase","startCase","upperCase","toUpperCase","pattern","hasUnicodeWord","unicodeWords","asciiWords","attempt","bindAll","methodNames","flow","flowRight","method","methodOf","mixin","over","overEvery","overSome","basePropertyDeep","range","rangeRight","augend","addend","divide","dividend","divisor","multiply","multiplier","multiplicand","round","subtract","minuend","subtrahend","after","castArray","chunk","compact","concat","cond","conforms","baseConforms","properties","curry","curryRight","drop","dropRight","dropRightWhile","dropWhile","fill","baseFill","filter","flatMap","flatMapDeep","flatMapDepth","flattenDeep","flattenDepth","flip","fromPairs","functions","functionsIn","initial","mapKeys","mapValues","matches","matchesProperty","nthArg","omitBy","once","orderBy","propertyOf","pullAllBy","pullAllWith","reject","remove","rest","sampleSize","setWith","shuffle","sortedUniq","sortedUniqBy","separator","limit","spread","tail","take","takeRight","takeRightWhile","takeWhile","tap","throttle","toPath","isArrLike","unary","uniq","uniqBy","uniqWith","unset","update","updateWith","valuesIn","wrap","zipObject","zipObjectDeep","entriesIn","extend","extendWith","clamp","cloneDeep","cloneDeepWith","cloneWith","conformsTo","defaultTo","endsWith","target","position","escape","escapeRegExp","every","findKey","findLastKey","forIn","forInRight","forOwn","forOwnRight","inRange","baseInRange","isBoolean","isElement","isEmpty","isEqual","isEqualWith","isMatch","isMatchWith","isNaN","isNative","isNil","isNull","isSafeInteger","isUndefined","isWeakMap","isWeakSet","lastIndexOf","strictLastIndexOf","maxBy","mean","meanBy","minBy","stubObject","stubString","stubTrue","nth","noConflict","pad","strLength","padEnd","padStart","radix","floating","temp","reduce","reduceRight","repeat","sample","some","sortedIndex","sortedIndexBy","sortedIndexOf","sortedLastIndex","sortedLastIndexBy","sortedLastIndexOf","startsWith","sum","sumBy","template","settings","isEscaping","isEvaluating","imports","importsKeys","importsValues","interpolate","reDelimiters","evaluate","sourceURL","escapeValue","interpolateValue","esTemplateValue","evaluateValue","variable","times","toLower","toSafeInteger","toUpper","trim","trimEnd","trimStart","truncate","omission","search","substring","newEnd","unescape","uniqueId","prefix","each","eachRight","first","VERSION","isFilter","takeName","dropName","checkIteratee","isTaker","lodashFunc","retUnwrapped","isLazy","useLazy","isHybrid","isUnwrapped","onlyLazy","chainName","dir","isRight","view","getView","iterLength","takeCount","iterIndex","commit","wrapped","toJSON","define","import","ReferenceError","__esModule","a","isNativeReflectConstruct","setPrototypeOf","t","r","Reflect","construct","o","p","toPropertyKey","_defineProperties","enumerable","configurable","writable","_extends","_getPrototypeOf","__proto__","_isNativeReflectConstruct","Boolean","_typeof","assertThisInitialized","_setPrototypeOf","toPrimitive","i","Number","isNativeFunction","_wrapNativeSuper","Wrapper","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","getter","d","definition","g","globalThis","window","obj","T","nmd","children","len","crypto","getRandomValues","IDX","HEX","to_hex","arr","output","trace_id_size","parent_id_size","W3C_TRACEPARENT_VERSION","SAMPLED_FLAG","traceparent","version","trace_id","parent_id","flags","child","sampled","make","total_size","config","debug","enableTrace","enableCounter","enableGauge","enableHistogram","enableInteractions","enableTrack","enableMousemoveInteractions","enableScrollInteractions","enableKeypressInteractions","enableClickInteractions","EXCEPTION_TYPE","EXCEPTION_MESSAGE","EXCEPTION_STACKTRACE","metaEl","from","document","getElementsByTagName","getAttribute","content","segs","parse","defaultTraceParent","createSpanId","createTraceId","createTraceParentHeader","spanId","traceId","user","attributes","page","location","href","origin","application","getItemMetadata","getApplication","getUser","getPage","SPAN_KIND","UNSPECIFIED","INTERNAL","SERVER","CLIENT","PRODUCER","CONSUMER","INVALID_TRACE_ID","INVALID_SPAN_ID","sanitizeAttributes","val","isValidAttributeKey","isValidAttributeValue","console","warn","isValidPrimitiveAttributeValue","getCurrentTime","performance","timeOrigin","createTracer","exporter","getConfigValue","links","parentSpan","events","kind","parentSpanId","_ended","status","documentTraceParent","startTime","endTime","duration","setStatus","addEvent","event","recordException","exception","code","setAttribute","createTracker","timestamp","createMetric","cb","isEnabled","applyAppUserAttributes","metric","createMetrics","metricCallback","createCounter","createGauge","createHistogram","observedScrollElements","globalKey","globalObj","flushed","notifyTraceSubscriber","_ref","observers","observer","createAnalyticsApi","apiConfig","k","setConfigValue","setPage","lastResize","windowWidth","innerWidth","windowHeight","innerHeight","pageWidth","documentElement","scrollWidth","pageHeight","scrollHeight","addEventListener","createEvent","clientX","clientY","pageX","pageY","screenX","screenY","tagName","scrollTop","el","lastScroll","lastMovement","initInteractionsTracker","trace","track","metrics","addObserver","delete","getQueuedEvents","queuedEvents","VALID_TRACE_ID_REGEX","VALID_SPAN_ID_REGEX","isValidTraceId","isValidSpanId","isSpanContextValid","spanContext","LogLevel","TrackingLevel","UXCollectionMode","isDefined","isNullOrUndefined","isNonEmptyString","isPositiveInteger","allowZero","setSelfPrototype","className","SNError","_Error","_this","_classCallCheck","_callSuper","_inherits","_createClass","SNTypeError","_SNError","_this2","HttpError","_SNError2","errorCode","_this3","uuidV4","c","Consts","inBrowser","getGuid","inBrowserWindow","baseServerUrl","url","instanceDomainName","IS_PRODUCTION","DEFAULT_CLIENT_ID","DEFAULT_LOG_LEVEL","error","DEFAULT_TRACKING_CONSENT","Disabled","MAX_METRIC_CALL_ATTEMPTS","SYSTEM_PROPERTY_PREFIX","LOGGER_PREFIX","removeFalsyEntries","fromEntries","tryGetEnumValue","keyOrValue","enumObj","ignoreCase","_mapKeyToValue$get","mapKeyToValue","mapValueToValue","_ref4","searchKeyOrValue","getValuesOrDefaults","defaultObj","validatorObj","_ref3","getValueOrDefault","validator","Logger","logMethods","handleLogLevel","channel","BroadcastChannel","onmessage","onBroadcastMessage","ev","logLevel","_this$channel","postMessage","notify","validLogLevel","level","methods","getTime","lastTime","getUniqueTime","DEFAULT_CONFIG_RESPONSE","ClientId","SessionId","MaxDataPointsPerHeartbeat","HeartbeatInterval","IdleTimeout","SessionTimeout","RecordMetadata","RequestId","AnalyticsChannelType","AnalyticsChannelNumber","InstanceName","ConfigReceivedTime","ConfigReloadTime","SessionIdCreatedTime","AppUserId","IgnorePerformanceData","IsGettingConfiguration","uxToken","g_ck","CONFIG_RESPONSE_VALIDATOR","isEnum","enumClass","ConfigurationProvider","store","apiKey","appUserIdProvider","configuration","buildConfiguration","resetSessionIfNeeded","observeConfigurationChange","_this$store$get","_this$store$get2","LastServerResponseTime","ApiKey","LastDatapointQueuedTime","isIdleSessionTimedOut","isSessionTimedOut","shouldForceReset","isInvalidSession","resetSession","isInvalidConfiguration","requestId","instanceConfigCompleted","updatedConfig","mandatoryKeys","newConfig","sessionId","deleteData","updatedQueuedTime","isInProgress","configResponse","mergedConfiguration","getValidConfigReloadTime","milliseconds","oneDayInMilliseconds","getStoreKey","JSON","DataPointField","isSystemPropertyKey","isValidProperty","allowLists","transformToPropertyValue","toLocaleString","timeZone","getValidProperties","allowNulls","validProperties","_value","logger","validArray","item","DataPointsProvider","configurationProvider","appContextProvider","queue","systemProperties","dataPoint","addSystemPropertyPrefix","_ref2","allProperties","isEmptyObject","prepareQueueToInsert","ctx","updateLastDatapointQueuedTime","sessionIdCreatedTime","appUserId","dataContext","trackingLevel","trackingConsent","configReceivedTime","appContext","sid","rid","sidt","auid","trackinglevel","lastSessionQueue","lastAppContextQueue","_queue$","_queue$2","_queue$4","_queue$3","shift","row","filteredData","channelType","channelNumber","_firstQueueItem$ctx$","_firstQueueItem$ctx$2","_firstQueueItem$ctx$3","firstQueueItem","appContextId","appContextName","dataPoints","NodeStorage","storage","randomId","randomNumber","ms","CREATE_BROWSER_ID_LOCK","Lock","expiry","localStorage","suffix","lockName","async","setLockHolder","outerLock","getLockHolderIdAndRemoveExpired","innerLock","acquireStartTime","tryGetLock","release","removeItem","lock","expiresAt","setItem","stringify","getItem","lockParsed","BrowserIdProvider","legacyStore","browserId","acquire","getLegacyBrowserId","TabIdProvider","tabId","Store","disableSerialization","testKey","serializeItem","deserializeItem","LocalStore","_Store","SessionStore","sessionStorage","memoryStorage","MemoryStorage","_Array$from$index","backup","info","MemoryStore","backupStore","loadBackup","registerBackupBeforeUnload","loadEntries","handler","getAllEntries","createBasicProvider","_store$get","DataContext","provider","legacyApiKey","localStore","legacyLocalStore","browserIdProvider","clientIdProvider","trackingConsentProvider","sessionStore","memoryStore","tabIdProvider","currentPageProvider","domainProvider","dataPointsProvider","validate","EventRecorder","Page","currentPage","Type","conversationId","ConversationId","newConsent","oldConsent","Value","PreviousValue","PageRecorder","description","_name","_dataContext$currentP","_dataContext$dataPoin","Description","UserRecorder","setProperty","setProperties","getAppUserIdOrNull","operationToProperty","operation","MAX_DURATION","fixDuration","roundedDuration","fixLength","trimmed","PerformanceTraceImpl","Duration","TraceType","traceEnded","send","removeProperty","PerformanceTraceRecorder","validateTrace","durationMS","_startTime","MetadataRecorder","eventRecorder","pageRecorder","userRecorder","performanceRecorder","Environment","height","width","screen","navigator","language","Intl","DateTimeFormat","resolvedOptions","getTimezoneOffset","universalFetch","timeout","response","requestTimeoutId","controller","AbortController","signal","fetchPromise","fetch","abort","axios","default","body","headers","withCredentials","responseBody","json","isResponseOk","ok","statusText","responseStatusCode","statusCode","rejectWithError","getHttpHeaders","transaction_source","getMetricAPIHttpHeaders","_dataContext$configur","_dataContext$configur2","snOriginHeader","Version","APIKey","BrowserId","getOrCreate","Appsysid","Instancename","Userid","postData","endpoint","mode","referrer","credentials","_dataContext$configur3","parsedStoredData","storedData","domain","appRegistrationMetadata","Browserid","ScreenHeight","getScreenDimension","ScreenWidth","DomainId","SystemLocale","getSystemLocale","ClientTimezone","getClientTimezone","ClientTimezoneOffset","TabId","Name","Channeltype","Tablename","tableName","decorateMethod","descriptor","getOwnPropertyDescriptor","newDescriptor","_len","decorators","_key","decorator","CatchAll","originalMethod","CatchAllAndReturn","_len2","_key2","badResponse","getUrl","getToken","cookies","token","cookie","SERVER_REQUEST_TIMEOUT","Networker","configData","isValidConfigResponse","getMergedConfigurationWithConfigResponse","fillWithJson","updateServerResponseTime","dataPointsResult","serverData","Cookie","Origin","DataPoints","ChannelType","ClientTime","toISOString","DomainName","AppContextId","AppContextName","AppSysId","analyticsGatewayAuthToken","MetricManager","configurationLifecycleManager","metricTimeoutId","metricErrorCounter","readyState","sendMetric","select","deleteByCount","startNewConfiguration","ConfigurationState","ConfigurationLifecycleManager","isGettingCurrSessionConfig","metadataRecorder","isGettingConfiguration","reloadConfigurationIfNeeded","isUserChanged","Ended","Started","setIsGettingConfiguration","getConfiguration","updateInstanceConfigCallInProgress","gotConfiguration","deletePreSessionItems","assignPreSessionItems","setDebugLevel","clientId","setAppUserId","SessionLifecycleManager","deleteBySessionId","normalizeAppUserId","StartSession","startNewSessionIfNeeded","EnsureWired","isWired","Manager","sessionLifecycleManager","metricManager","isConfigCallInProgress","saveAppContext","parts","userId","deleteOtherSessions","saveDomain","setTrackingConsent","wire","unwire","addChat","validateSdkReady","incProperty","appendToProperty","Full","configCurrentState","getCurrentState","Basic","Essential","addConsentChange","Created","deleteUserData","stopSession","sessionState","changedGlideSession","checkGlideSessionHasChanged","getIsGettingCurrSessionConfig","currentGCK","setKeys","startMetrics","stopMetrics","domainId","domainName","SNAnalytics","apiAuth","manager","startPage","addChatEvent","setUserId","setUserProperty","setUserProperties","removeUserProperty","incUserProperty","appendToUserProperty","startPerformanceTrace","addPerformanceTrace","getTrackingConsent","deleteCurrentUserData","enableExporter","exporterInterval","sumCounter","lastValueOnlyGauage","augmentPage","collecterUrl","enableCollection","legacyConfig","legacy","UXF_USER_NAV_LOAD_COMPLETE","EXPERIENCE_START","USER_NAVIGATE","EVENT_MAPPING","PARAMS_SEPARATOR","SUB_SEPARATOR","CLASSIC_URL_PARAMS","TRACKING_CONSENT","freeze","full","basic","disabled","missing","essential","ALLOWED_PERF_EVENTS","UXF_METADATA_EVENTS","ANALYTICS_SET_APPLICATION_OPTIONS","markReceived","sdk","_markReceived$attribu","_markReceived$attribu2","_markReceived$attribu3","__type__","isMobileBridgeAvailable","SNMobileAnalytics","isMobileBridgeEnabled","_config","getNativeConfig","MobileBridgeAdapter","eventName","startScreen","screenName","getConfig","isAvailable","unsubscribe","isRolesUpdated","higherOrderSDKWrapper","onEvent","experienceId","experienceName","__isLegacy__","eventTarget","appRegistrationMetadataStorage","getAppRegistrationMetadataFromSessionStorage","storeAppRegistrationMetadataInSessionStorage","legacyConfigData","uxMetricsConfig","_uxMetricsConfig$user","_uxMetricsConfig$user2","_uxMetricsConfig$user3","_uxMetricsConfig$user4","uxCollectionMode","sessionConfig","serverEndpoint","endpointURL","hashId","roles","prepareAndGetLegacyConfig","_legacyConfig$session","isWebChannelApplication","_legacyConfig$session2","rolesList","title","__operation__","log","applications","applyMetadata","startExporter","setInterval","SPECIAL_EVENTS","markTypes","setUser","setUserNext","setPageNext","setApplication","setApplicationNext","setApiConfigValue","setApiConfigValueNext","__webAnalytics__GLIDE_UX_METRICS","_payload$config","_payload$config2","payload","detail","eventProps","trackOptions","trackWithArguments","mask","getProcessedSelectedContentData","allParams","maskedUrl","urlParts","fieldsObject","fields","parentPrefix","checkSysId","urlFields","handleFields","params","paramsObject","paramsPrefix","urlParams","_params$k","paramValue","encodeUrlPart","encodeURIComponent","handleParams","_timestamp","allUrlParams","RECORD","isClassicUrl","selectedContent","route","isSeismicApp","getWorkspacePageName","table","parentRoute","pageName","getWorkspaceParamsAndUrl","metaUrl","workspaceParams","finalUrl","subParts","parentData","childData","getReconstructedUrlAndParams","getPageParamsAndUrl","meta","decodedUrl","decodeURIComponent","queryParams","truncateUrl","parameters","URLSearchParams","getClassicParamsAndUrl","getPageNameFromMeta","pageTitle","patternMatch","getClassicPageName","isValidType","propVal","isPrimitiveDataType","mark","remainingOptions","_objectWithoutPropertiesLoose","_excluded","otherProps","_excluded2","switched","isEntryPage","allowList","acc","propName","filterEventProps","allowedPropsInPageNavigate","transformEventProps","pageUrl","addLegacyEvent","legacySdk","marks","processMarks","applicationContextId","applicationContextName","startSession","totalUiTime","screenRoute","screenFields","screenParent","argumentKey","navigationType","_metric$properties","_options$meta","_options$meta2","getPageName","resolveLegacySdk","enableNewWebSdk","getProvider","UsageProvider","LegacyAppseeProvider","integrator","init","nowAnalytics","createTraceParent","USER_TOKEN","UCM_URL","tojson","consent","__TECTONIC__$servicenow_ui_analytics_api","servicenowUiAnalyticsApi","__TECTONIC__$servicenow_ui_analytics_consumer","servicenowUiAnalyticsConsumer","__TECTONIC__$servicenow_ui_analytics_core","servicenowUiAnalyticsCore","__TECTONIC__$servicenow_ui_analytics_integrator","servicenowUiAnalyticsIntegrator","__TECTONIC__$servicenow_ui_analytics_providers","servicenowUiAnalyticsProviders","__TECTONIC__$servicenow_ui_analytics_ucm","servicenowUiAnalyticsUcm"],"sources":["webpack:///lodash/4.17.21/lodash.js","webpack:///external import \"/uxasset/externals/@devsnc/library-appsee-web-sdk/4.1.2/index.jsdbx\"","webpack:///external import \"/uxasset/externals/axios/1.13.1/index.jsdbx\"","webpack:///@babel/runtime/7.25.7/helpers/assertThisInitialized.js","webpack:///@babel/runtime/7.25.7/helpers/classCallCheck.js","webpack:///@babel/runtime/7.25.7/helpers/construct.js","webpack:///@babel/runtime/7.25.7/helpers/createClass.js","webpack:///@babel/runtime/7.25.7/helpers/extends.js","webpack:///@babel/runtime/7.25.7/helpers/getPrototypeOf.js","webpack:///@babel/runtime/7.25.7/helpers/inherits.js","webpack:///@babel/runtime/7.25.7/helpers/isNativeFunction.js","webpack:///@babel/runtime/7.25.7/helpers/isNativeReflectConstruct.js","webpack:///@babel/runtime/7.25.7/helpers/objectWithoutPropertiesLoose.js","webpack:///@babel/runtime/7.25.7/helpers/possibleConstructorReturn.js","webpack:///@babel/runtime/7.25.7/helpers/setPrototypeOf.js","webpack:///@babel/runtime/7.25.7/helpers/toPrimitive.js","webpack:///@babel/runtime/7.25.7/helpers/toPropertyKey.js","webpack:///@babel/runtime/7.25.7/helpers/typeof.js","webpack:///@babel/runtime/7.25.7/helpers/wrapNativeSuper.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/node module decorator","webpack:///@servicenow/ui-analytics-core/src/tctx.js","webpack:///@servicenow/ui-analytics-core/src/config.js","webpack:///@servicenow/ui-analytics-core/src/attributes.js","webpack:///@servicenow/ui-analytics-core/src/traceparent.js","webpack:///@servicenow/ui-analytics-core/src/user.js","webpack:///@servicenow/ui-analytics-core/src/page.js","webpack:///@servicenow/ui-analytics-core/src/application.js","webpack:///@servicenow/ui-analytics-core/src/getItemMetadata.js","webpack:///@servicenow/ui-analytics-core/src/spanKind.js","webpack:///@servicenow/ui-analytics-core/src/constants.js","webpack:///@servicenow/ui-analytics-core/src/attributeValidator.js","webpack:///@servicenow/ui-analytics-core/src/createTracer.js","webpack:///@servicenow/ui-analytics-core/src/createTracker.js","webpack:///@servicenow/ui-analytics-core/src/createMetrics.js","webpack:///@servicenow/ui-analytics-core/src/initInteractionsTracker.js","webpack:///@servicenow/ui-analytics-core/src/observers.js","webpack:///@servicenow/ui-analytics-core/src/queuedEvents.js","webpack:///@servicenow/ui-analytics-core/src/exporter.js","webpack:///@servicenow/ui-analytics-core/src/createAnalyticsApi.js","webpack:///@servicenow/ui-analytics-core/src/addObserver.js","webpack:///@servicenow/ui-analytics-core/src/getQueuedEvents.js","webpack:///@servicenow/ui-analytics-core/src/traceUtils.js","webpack:///@servicenow/ui-analytics-api/src/index.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/types.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/validators.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/errors.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/utils/string-utils.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/consts.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/utils/object-utils.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/logger.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/utils/date-utils.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/model/providers/configuration-provider.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/model/entities/data-point.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/utils/array-utils.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/utils/property-utils.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/model/providers/data-points-provider.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/node-storage.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/lock.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/model/providers/browser-id-provider.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/model/providers/tab-id-provider.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/database/store.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/database/local-store.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/database/session-store.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/database/memory-store.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/model/providers/basic-provider.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/data-context.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/recorders/event-recorder.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/recorders/page-recorder.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/recorders/user-recorder.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/recorders/performance-recorder.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/recorders/metadata-recorder.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/environment.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/network/fetch.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/network/server-proxy.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/decorator/utils.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/decorator/common.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/network/networker.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/metric-manager.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/configuration-lifecycle-manager.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/session-lifecycle-manager.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/utils/user-utils.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/decorator/session.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/manager.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/index.js","webpack:///@servicenow/ui-analytics-providers/src/config.js","webpack:///@servicenow/ui-analytics-providers/src/legacy/events.js","webpack:///@servicenow/ui-analytics-providers/src/constants.js","webpack:///@servicenow/ui-analytics-providers/src/usage/addEvent.js","webpack:///@servicenow/ui-analytics-providers/src/usage/mobileBridgeAdapter.js","webpack:///@servicenow/ui-analytics-providers/src/usage/higherOrderSDKWrapper.js","webpack:///@servicenow/ui-analytics-providers/src/legacy/send.js","webpack:///@servicenow/ui-analytics-providers/src/startExporter.js","webpack:///@servicenow/ui-analytics-providers/src/usage/coreUIEventHandler.js","webpack:///@servicenow/ui-analytics-providers/src/usage/usageProvider.js","webpack:///@servicenow/ui-analytics-providers/src/legacy/selectContentParser.js","webpack:///@servicenow/ui-analytics-providers/src/legacy/getPageName.js","webpack:///@servicenow/ui-analytics-providers/src/legacy/utils.js","webpack:///@servicenow/ui-analytics-providers/src/legacy/ux-config.js","webpack:///@servicenow/ui-analytics-providers/src/legacy/transformMarks.js","webpack:///@servicenow/ui-analytics-providers/src/legacy/addLegacyEvent.js","webpack:///@servicenow/ui-analytics-providers/src/legacy/higherOrderSDKWrapper.js","webpack:///@servicenow/ui-analytics-providers/src/legacy/legacyAppseeProvider.js","webpack:///@servicenow/ui-analytics-providers/src/providerFactory.js","webpack:///@servicenow/ui-analytics-providers/src/index.js","webpack:///@servicenow/ui-analytics-integrator/src/index.js","webpack:///@servicenow/ui-analytics-ucm/src/constants.js","webpack:///@servicenow/ui-analytics-ucm/src/get.js","webpack:///@servicenow/ui-analytics-ucm/src/set.js","webpack:///@servicenow/ui-analytics-bundle/__imaginary__/mono-asset-entry-wrapper.js"],"sourcesContent":["/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '4.17.21';\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200;\n\n  /** Error message constants. */\n  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n      FUNC_ERROR_TEXT = 'Expected a function',\n      INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n  /** Used as the maximum memoize cache size. */\n  var MAX_MEMOIZE_SIZE = 500;\n\n  /** Used as the internal argument placeholder. */\n  var PLACEHOLDER = '__lodash_placeholder__';\n\n  /** Used to compose bitmasks for cloning. */\n  var CLONE_DEEP_FLAG = 1,\n      CLONE_FLAT_FLAG = 2,\n      CLONE_SYMBOLS_FLAG = 4;\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG = 1,\n      COMPARE_UNORDERED_FLAG = 2;\n\n  /** Used to compose bitmasks for function metadata. */\n  var WRAP_BIND_FLAG = 1,\n      WRAP_BIND_KEY_FLAG = 2,\n      WRAP_CURRY_BOUND_FLAG = 4,\n      WRAP_CURRY_FLAG = 8,\n      WRAP_CURRY_RIGHT_FLAG = 16,\n      WRAP_PARTIAL_FLAG = 32,\n      WRAP_PARTIAL_RIGHT_FLAG = 64,\n      WRAP_ARY_FLAG = 128,\n      WRAP_REARG_FLAG = 256,\n      WRAP_FLIP_FLAG = 512;\n\n  /** Used as default options for `_.truncate`. */\n  var DEFAULT_TRUNC_LENGTH = 30,\n      DEFAULT_TRUNC_OMISSION = '...';\n\n  /** Used to detect hot functions by number of calls within a span of milliseconds. */\n  var HOT_COUNT = 800,\n      HOT_SPAN = 16;\n\n  /** Used to indicate the type of lazy iteratees. */\n  var LAZY_FILTER_FLAG = 1,\n      LAZY_MAP_FLAG = 2,\n      LAZY_WHILE_FLAG = 3;\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY = 1 / 0,\n      MAX_SAFE_INTEGER = 9007199254740991,\n      MAX_INTEGER = 1.7976931348623157e+308,\n      NAN = 0 / 0;\n\n  /** Used as references for the maximum length and index of an array. */\n  var MAX_ARRAY_LENGTH = 4294967295,\n      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n  /** Used to associate wrap methods with their bit flags. */\n  var wrapFlags = [\n    ['ary', WRAP_ARY_FLAG],\n    ['bind', WRAP_BIND_FLAG],\n    ['bindKey', WRAP_BIND_KEY_FLAG],\n    ['curry', WRAP_CURRY_FLAG],\n    ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n    ['flip', WRAP_FLIP_FLAG],\n    ['partial', WRAP_PARTIAL_FLAG],\n    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n    ['rearg', WRAP_REARG_FLAG]\n  ];\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      asyncTag = '[object AsyncFunction]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      domExcTag = '[object DOMException]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      nullTag = '[object Null]',\n      objectTag = '[object Object]',\n      promiseTag = '[object Promise]',\n      proxyTag = '[object Proxy]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      symbolTag = '[object Symbol]',\n      undefinedTag = '[object Undefined]',\n      weakMapTag = '[object WeakMap]',\n      weakSetTag = '[object WeakSet]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      dataViewTag = '[object DataView]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /** Used to match empty string literals in compiled template source. */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /** Used to match HTML entities and HTML characters. */\n  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n      reUnescapedHtml = /[&<>\"']/g,\n      reHasEscapedHtml = RegExp(reEscapedHtml.source),\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to match template delimiters. */\n  var reEscape = /<%-([\\s\\S]+?)%>/g,\n      reEvaluate = /<%([\\s\\S]+?)%>/g,\n      reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match property names within property paths. */\n  var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n      reIsPlainProp = /^\\w*$/,\n      rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n      reHasRegExpChar = RegExp(reRegExpChar.source);\n\n  /** Used to match leading whitespace. */\n  var reTrimStart = /^\\s+/;\n\n  /** Used to match a single whitespace character. */\n  var reWhitespace = /\\s/;\n\n  /** Used to match wrap detail comments. */\n  var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n      reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n      reSplitDetails = /,? & /;\n\n  /** Used to match words composed of alphanumeric characters. */\n  var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n  /**\n   * Used to validate the `validate` option in `_.template` variable.\n   *\n   * Forbids characters which could potentially change the meaning of the function argument definition:\n   * - \"(),\" (modification of function parameters)\n   * - \"=\" (default value)\n   * - \"[]{}\" (destructuring of function parameters)\n   * - \"/\" (beginning of a comment)\n   * - whitespace\n   */\n  var reForbiddenIdentifierChars = /[()=,{}\\[\\]\\/\\s]/;\n\n  /** Used to match backslashes in property paths. */\n  var reEscapeChar = /\\\\(\\\\)?/g;\n\n  /**\n   * Used to match\n   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect bad signed hexadecimal string values. */\n  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n  /** Used to detect binary string values. */\n  var reIsBinary = /^0b[01]+$/i;\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect octal string values. */\n  var reIsOctal = /^0o[0-7]+$/i;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to match Latin Unicode letters (excluding mathematical operators). */\n  var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n  /** Used to ensure capturing order of template delimiters. */\n  var reNoMatch = /($^)/;\n\n  /** Used to match unescaped characters in compiled string literals. */\n  var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n  /** Used to compose unicode character classes. */\n  var rsAstralRange = '\\\\ud800-\\\\udfff',\n      rsComboMarksRange = '\\\\u0300-\\\\u036f',\n      reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n      rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n      rsDingbatRange = '\\\\u2700-\\\\u27bf',\n      rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n      rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n      rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n      rsPunctuationRange = '\\\\u2000-\\\\u206f',\n      rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n      rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n      rsVarRange = '\\\\ufe0e\\\\ufe0f',\n      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n  /** Used to compose unicode capture groups. */\n  var rsApos = \"['\\u2019]\",\n      rsAstral = '[' + rsAstralRange + ']',\n      rsBreak = '[' + rsBreakRange + ']',\n      rsCombo = '[' + rsComboRange + ']',\n      rsDigits = '\\\\d+',\n      rsDingbat = '[' + rsDingbatRange + ']',\n      rsLower = '[' + rsLowerRange + ']',\n      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n      rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n      rsNonAstral = '[^' + rsAstralRange + ']',\n      rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n      rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n      rsUpper = '[' + rsUpperRange + ']',\n      rsZWJ = '\\\\u200d';\n\n  /** Used to compose unicode regexes. */\n  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n      reOptMod = rsModifier + '?',\n      rsOptVar = '[' + rsVarRange + ']?',\n      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n      rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n      rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n      rsSeq = rsOptVar + reOptMod + rsOptJoin,\n      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n  /** Used to match apostrophes. */\n  var reApos = RegExp(rsApos, 'g');\n\n  /**\n   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n   */\n  var reComboMark = RegExp(rsCombo, 'g');\n\n  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n  /** Used to match complex or compound words. */\n  var reUnicodeWord = RegExp([\n    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n    rsUpper + '+' + rsOptContrUpper,\n    rsOrdUpper,\n    rsOrdLower,\n    rsDigits,\n    rsEmoji\n  ].join('|'), 'g');\n\n  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n  /** Used to detect strings that need a more robust regexp to match words. */\n  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n  /** Used to assign default `context` object properties. */\n  var contextProps = [\n    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify. */\n  var templateCounter = -1;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n  typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n  typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n  typedArrayTags[setTag] = typedArrayTags[stringTag] =\n  typedArrayTags[weakMapTag] = false;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n  cloneableTags[boolTag] = cloneableTags[dateTag] =\n  cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n  cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n  cloneableTags[int32Tag] = cloneableTags[mapTag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[setTag] =\n  cloneableTags[stringTag] = cloneableTags[symbolTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Used to map Latin Unicode letters to basic Latin letters. */\n  var deburredLetters = {\n    // Latin-1 Supplement block.\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n    '\\xc7': 'C',  '\\xe7': 'c',\n    '\\xd0': 'D',  '\\xf0': 'd',\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n    '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n    '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n    '\\xd1': 'N',  '\\xf1': 'n',\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n    '\\xc6': 'Ae', '\\xe6': 'ae',\n    '\\xde': 'Th', '\\xfe': 'th',\n    '\\xdf': 'ss',\n    // Latin Extended-A block.\n    '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\n    '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\n    '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n    '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n    '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n    '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n    '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n    '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n    '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n    '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n    '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n    '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n    '\\u0134': 'J',  '\\u0135': 'j',\n    '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\n    '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n    '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n    '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n    '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n    '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\n    '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\n    '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\n    '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\n    '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n    '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n    '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\n    '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\n    '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n    '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n    '\\u0174': 'W',  '\\u0175': 'w',\n    '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\n    '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\n    '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\n    '\\u0132': 'IJ', '\\u0133': 'ij',\n    '\\u0152': 'Oe', '\\u0153': 'oe',\n    '\\u0149': \"'n\", '\\u017f': 's'\n  };\n\n  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;'\n  };\n\n  /** Used to map HTML entities to characters. */\n  var htmlUnescapes = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\"\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals. */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Built-in method references without a dependency on `root`. */\n  var freeParseFloat = parseFloat,\n      freeParseInt = parseInt;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Detect free variable `exports`. */\n  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports;\n\n  /** Detect free variable `process` from Node.js. */\n  var freeProcess = moduleExports && freeGlobal.process;\n\n  /** Used to access faster Node.js helpers. */\n  var nodeUtil = (function() {\n    try {\n      // Use `util.types` for Node.js 10+.\n      var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n      if (types) {\n        return types;\n      }\n\n      // Legacy `process.binding('util')` for Node.js < 10.\n      return freeProcess && freeProcess.binding && freeProcess.binding('util');\n    } catch (e) {}\n  }());\n\n  /* Node.js helper references. */\n  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n      nodeIsDate = nodeUtil && nodeUtil.isDate,\n      nodeIsMap = nodeUtil && nodeUtil.isMap,\n      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n      nodeIsSet = nodeUtil && nodeUtil.isSet,\n      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * A faster alternative to `Function#apply`, this function invokes `func`\n   * with the `this` binding of `thisArg` and the arguments of `args`.\n   *\n   * @private\n   * @param {Function} func The function to invoke.\n   * @param {*} thisArg The `this` binding of `func`.\n   * @param {Array} args The arguments to invoke `func` with.\n   * @returns {*} Returns the result of `func`.\n   */\n  function apply(func, thisArg, args) {\n    switch (args.length) {\n      case 0: return func.call(thisArg);\n      case 1: return func.call(thisArg, args[0]);\n      case 2: return func.call(thisArg, args[0], args[1]);\n      case 3: return func.call(thisArg, args[0], args[1], args[2]);\n    }\n    return func.apply(thisArg, args);\n  }\n\n  /**\n   * A specialized version of `baseAggregator` for arrays.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} setter The function to set `accumulator` values.\n   * @param {Function} iteratee The iteratee to transform keys.\n   * @param {Object} accumulator The initial aggregated object.\n   * @returns {Function} Returns `accumulator`.\n   */\n  function arrayAggregator(array, setter, iteratee, accumulator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      var value = array[index];\n      setter(accumulator, value, iteratee(value), array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.forEach` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEach(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.forEachRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEachRight(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n\n    while (length--) {\n      if (iteratee(array[length], length, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.every` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`.\n   */\n  function arrayEvery(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (!predicate(array[index], index, array)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * A specialized version of `_.filter` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function arrayFilter(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (predicate(value, index, array)) {\n        result[resIndex++] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.includes` for arrays without support for\n   * specifying an index to search from.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludes(array, value) {\n    var length = array == null ? 0 : array.length;\n    return !!length && baseIndexOf(array, value, 0) > -1;\n  }\n\n  /**\n   * This function is like `arrayIncludes` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludesWith(array, value, comparator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (comparator(value, array[index])) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * A specialized version of `_.map` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   */\n  function arrayMap(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        result = Array(length);\n\n    while (++index < length) {\n      result[index] = iteratee(array[index], index, array);\n    }\n    return result;\n  }\n\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    var index = -1,\n        length = values.length,\n        offset = array.length;\n\n    while (++index < length) {\n      array[offset + index] = values[index];\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.reduce` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the first element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduce(array, iteratee, accumulator, initAccum) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    if (initAccum && length) {\n      accumulator = array[++index];\n    }\n    while (++index < length) {\n      accumulator = iteratee(accumulator, array[index], index, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.reduceRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the last element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n    var length = array == null ? 0 : array.length;\n    if (initAccum && length) {\n      accumulator = array[--length];\n    }\n    while (length--) {\n      accumulator = iteratee(accumulator, array[length], length, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.some` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function arraySome(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (predicate(array[index], index, array)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Gets the size of an ASCII `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  var asciiSize = baseProperty('length');\n\n  /**\n   * Converts an ASCII `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function asciiToArray(string) {\n    return string.split('');\n  }\n\n  /**\n   * Splits an ASCII `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function asciiWords(string) {\n    return string.match(reAsciiWord) || [];\n  }\n\n  /**\n   * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n   * without support for iteratee shorthands, which iterates over `collection`\n   * using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the found element or its key, else `undefined`.\n   */\n  function baseFindKey(collection, predicate, eachFunc) {\n    var result;\n    eachFunc(collection, function(value, key, collection) {\n      if (predicate(value, key, collection)) {\n        result = key;\n        return false;\n      }\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 1 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (predicate(array[index], index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    return value === value\n      ? strictIndexOf(array, value, fromIndex)\n      : baseFindIndex(array, baseIsNaN, fromIndex);\n  }\n\n  /**\n   * This function is like `baseIndexOf` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOfWith(array, value, fromIndex, comparator) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (comparator(array[index], value)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.isNaN` without support for number objects.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n   */\n  function baseIsNaN(value) {\n    return value !== value;\n  }\n\n  /**\n   * The base implementation of `_.mean` and `_.meanBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the mean.\n   */\n  function baseMean(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n    return length ? (baseSum(array, iteratee) / length) : NAN;\n  }\n\n  /**\n   * The base implementation of `_.property` without support for deep paths.\n   *\n   * @private\n   * @param {string} key The key of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function baseProperty(key) {\n    return function(object) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.propertyOf` without support for deep paths.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function basePropertyOf(object) {\n    return function(key) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.reduce` and `_.reduceRight`, without support\n   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} accumulator The initial value.\n   * @param {boolean} initAccum Specify using the first or last element of\n   *  `collection` as the initial value.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the accumulated value.\n   */\n  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n    eachFunc(collection, function(value, index, collection) {\n      accumulator = initAccum\n        ? (initAccum = false, value)\n        : iteratee(accumulator, value, index, collection);\n    });\n    return accumulator;\n  }\n\n  /**\n   * The base implementation of `_.sortBy` which uses `comparer` to define the\n   * sort order of `array` and replaces criteria objects with their corresponding\n   * values.\n   *\n   * @private\n   * @param {Array} array The array to sort.\n   * @param {Function} comparer The function to define sort order.\n   * @returns {Array} Returns `array`.\n   */\n  function baseSortBy(array, comparer) {\n    var length = array.length;\n\n    array.sort(comparer);\n    while (length--) {\n      array[length] = array[length].value;\n    }\n    return array;\n  }\n\n  /**\n   * The base implementation of `_.sum` and `_.sumBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the sum.\n   */\n  function baseSum(array, iteratee) {\n    var result,\n        index = -1,\n        length = array.length;\n\n    while (++index < length) {\n      var current = iteratee(array[index]);\n      if (current !== undefined) {\n        result = result === undefined ? current : (result + current);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n   * of key-value pairs for `object` corresponding to the property names of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the key-value pairs.\n   */\n  function baseToPairs(object, props) {\n    return arrayMap(props, function(key) {\n      return [key, object[key]];\n    });\n  }\n\n  /**\n   * The base implementation of `_.trim`.\n   *\n   * @private\n   * @param {string} string The string to trim.\n   * @returns {string} Returns the trimmed string.\n   */\n  function baseTrim(string) {\n    return string\n      ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n      : string;\n  }\n\n  /**\n   * The base implementation of `_.unary` without support for storing metadata.\n   *\n   * @private\n   * @param {Function} func The function to cap arguments for.\n   * @returns {Function} Returns the new capped function.\n   */\n  function baseUnary(func) {\n    return function(value) {\n      return func(value);\n    };\n  }\n\n  /**\n   * The base implementation of `_.values` and `_.valuesIn` which creates an\n   * array of `object` property values corresponding to the property names\n   * of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the array of property values.\n   */\n  function baseValues(object, props) {\n    return arrayMap(props, function(key) {\n      return object[key];\n    });\n  }\n\n  /**\n   * Checks if a `cache` value for `key` exists.\n   *\n   * @private\n   * @param {Object} cache The cache to query.\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function cacheHas(cache, key) {\n    return cache.has(key);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the first unmatched string symbol.\n   */\n  function charsStartIndex(strSymbols, chrSymbols) {\n    var index = -1,\n        length = strSymbols.length;\n\n    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the last unmatched string symbol.\n   */\n  function charsEndIndex(strSymbols, chrSymbols) {\n    var index = strSymbols.length;\n\n    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Gets the number of `placeholder` occurrences in `array`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} placeholder The placeholder to search for.\n   * @returns {number} Returns the placeholder count.\n   */\n  function countHolders(array, placeholder) {\n    var length = array.length,\n        result = 0;\n\n    while (length--) {\n      if (array[length] === placeholder) {\n        ++result;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n   * letters to basic Latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n  var deburrLetter = basePropertyOf(deburredLetters);\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n  /**\n   * Used by `_.template` to escape characters for inclusion in compiled string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(chr) {\n    return '\\\\' + stringEscapes[chr];\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key];\n  }\n\n  /**\n   * Checks if `string` contains Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n   */\n  function hasUnicode(string) {\n    return reHasUnicode.test(string);\n  }\n\n  /**\n   * Checks if `string` contains a word composed of Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a word is found, else `false`.\n   */\n  function hasUnicodeWord(string) {\n    return reHasUnicodeWord.test(string);\n  }\n\n  /**\n   * Converts `iterator` to an array.\n   *\n   * @private\n   * @param {Object} iterator The iterator to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function iteratorToArray(iterator) {\n    var data,\n        result = [];\n\n    while (!(data = iterator.next()).done) {\n      result.push(data.value);\n    }\n    return result;\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n        result = Array(map.size);\n\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n  function replaceHolders(array, placeholder) {\n    var index = -1,\n        length = array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (value === placeholder || value === PLACEHOLDER) {\n        array[index] = PLACEHOLDER;\n        result[resIndex++] = index;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n\n  /**\n   * Converts `set` to its value-value pairs.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the value-value pairs.\n   */\n  function setToPairs(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = [value, value];\n    });\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.indexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictIndexOf(array, value, fromIndex) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * A specialized version of `_.lastIndexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictLastIndexOf(array, value, fromIndex) {\n    var index = fromIndex + 1;\n    while (index--) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return index;\n  }\n\n  /**\n   * Gets the number of symbols in `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the string size.\n   */\n  function stringSize(string) {\n    return hasUnicode(string)\n      ? unicodeSize(string)\n      : asciiSize(string);\n  }\n\n  /**\n   * Converts `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function stringToArray(string) {\n    return hasUnicode(string)\n      ? unicodeToArray(string)\n      : asciiToArray(string);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n   * character of `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the index of the last non-whitespace character.\n   */\n  function trimmedEndIndex(string) {\n    var index = string.length;\n\n    while (index-- && reWhitespace.test(string.charAt(index))) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n  /**\n   * Gets the size of a Unicode `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  function unicodeSize(string) {\n    var result = reUnicode.lastIndex = 0;\n    while (reUnicode.test(string)) {\n      ++result;\n    }\n    return result;\n  }\n\n  /**\n   * Converts a Unicode `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function unicodeToArray(string) {\n    return string.match(reUnicode) || [];\n  }\n\n  /**\n   * Splits a Unicode `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function unicodeWords(string) {\n    return string.match(reUnicodeWord) || [];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new pristine `lodash` function using the `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.1.0\n   * @category Util\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'foo': _.constant('foo') });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'bar': lodash.constant('bar') });\n   *\n   * _.isFunction(_.foo);\n   * // => true\n   * _.isFunction(_.bar);\n   * // => false\n   *\n   * lodash.isFunction(lodash.foo);\n   * // => false\n   * lodash.isFunction(lodash.bar);\n   * // => true\n   *\n   * // Create a suped-up `defer` in Node.js.\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n  var runInContext = (function runInContext(context) {\n    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n    /** Built-in constructor references. */\n    var Array = context.Array,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /** Used for built-in method references. */\n    var arrayProto = Array.prototype,\n        funcProto = Function.prototype,\n        objectProto = Object.prototype;\n\n    /** Used to detect overreaching core-js shims. */\n    var coreJsData = context['__core-js_shared__'];\n\n    /** Used to resolve the decompiled source of functions. */\n    var funcToString = funcProto.toString;\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to generate unique IDs. */\n    var idCounter = 0;\n\n    /** Used to detect methods masquerading as native. */\n    var maskSrcKey = (function() {\n      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n      return uid ? ('Symbol(src)_1.' + uid) : '';\n    }());\n\n    /**\n     * Used to resolve the\n     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n     * of values.\n     */\n    var nativeObjectToString = objectProto.toString;\n\n    /** Used to infer the `Object` constructor. */\n    var objectCtorString = funcToString.call(Object);\n\n    /** Used to restore the original `_` reference in `_.noConflict`. */\n    var oldDash = root._;\n\n    /** Used to detect if a method is native. */\n    var reIsNative = RegExp('^' +\n      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n      .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n    );\n\n    /** Built-in value references. */\n    var Buffer = moduleExports ? context.Buffer : undefined,\n        Symbol = context.Symbol,\n        Uint8Array = context.Uint8Array,\n        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n        getPrototype = overArg(Object.getPrototypeOf, Object),\n        objectCreate = Object.create,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        splice = arrayProto.splice,\n        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n        symIterator = Symbol ? Symbol.iterator : undefined,\n        symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n    var defineProperty = (function() {\n      try {\n        var func = getNative(Object, 'defineProperty');\n        func({}, '', {});\n        return func;\n      } catch (e) {}\n    }());\n\n    /** Mocked built-ins. */\n    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n        ctxNow = Date && Date.now !== root.Date.now && Date.now,\n        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n    /* Built-in method references for those with the same name as other `lodash` methods. */\n    var nativeCeil = Math.ceil,\n        nativeFloor = Math.floor,\n        nativeGetSymbols = Object.getOwnPropertySymbols,\n        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n        nativeIsFinite = context.isFinite,\n        nativeJoin = arrayProto.join,\n        nativeKeys = overArg(Object.keys, Object),\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeNow = Date.now,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random,\n        nativeReverse = arrayProto.reverse;\n\n    /* Built-in method references that are verified to be native. */\n    var DataView = getNative(context, 'DataView'),\n        Map = getNative(context, 'Map'),\n        Promise = getNative(context, 'Promise'),\n        Set = getNative(context, 'Set'),\n        WeakMap = getNative(context, 'WeakMap'),\n        nativeCreate = getNative(Object, 'create');\n\n    /** Used to store function metadata. */\n    var metaMap = WeakMap && new WeakMap;\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /** Used to detect maps, sets, and weakmaps. */\n    var dataViewCtorString = toSource(DataView),\n        mapCtorString = toSource(Map),\n        promiseCtorString = toSource(Promise),\n        setCtorString = toSource(Set),\n        weakMapCtorString = toSource(WeakMap);\n\n    /** Used to convert symbols to primitives and strings. */\n    var symbolProto = Symbol ? Symbol.prototype : undefined,\n        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n        symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit method\n     * chain sequences. Methods that operate on and return arrays, collections,\n     * and functions can be chained together. Methods that retrieve a single value\n     * or may return a primitive value will automatically end the chain sequence\n     * and return the unwrapped value. Otherwise, the value must be unwrapped\n     * with `_#value`.\n     *\n     * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n     * enabled using `_.chain`.\n     *\n     * The execution of chained methods is lazy, that is, it's deferred until\n     * `_#value` is implicitly or explicitly called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion.\n     * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n     * the creation of intermediate arrays and can greatly reduce the number of\n     * iteratee executions. Sections of a chain sequence qualify for shortcut\n     * fusion if the section is applied to an array and iteratees accept only\n     * one argument. The heuristic for whether a section qualifies for shortcut\n     * fusion is subject to change.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n     * `zipObject`, `zipObjectDeep`, and `zipWith`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n     * `upperFirst`, `value`, and `words`\n     *\n     * @name _\n     * @constructor\n     * @category Seq\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // Returns an unwrapped value.\n     * wrapped.reduce(_.add);\n     * // => 6\n     *\n     * // Returns a wrapped value.\n     * var squares = wrapped.map(square);\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n        if (value instanceof LodashWrapper) {\n          return value;\n        }\n        if (hasOwnProperty.call(value, '__wrapped__')) {\n          return wrapperClone(value);\n        }\n      }\n      return new LodashWrapper(value);\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} proto The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    var baseCreate = (function() {\n      function object() {}\n      return function(proto) {\n        if (!isObject(proto)) {\n          return {};\n        }\n        if (objectCreate) {\n          return objectCreate(proto);\n        }\n        object.prototype = proto;\n        var result = new object;\n        object.prototype = undefined;\n        return result;\n      };\n    }());\n\n    /**\n     * The function whose prototype chain sequence wrappers inherit from.\n     *\n     * @private\n     */\n    function baseLodash() {\n      // No operation performed.\n    }\n\n    /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable explicit method chain sequences.\n     */\n    function LodashWrapper(value, chainAll) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__chain__ = !!chainAll;\n      this.__index__ = 0;\n      this.__values__ = undefined;\n    }\n\n    /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n     * following template settings to use alternative delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type {Object}\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'escape': reEscape,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'evaluate': reEvaluate,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type {string}\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type {Object}\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type {Function}\n         */\n        '_': lodash\n      }\n    };\n\n    // Ensure wrappers are instances of `baseLodash`.\n    lodash.prototype = baseLodash.prototype;\n    lodash.prototype.constructor = lodash;\n\n    LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n    LodashWrapper.prototype.constructor = LodashWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @constructor\n     * @param {*} value The value to wrap.\n     */\n    function LazyWrapper(value) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__dir__ = 1;\n      this.__filtered__ = false;\n      this.__iteratees__ = [];\n      this.__takeCount__ = MAX_ARRAY_LENGTH;\n      this.__views__ = [];\n    }\n\n    /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n    function lazyClone() {\n      var result = new LazyWrapper(this.__wrapped__);\n      result.__actions__ = copyArray(this.__actions__);\n      result.__dir__ = this.__dir__;\n      result.__filtered__ = this.__filtered__;\n      result.__iteratees__ = copyArray(this.__iteratees__);\n      result.__takeCount__ = this.__takeCount__;\n      result.__views__ = copyArray(this.__views__);\n      return result;\n    }\n\n    /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n    function lazyReverse() {\n      if (this.__filtered__) {\n        var result = new LazyWrapper(this);\n        result.__dir__ = -1;\n        result.__filtered__ = true;\n      } else {\n        result = this.clone();\n        result.__dir__ *= -1;\n      }\n      return result;\n    }\n\n    /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n    function lazyValue() {\n      var array = this.__wrapped__.value(),\n          dir = this.__dir__,\n          isArr = isArray(array),\n          isRight = dir < 0,\n          arrLength = isArr ? array.length : 0,\n          view = getView(0, arrLength, this.__views__),\n          start = view.start,\n          end = view.end,\n          length = end - start,\n          index = isRight ? end : (start - 1),\n          iteratees = this.__iteratees__,\n          iterLength = iteratees.length,\n          resIndex = 0,\n          takeCount = nativeMin(length, this.__takeCount__);\n\n      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n        return baseWrapperValue(array, this.__actions__);\n      }\n      var result = [];\n\n      outer:\n      while (length-- && resIndex < takeCount) {\n        index += dir;\n\n        var iterIndex = -1,\n            value = array[index];\n\n        while (++iterIndex < iterLength) {\n          var data = iteratees[iterIndex],\n              iteratee = data.iteratee,\n              type = data.type,\n              computed = iteratee(value);\n\n          if (type == LAZY_MAP_FLAG) {\n            value = computed;\n          } else if (!computed) {\n            if (type == LAZY_FILTER_FLAG) {\n              continue outer;\n            } else {\n              break outer;\n            }\n          }\n        }\n        result[resIndex++] = value;\n      }\n      return result;\n    }\n\n    // Ensure `LazyWrapper` is an instance of `baseLodash`.\n    LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n    LazyWrapper.prototype.constructor = LazyWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a hash object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Hash(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the hash.\n     *\n     * @private\n     * @name clear\n     * @memberOf Hash\n     */\n    function hashClear() {\n      this.__data__ = nativeCreate ? nativeCreate(null) : {};\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the hash.\n     *\n     * @private\n     * @name delete\n     * @memberOf Hash\n     * @param {Object} hash The hash to modify.\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function hashDelete(key) {\n      var result = this.has(key) && delete this.__data__[key];\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the hash value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Hash\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function hashGet(key) {\n      var data = this.__data__;\n      if (nativeCreate) {\n        var result = data[key];\n        return result === HASH_UNDEFINED ? undefined : result;\n      }\n      return hasOwnProperty.call(data, key) ? data[key] : undefined;\n    }\n\n    /**\n     * Checks if a hash value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Hash\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function hashHas(key) {\n      var data = this.__data__;\n      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n    }\n\n    /**\n     * Sets the hash `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Hash\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the hash instance.\n     */\n    function hashSet(key, value) {\n      var data = this.__data__;\n      this.size += this.has(key) ? 0 : 1;\n      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n      return this;\n    }\n\n    // Add methods to `Hash`.\n    Hash.prototype.clear = hashClear;\n    Hash.prototype['delete'] = hashDelete;\n    Hash.prototype.get = hashGet;\n    Hash.prototype.has = hashHas;\n    Hash.prototype.set = hashSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an list cache object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function ListCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the list cache.\n     *\n     * @private\n     * @name clear\n     * @memberOf ListCache\n     */\n    function listCacheClear() {\n      this.__data__ = [];\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the list cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf ListCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function listCacheDelete(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        return false;\n      }\n      var lastIndex = data.length - 1;\n      if (index == lastIndex) {\n        data.pop();\n      } else {\n        splice.call(data, index, 1);\n      }\n      --this.size;\n      return true;\n    }\n\n    /**\n     * Gets the list cache value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf ListCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function listCacheGet(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      return index < 0 ? undefined : data[index][1];\n    }\n\n    /**\n     * Checks if a list cache value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf ListCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function listCacheHas(key) {\n      return assocIndexOf(this.__data__, key) > -1;\n    }\n\n    /**\n     * Sets the list cache `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf ListCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the list cache instance.\n     */\n    function listCacheSet(key, value) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        ++this.size;\n        data.push([key, value]);\n      } else {\n        data[index][1] = value;\n      }\n      return this;\n    }\n\n    // Add methods to `ListCache`.\n    ListCache.prototype.clear = listCacheClear;\n    ListCache.prototype['delete'] = listCacheDelete;\n    ListCache.prototype.get = listCacheGet;\n    ListCache.prototype.has = listCacheHas;\n    ListCache.prototype.set = listCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a map cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function MapCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the map.\n     *\n     * @private\n     * @name clear\n     * @memberOf MapCache\n     */\n    function mapCacheClear() {\n      this.size = 0;\n      this.__data__ = {\n        'hash': new Hash,\n        'map': new (Map || ListCache),\n        'string': new Hash\n      };\n    }\n\n    /**\n     * Removes `key` and its value from the map.\n     *\n     * @private\n     * @name delete\n     * @memberOf MapCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function mapCacheDelete(key) {\n      var result = getMapData(this, key)['delete'](key);\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the map value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf MapCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function mapCacheGet(key) {\n      return getMapData(this, key).get(key);\n    }\n\n    /**\n     * Checks if a map value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf MapCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function mapCacheHas(key) {\n      return getMapData(this, key).has(key);\n    }\n\n    /**\n     * Sets the map `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf MapCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the map cache instance.\n     */\n    function mapCacheSet(key, value) {\n      var data = getMapData(this, key),\n          size = data.size;\n\n      data.set(key, value);\n      this.size += data.size == size ? 0 : 1;\n      return this;\n    }\n\n    // Add methods to `MapCache`.\n    MapCache.prototype.clear = mapCacheClear;\n    MapCache.prototype['delete'] = mapCacheDelete;\n    MapCache.prototype.get = mapCacheGet;\n    MapCache.prototype.has = mapCacheHas;\n    MapCache.prototype.set = mapCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates an array cache object to store unique values.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n      var index = -1,\n          length = values == null ? 0 : values.length;\n\n      this.__data__ = new MapCache;\n      while (++index < length) {\n        this.add(values[index]);\n      }\n    }\n\n    /**\n     * Adds `value` to the array cache.\n     *\n     * @private\n     * @name add\n     * @memberOf SetCache\n     * @alias push\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache instance.\n     */\n    function setCacheAdd(value) {\n      this.__data__.set(value, HASH_UNDEFINED);\n      return this;\n    }\n\n    /**\n     * Checks if `value` is in the array cache.\n     *\n     * @private\n     * @name has\n     * @memberOf SetCache\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `true` if `value` is found, else `false`.\n     */\n    function setCacheHas(value) {\n      return this.__data__.has(value);\n    }\n\n    // Add methods to `SetCache`.\n    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n    SetCache.prototype.has = setCacheHas;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a stack cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Stack(entries) {\n      var data = this.__data__ = new ListCache(entries);\n      this.size = data.size;\n    }\n\n    /**\n     * Removes all key-value entries from the stack.\n     *\n     * @private\n     * @name clear\n     * @memberOf Stack\n     */\n    function stackClear() {\n      this.__data__ = new ListCache;\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the stack.\n     *\n     * @private\n     * @name delete\n     * @memberOf Stack\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function stackDelete(key) {\n      var data = this.__data__,\n          result = data['delete'](key);\n\n      this.size = data.size;\n      return result;\n    }\n\n    /**\n     * Gets the stack value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Stack\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function stackGet(key) {\n      return this.__data__.get(key);\n    }\n\n    /**\n     * Checks if a stack value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Stack\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function stackHas(key) {\n      return this.__data__.has(key);\n    }\n\n    /**\n     * Sets the stack `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Stack\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the stack cache instance.\n     */\n    function stackSet(key, value) {\n      var data = this.__data__;\n      if (data instanceof ListCache) {\n        var pairs = data.__data__;\n        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n          pairs.push([key, value]);\n          this.size = ++data.size;\n          return this;\n        }\n        data = this.__data__ = new MapCache(pairs);\n      }\n      data.set(key, value);\n      this.size = data.size;\n      return this;\n    }\n\n    // Add methods to `Stack`.\n    Stack.prototype.clear = stackClear;\n    Stack.prototype['delete'] = stackDelete;\n    Stack.prototype.get = stackGet;\n    Stack.prototype.has = stackHas;\n    Stack.prototype.set = stackSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of the enumerable property names of the array-like `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @param {boolean} inherited Specify returning inherited property names.\n     * @returns {Array} Returns the array of property names.\n     */\n    function arrayLikeKeys(value, inherited) {\n      var isArr = isArray(value),\n          isArg = !isArr && isArguments(value),\n          isBuff = !isArr && !isArg && isBuffer(value),\n          isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n          skipIndexes = isArr || isArg || isBuff || isType,\n          result = skipIndexes ? baseTimes(value.length, String) : [],\n          length = result.length;\n\n      for (var key in value) {\n        if ((inherited || hasOwnProperty.call(value, key)) &&\n            !(skipIndexes && (\n               // Safari 9 has enumerable `arguments.length` in strict mode.\n               key == 'length' ||\n               // Node.js 0.10 has enumerable non-index properties on buffers.\n               (isBuff && (key == 'offset' || key == 'parent')) ||\n               // PhantomJS 2 has enumerable non-index properties on typed arrays.\n               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n               // Skip index properties.\n               isIndex(key, length)\n            ))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.sample` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @returns {*} Returns the random element.\n     */\n    function arraySample(array) {\n      var length = array.length;\n      return length ? array[baseRandom(0, length - 1)] : undefined;\n    }\n\n    /**\n     * A specialized version of `_.sampleSize` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function arraySampleSize(array, n) {\n      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * A specialized version of `_.shuffle` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function arrayShuffle(array) {\n      return shuffleSelf(copyArray(array));\n    }\n\n    /**\n     * This function is like `assignValue` except that it doesn't assign\n     * `undefined` values.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignMergeValue(object, key, value) {\n      if ((value !== undefined && !eq(object[key], value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Assigns `value` to `key` of `object` if the existing value is not equivalent\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignValue(object, key, value) {\n      var objValue = object[key];\n      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Gets the index at which the `key` is found in `array` of key-value pairs.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {*} key The key to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function assocIndexOf(array, key) {\n      var length = array.length;\n      while (length--) {\n        if (eq(array[length][0], key)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Aggregates elements of `collection` on `accumulator` with keys transformed\n     * by `iteratee` and values set by `setter`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform keys.\n     * @param {Object} accumulator The initial aggregated object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseAggregator(collection, setter, iteratee, accumulator) {\n      baseEach(collection, function(value, key, collection) {\n        setter(accumulator, value, iteratee(value), collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssign(object, source) {\n      return object && copyObject(source, keys(source), object);\n    }\n\n    /**\n     * The base implementation of `_.assignIn` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssignIn(object, source) {\n      return object && copyObject(source, keysIn(source), object);\n    }\n\n    /**\n     * The base implementation of `assignValue` and `assignMergeValue` without\n     * value checks.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function baseAssignValue(object, key, value) {\n      if (key == '__proto__' && defineProperty) {\n        defineProperty(object, key, {\n          'configurable': true,\n          'enumerable': true,\n          'value': value,\n          'writable': true\n        });\n      } else {\n        object[key] = value;\n      }\n    }\n\n    /**\n     * The base implementation of `_.at` without support for individual paths.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Array} Returns the picked elements.\n     */\n    function baseAt(object, paths) {\n      var index = -1,\n          length = paths.length,\n          result = Array(length),\n          skip = object == null;\n\n      while (++index < length) {\n        result[index] = skip ? undefined : get(object, paths[index]);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.clamp` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     */\n    function baseClamp(number, lower, upper) {\n      if (number === number) {\n        if (upper !== undefined) {\n          number = number <= upper ? number : upper;\n        }\n        if (lower !== undefined) {\n          number = number >= lower ? number : lower;\n        }\n      }\n      return number;\n    }\n\n    /**\n     * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n     * traversed objects.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Deep clone\n     *  2 - Flatten inherited properties\n     *  4 - Clone symbols\n     * @param {Function} [customizer] The function to customize cloning.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The parent object of `value`.\n     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, bitmask, customizer, key, object, stack) {\n      var result,\n          isDeep = bitmask & CLONE_DEEP_FLAG,\n          isFlat = bitmask & CLONE_FLAT_FLAG,\n          isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n      if (customizer) {\n        result = object ? customizer(value, key, object, stack) : customizer(value);\n      }\n      if (result !== undefined) {\n        return result;\n      }\n      if (!isObject(value)) {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isArr) {\n        result = initCloneArray(value);\n        if (!isDeep) {\n          return copyArray(value, result);\n        }\n      } else {\n        var tag = getTag(value),\n            isFunc = tag == funcTag || tag == genTag;\n\n        if (isBuffer(value)) {\n          return cloneBuffer(value, isDeep);\n        }\n        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n          result = (isFlat || isFunc) ? {} : initCloneObject(value);\n          if (!isDeep) {\n            return isFlat\n              ? copySymbolsIn(value, baseAssignIn(result, value))\n              : copySymbols(value, baseAssign(result, value));\n          }\n        } else {\n          if (!cloneableTags[tag]) {\n            return object ? value : {};\n          }\n          result = initCloneByTag(value, tag, isDeep);\n        }\n      }\n      // Check for circular references and return its corresponding clone.\n      stack || (stack = new Stack);\n      var stacked = stack.get(value);\n      if (stacked) {\n        return stacked;\n      }\n      stack.set(value, result);\n\n      if (isSet(value)) {\n        value.forEach(function(subValue) {\n          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n        });\n      } else if (isMap(value)) {\n        value.forEach(function(subValue, key) {\n          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n        });\n      }\n\n      var keysFunc = isFull\n        ? (isFlat ? getAllKeysIn : getAllKeys)\n        : (isFlat ? keysIn : keys);\n\n      var props = isArr ? undefined : keysFunc(value);\n      arrayEach(props || value, function(subValue, key) {\n        if (props) {\n          key = subValue;\n          subValue = value[key];\n        }\n        // Recursively populate clone (susceptible to call stack limits).\n        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.conforms` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseConforms(source) {\n      var props = keys(source);\n      return function(object) {\n        return baseConformsTo(object, source, props);\n      };\n    }\n\n    /**\n     * The base implementation of `_.conformsTo` which accepts `props` to check.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     */\n    function baseConformsTo(object, source, props) {\n      var length = props.length;\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (length--) {\n        var key = props[length],\n            predicate = source[key],\n            value = object[key];\n\n        if ((value === undefined && !(key in object)) || !predicate(value)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.delay` and `_.defer` which accepts `args`\n     * to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Array} args The arguments to provide to `func`.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    function baseDelay(func, wait, args) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * The base implementation of methods like `_.difference` without support\n     * for excluding multiple arrays or iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Array} values The values to exclude.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     */\n    function baseDifference(array, values, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          isCommon = true,\n          length = array.length,\n          result = [],\n          valuesLength = values.length;\n\n      if (!length) {\n        return result;\n      }\n      if (iteratee) {\n        values = arrayMap(values, baseUnary(iteratee));\n      }\n      if (comparator) {\n        includes = arrayIncludesWith;\n        isCommon = false;\n      }\n      else if (values.length >= LARGE_ARRAY_SIZE) {\n        includes = cacheHas;\n        isCommon = false;\n        values = new SetCache(values);\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee == null ? value : iteratee(value);\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var valuesIndex = valuesLength;\n          while (valuesIndex--) {\n            if (values[valuesIndex] === computed) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n        else if (!includes(values, computed, comparator)) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n    /**\n     * The base implementation of `_.every` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n    function baseEvery(collection, predicate) {\n      var result = true;\n      baseEach(collection, function(value, index, collection) {\n        result = !!predicate(value, index, collection);\n        return result;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of methods like `_.max` and `_.min` which accepts a\n     * `comparator` to determine the extremum value.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The iteratee invoked per iteration.\n     * @param {Function} comparator The comparator used to compare values.\n     * @returns {*} Returns the extremum value.\n     */\n    function baseExtremum(array, iteratee, comparator) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        var value = array[index],\n            current = iteratee(value);\n\n        if (current != null && (computed === undefined\n              ? (current === current && !isSymbol(current))\n              : comparator(current, computed)\n            )) {\n          var computed = current,\n              result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.fill` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     */\n    function baseFill(array, value, start, end) {\n      var length = array.length;\n\n      start = toInteger(start);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (end === undefined || end > length) ? length : toInteger(end);\n      if (end < 0) {\n        end += length;\n      }\n      end = start > end ? 0 : toLength(end);\n      while (start < end) {\n        array[start++] = value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.filter` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function baseFilter(collection, predicate) {\n      var result = [];\n      baseEach(collection, function(value, index, collection) {\n        if (predicate(value, index, collection)) {\n          result.push(value);\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` with support for restricting flattening.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {number} depth The maximum recursion depth.\n     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n     * @param {Array} [result=[]] The initial result value.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, depth, predicate, isStrict, result) {\n      var index = -1,\n          length = array.length;\n\n      predicate || (predicate = isFlattenable);\n      result || (result = []);\n\n      while (++index < length) {\n        var value = array[index];\n        if (depth > 0 && predicate(value)) {\n          if (depth > 1) {\n            // Recursively flatten arrays (susceptible to call stack limits).\n            baseFlatten(value, depth - 1, predicate, isStrict, result);\n          } else {\n            arrayPush(result, value);\n          }\n        } else if (!isStrict) {\n          result[result.length] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `baseForOwn` which iterates over `object`\n     * properties returned by `keysFunc` and invokes `iteratee` for each property.\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseFor = createBaseFor();\n\n    /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseForRight = createBaseFor(true);\n\n    /**\n     * The base implementation of `_.forOwn` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwn(object, iteratee) {\n      return object && baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwnRight(object, iteratee) {\n      return object && baseForRight(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from `props`.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the function names.\n     */\n    function baseFunctions(object, props) {\n      return arrayFilter(props, function(key) {\n        return isFunction(object[key]);\n      });\n    }\n\n    /**\n     * The base implementation of `_.get` without support for default values.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseGet(object, path) {\n      path = castPath(path, object);\n\n      var index = 0,\n          length = path.length;\n\n      while (object != null && index < length) {\n        object = object[toKey(path[index++])];\n      }\n      return (index && index == length) ? object : undefined;\n    }\n\n    /**\n     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n     * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @param {Function} symbolsFunc The function to get the symbols of `object`.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n      var result = keysFunc(object);\n      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n    }\n\n    /**\n     * The base implementation of `getTag` without fallbacks for buggy environments.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    function baseGetTag(value) {\n      if (value == null) {\n        return value === undefined ? undefinedTag : nullTag;\n      }\n      return (symToStringTag && symToStringTag in Object(value))\n        ? getRawTag(value)\n        : objectToString(value);\n    }\n\n    /**\n     * The base implementation of `_.gt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     */\n    function baseGt(value, other) {\n      return value > other;\n    }\n\n    /**\n     * The base implementation of `_.has` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHas(object, key) {\n      return object != null && hasOwnProperty.call(object, key);\n    }\n\n    /**\n     * The base implementation of `_.hasIn` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHasIn(object, key) {\n      return object != null && key in Object(object);\n    }\n\n    /**\n     * The base implementation of `_.inRange` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to check.\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     */\n    function baseInRange(number, start, end) {\n      return number >= nativeMin(start, end) && number < nativeMax(start, end);\n    }\n\n    /**\n     * The base implementation of methods like `_.intersection`, without support\n     * for iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of shared values.\n     */\n    function baseIntersection(arrays, iteratee, comparator) {\n      var includes = comparator ? arrayIncludesWith : arrayIncludes,\n          length = arrays[0].length,\n          othLength = arrays.length,\n          othIndex = othLength,\n          caches = Array(othLength),\n          maxLength = Infinity,\n          result = [];\n\n      while (othIndex--) {\n        var array = arrays[othIndex];\n        if (othIndex && iteratee) {\n          array = arrayMap(array, baseUnary(iteratee));\n        }\n        maxLength = nativeMin(array.length, maxLength);\n        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n          ? new SetCache(othIndex && array)\n          : undefined;\n      }\n      array = arrays[0];\n\n      var index = -1,\n          seen = caches[0];\n\n      outer:\n      while (++index < length && result.length < maxLength) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (!(seen\n              ? cacheHas(seen, computed)\n              : includes(result, computed, comparator)\n            )) {\n          othIndex = othLength;\n          while (--othIndex) {\n            var cache = caches[othIndex];\n            if (!(cache\n                  ? cacheHas(cache, computed)\n                  : includes(arrays[othIndex], computed, comparator))\n                ) {\n              continue outer;\n            }\n          }\n          if (seen) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.invert` and `_.invertBy` which inverts\n     * `object` with values transformed by `iteratee` and set by `setter`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform values.\n     * @param {Object} accumulator The initial inverted object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseInverter(object, setter, iteratee, accumulator) {\n      baseForOwn(object, function(value, key, object) {\n        setter(accumulator, iteratee(value), key, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.invoke` without support for individual\n     * method arguments.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {Array} args The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     */\n    function baseInvoke(object, path, args) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      var func = object == null ? object : object[toKey(last(path))];\n      return func == null ? undefined : apply(func, object, args);\n    }\n\n    /**\n     * The base implementation of `_.isArguments`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     */\n    function baseIsArguments(value) {\n      return isObjectLike(value) && baseGetTag(value) == argsTag;\n    }\n\n    /**\n     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     */\n    function baseIsArrayBuffer(value) {\n      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n    }\n\n    /**\n     * The base implementation of `_.isDate` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     */\n    function baseIsDate(value) {\n      return isObjectLike(value) && baseGetTag(value) == dateTag;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` which supports partial comparisons\n     * and tracks traversed objects.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Unordered comparison\n     *  2 - Partial comparison\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, bitmask, customizer, stack) {\n      if (value === other) {\n        return true;\n      }\n      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n        return value !== value && other !== other;\n      }\n      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n    }\n\n    /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n      var objIsArr = isArray(object),\n          othIsArr = isArray(other),\n          objTag = objIsArr ? arrayTag : getTag(object),\n          othTag = othIsArr ? arrayTag : getTag(other);\n\n      objTag = objTag == argsTag ? objectTag : objTag;\n      othTag = othTag == argsTag ? objectTag : othTag;\n\n      var objIsObj = objTag == objectTag,\n          othIsObj = othTag == objectTag,\n          isSameTag = objTag == othTag;\n\n      if (isSameTag && isBuffer(object)) {\n        if (!isBuffer(other)) {\n          return false;\n        }\n        objIsArr = true;\n        objIsObj = false;\n      }\n      if (isSameTag && !objIsObj) {\n        stack || (stack = new Stack);\n        return (objIsArr || isTypedArray(object))\n          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n      }\n      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n        if (objIsWrapped || othIsWrapped) {\n          var objUnwrapped = objIsWrapped ? object.value() : object,\n              othUnwrapped = othIsWrapped ? other.value() : other;\n\n          stack || (stack = new Stack);\n          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n        }\n      }\n      if (!isSameTag) {\n        return false;\n      }\n      stack || (stack = new Stack);\n      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n    }\n\n    /**\n     * The base implementation of `_.isMap` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     */\n    function baseIsMap(value) {\n      return isObjectLike(value) && getTag(value) == mapTag;\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Array} matchData The property names, values, and compare flags to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, source, matchData, customizer) {\n      var index = matchData.length,\n          length = index,\n          noCustomizer = !customizer;\n\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (index--) {\n        var data = matchData[index];\n        if ((noCustomizer && data[2])\n              ? data[1] !== object[data[0]]\n              : !(data[0] in object)\n            ) {\n          return false;\n        }\n      }\n      while (++index < length) {\n        data = matchData[index];\n        var key = data[0],\n            objValue = object[key],\n            srcValue = data[1];\n\n        if (noCustomizer && data[2]) {\n          if (objValue === undefined && !(key in object)) {\n            return false;\n          }\n        } else {\n          var stack = new Stack;\n          if (customizer) {\n            var result = customizer(objValue, srcValue, key, object, source, stack);\n          }\n          if (!(result === undefined\n                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n                : result\n              )) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.isNative` without bad shim checks.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     */\n    function baseIsNative(value) {\n      if (!isObject(value) || isMasked(value)) {\n        return false;\n      }\n      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n      return pattern.test(toSource(value));\n    }\n\n    /**\n     * The base implementation of `_.isRegExp` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     */\n    function baseIsRegExp(value) {\n      return isObjectLike(value) && baseGetTag(value) == regexpTag;\n    }\n\n    /**\n     * The base implementation of `_.isSet` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     */\n    function baseIsSet(value) {\n      return isObjectLike(value) && getTag(value) == setTag;\n    }\n\n    /**\n     * The base implementation of `_.isTypedArray` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     */\n    function baseIsTypedArray(value) {\n      return isObjectLike(value) &&\n        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n    }\n\n    /**\n     * The base implementation of `_.iteratee`.\n     *\n     * @private\n     * @param {*} [value=_.identity] The value to convert to an iteratee.\n     * @returns {Function} Returns the iteratee.\n     */\n    function baseIteratee(value) {\n      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n      if (typeof value == 'function') {\n        return value;\n      }\n      if (value == null) {\n        return identity;\n      }\n      if (typeof value == 'object') {\n        return isArray(value)\n          ? baseMatchesProperty(value[0], value[1])\n          : baseMatches(value);\n      }\n      return property(value);\n    }\n\n    /**\n     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeys(object) {\n      if (!isPrototype(object)) {\n        return nativeKeys(object);\n      }\n      var result = [];\n      for (var key in Object(object)) {\n        if (hasOwnProperty.call(object, key) && key != 'constructor') {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeysIn(object) {\n      if (!isObject(object)) {\n        return nativeKeysIn(object);\n      }\n      var isProto = isPrototype(object),\n          result = [];\n\n      for (var key in object) {\n        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.lt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     */\n    function baseLt(value, other) {\n      return value < other;\n    }\n\n    /**\n     * The base implementation of `_.map` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function baseMap(collection, iteratee) {\n      var index = -1,\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value, key, collection) {\n        result[++index] = iteratee(value, key, collection);\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.matches` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatches(source) {\n      var matchData = getMatchData(source);\n      if (matchData.length == 1 && matchData[0][2]) {\n        return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n      }\n      return function(object) {\n        return object === source || baseIsMatch(object, source, matchData);\n      };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n     *\n     * @private\n     * @param {string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatchesProperty(path, srcValue) {\n      if (isKey(path) && isStrictComparable(srcValue)) {\n        return matchesStrictComparable(toKey(path), srcValue);\n      }\n      return function(object) {\n        var objValue = get(object, path);\n        return (objValue === undefined && objValue === srcValue)\n          ? hasIn(object, path)\n          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n      };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for multiple sources.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} [customizer] The function to customize merged values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMerge(object, source, srcIndex, customizer, stack) {\n      if (object === source) {\n        return;\n      }\n      baseFor(source, function(srcValue, key) {\n        stack || (stack = new Stack);\n        if (isObject(srcValue)) {\n          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n        }\n        else {\n          var newValue = customizer\n            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n            : undefined;\n\n          if (newValue === undefined) {\n            newValue = srcValue;\n          }\n          assignMergeValue(object, key, newValue);\n        }\n      }, keysIn);\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n      var objValue = safeGet(object, key),\n          srcValue = safeGet(source, key),\n          stacked = stack.get(srcValue);\n\n      if (stacked) {\n        assignMergeValue(object, key, stacked);\n        return;\n      }\n      var newValue = customizer\n        ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      var isCommon = newValue === undefined;\n\n      if (isCommon) {\n        var isArr = isArray(srcValue),\n            isBuff = !isArr && isBuffer(srcValue),\n            isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n        newValue = srcValue;\n        if (isArr || isBuff || isTyped) {\n          if (isArray(objValue)) {\n            newValue = objValue;\n          }\n          else if (isArrayLikeObject(objValue)) {\n            newValue = copyArray(objValue);\n          }\n          else if (isBuff) {\n            isCommon = false;\n            newValue = cloneBuffer(srcValue, true);\n          }\n          else if (isTyped) {\n            isCommon = false;\n            newValue = cloneTypedArray(srcValue, true);\n          }\n          else {\n            newValue = [];\n          }\n        }\n        else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n          newValue = objValue;\n          if (isArguments(objValue)) {\n            newValue = toPlainObject(objValue);\n          }\n          else if (!isObject(objValue) || isFunction(objValue)) {\n            newValue = initCloneObject(srcValue);\n          }\n        }\n        else {\n          isCommon = false;\n        }\n      }\n      if (isCommon) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, newValue);\n        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n        stack['delete'](srcValue);\n      }\n      assignMergeValue(object, key, newValue);\n    }\n\n    /**\n     * The base implementation of `_.nth` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {number} n The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     */\n    function baseNth(array, n) {\n      var length = array.length;\n      if (!length) {\n        return;\n      }\n      n += n < 0 ? length : 0;\n      return isIndex(n, length) ? array[n] : undefined;\n    }\n\n    /**\n     * The base implementation of `_.orderBy` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n     * @param {string[]} orders The sort orders of `iteratees`.\n     * @returns {Array} Returns the new sorted array.\n     */\n    function baseOrderBy(collection, iteratees, orders) {\n      if (iteratees.length) {\n        iteratees = arrayMap(iteratees, function(iteratee) {\n          if (isArray(iteratee)) {\n            return function(value) {\n              return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n            }\n          }\n          return iteratee;\n        });\n      } else {\n        iteratees = [identity];\n      }\n\n      var index = -1;\n      iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n\n      var result = baseMap(collection, function(value, key, collection) {\n        var criteria = arrayMap(iteratees, function(iteratee) {\n          return iteratee(value);\n        });\n        return { 'criteria': criteria, 'index': ++index, 'value': value };\n      });\n\n      return baseSortBy(result, function(object, other) {\n        return compareMultiple(object, other, orders);\n      });\n    }\n\n    /**\n     * The base implementation of `_.pick` without support for individual\n     * property identifiers.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Object} Returns the new object.\n     */\n    function basePick(object, paths) {\n      return basePickBy(object, paths, function(value, path) {\n        return hasIn(object, path);\n      });\n    }\n\n    /**\n     * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @param {Function} predicate The function invoked per property.\n     * @returns {Object} Returns the new object.\n     */\n    function basePickBy(object, paths, predicate) {\n      var index = -1,\n          length = paths.length,\n          result = {};\n\n      while (++index < length) {\n        var path = paths[index],\n            value = baseGet(object, path);\n\n        if (predicate(value, path)) {\n          baseSet(result, castPath(path, object), value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseProperty` which supports deep paths.\n     *\n     * @private\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     */\n    function basePropertyDeep(path) {\n      return function(object) {\n        return baseGet(object, path);\n      };\n    }\n\n    /**\n     * The base implementation of `_.pullAllBy` without support for iteratee\n     * shorthands.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAll(array, values, iteratee, comparator) {\n      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n          index = -1,\n          length = values.length,\n          seen = array;\n\n      if (array === values) {\n        values = copyArray(values);\n      }\n      if (iteratee) {\n        seen = arrayMap(array, baseUnary(iteratee));\n      }\n      while (++index < length) {\n        var fromIndex = 0,\n            value = values[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n          if (seen !== array) {\n            splice.call(seen, fromIndex, 1);\n          }\n          splice.call(array, fromIndex, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.pullAt` without support for individual\n     * indexes or capturing the removed elements.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {number[]} indexes The indexes of elements to remove.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAt(array, indexes) {\n      var length = array ? indexes.length : 0,\n          lastIndex = length - 1;\n\n      while (length--) {\n        var index = indexes[length];\n        if (length == lastIndex || index !== previous) {\n          var previous = index;\n          if (isIndex(index)) {\n            splice.call(array, index, 1);\n          } else {\n            baseUnset(array, index);\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.random` without support for returning\n     * floating-point numbers.\n     *\n     * @private\n     * @param {number} lower The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the random number.\n     */\n    function baseRandom(lower, upper) {\n      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n    }\n\n    /**\n     * The base implementation of `_.range` and `_.rangeRight` which doesn't\n     * coerce arguments.\n     *\n     * @private\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} step The value to increment or decrement by.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the range of numbers.\n     */\n    function baseRange(start, end, step, fromRight) {\n      var index = -1,\n          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n          result = Array(length);\n\n      while (length--) {\n        result[fromRight ? length : ++index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.repeat` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {string} string The string to repeat.\n     * @param {number} n The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     */\n    function baseRepeat(string, n) {\n      var result = '';\n      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n        return result;\n      }\n      // Leverage the exponentiation by squaring algorithm for a faster repeat.\n      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n      do {\n        if (n % 2) {\n          result += string;\n        }\n        n = nativeFloor(n / 2);\n        if (n) {\n          string += string;\n        }\n      } while (n);\n\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     */\n    function baseRest(func, start) {\n      return setToString(overRest(func, start, identity), func + '');\n    }\n\n    /**\n     * The base implementation of `_.sample`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     */\n    function baseSample(collection) {\n      return arraySample(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.sampleSize` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function baseSampleSize(collection, n) {\n      var array = values(collection);\n      return shuffleSelf(array, baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * The base implementation of `_.set`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseSet(object, path, value, customizer) {\n      if (!isObject(object)) {\n        return object;\n      }\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          lastIndex = length - 1,\n          nested = object;\n\n      while (nested != null && ++index < length) {\n        var key = toKey(path[index]),\n            newValue = value;\n\n        if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n          return object;\n        }\n\n        if (index != lastIndex) {\n          var objValue = nested[key];\n          newValue = customizer ? customizer(objValue, key, nested) : undefined;\n          if (newValue === undefined) {\n            newValue = isObject(objValue)\n              ? objValue\n              : (isIndex(path[index + 1]) ? [] : {});\n          }\n        }\n        assignValue(nested, key, newValue);\n        nested = nested[key];\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `setData` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetData = !metaMap ? identity : function(func, data) {\n      metaMap.set(func, data);\n      return func;\n    };\n\n    /**\n     * The base implementation of `setToString` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetToString = !defineProperty ? identity : function(func, string) {\n      return defineProperty(func, 'toString', {\n        'configurable': true,\n        'enumerable': false,\n        'value': constant(string),\n        'writable': true\n      });\n    };\n\n    /**\n     * The base implementation of `_.shuffle`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function baseShuffle(collection) {\n      return shuffleSelf(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.slice` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseSlice(array, start, end) {\n      var index = -1,\n          length = array.length;\n\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = end > length ? length : end;\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : ((end - start) >>> 0);\n      start >>>= 0;\n\n      var result = Array(length);\n      while (++index < length) {\n        result[index] = array[index + start];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.some` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function baseSome(collection, predicate) {\n      var result;\n\n      baseEach(collection, function(value, index, collection) {\n        result = predicate(value, index, collection);\n        return !result;\n      });\n      return !!result;\n    }\n\n    /**\n     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n     * performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndex(array, value, retHighest) {\n      var low = 0,\n          high = array == null ? low : array.length;\n\n      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n        while (low < high) {\n          var mid = (low + high) >>> 1,\n              computed = array[mid];\n\n          if (computed !== null && !isSymbol(computed) &&\n              (retHighest ? (computed <= value) : (computed < value))) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return high;\n      }\n      return baseSortedIndexBy(array, value, identity, retHighest);\n    }\n\n    /**\n     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n     * which invokes `iteratee` for `value` and each element of `array` to compute\n     * their sort ranking. The iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The iteratee invoked per element.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndexBy(array, value, iteratee, retHighest) {\n      var low = 0,\n          high = array == null ? 0 : array.length;\n      if (high === 0) {\n        return 0;\n      }\n\n      value = iteratee(value);\n      var valIsNaN = value !== value,\n          valIsNull = value === null,\n          valIsSymbol = isSymbol(value),\n          valIsUndefined = value === undefined;\n\n      while (low < high) {\n        var mid = nativeFloor((low + high) / 2),\n            computed = iteratee(array[mid]),\n            othIsDefined = computed !== undefined,\n            othIsNull = computed === null,\n            othIsReflexive = computed === computed,\n            othIsSymbol = isSymbol(computed);\n\n        if (valIsNaN) {\n          var setLow = retHighest || othIsReflexive;\n        } else if (valIsUndefined) {\n          setLow = othIsReflexive && (retHighest || othIsDefined);\n        } else if (valIsNull) {\n          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n        } else if (valIsSymbol) {\n          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n        } else if (othIsNull || othIsSymbol) {\n          setLow = false;\n        } else {\n          setLow = retHighest ? (computed <= value) : (computed < value);\n        }\n        if (setLow) {\n          low = mid + 1;\n        } else {\n          high = mid;\n        }\n      }\n      return nativeMin(high, MAX_ARRAY_INDEX);\n    }\n\n    /**\n     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n     * support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseSortedUniq(array, iteratee) {\n      var index = -1,\n          length = array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        if (!index || !eq(computed, seen)) {\n          var seen = computed;\n          result[resIndex++] = value === 0 ? 0 : value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.toNumber` which doesn't ensure correct\n     * conversions of binary, hexadecimal, or octal string values.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     */\n    function baseToNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      return +value;\n    }\n\n    /**\n     * The base implementation of `_.toString` which doesn't convert nullish\n     * values to empty strings.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {string} Returns the string.\n     */\n    function baseToString(value) {\n      // Exit early for strings to avoid a performance hit in some environments.\n      if (typeof value == 'string') {\n        return value;\n      }\n      if (isArray(value)) {\n        // Recursively convert values (susceptible to call stack limits).\n        return arrayMap(value, baseToString) + '';\n      }\n      if (isSymbol(value)) {\n        return symbolToString ? symbolToString.call(value) : '';\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseUniq(array, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          length = array.length,\n          isCommon = true,\n          result = [],\n          seen = result;\n\n      if (comparator) {\n        isCommon = false;\n        includes = arrayIncludesWith;\n      }\n      else if (length >= LARGE_ARRAY_SIZE) {\n        var set = iteratee ? null : createSet(array);\n        if (set) {\n          return setToArray(set);\n        }\n        isCommon = false;\n        includes = cacheHas;\n        seen = new SetCache;\n      }\n      else {\n        seen = iteratee ? [] : result;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var seenIndex = seen.length;\n          while (seenIndex--) {\n            if (seen[seenIndex] === computed) {\n              continue outer;\n            }\n          }\n          if (iteratee) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n        else if (!includes(seen, computed, comparator)) {\n          if (seen !== result) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.unset`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The property path to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     */\n    function baseUnset(object, path) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      return object == null || delete object[toKey(last(path))];\n    }\n\n    /**\n     * The base implementation of `_.update`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to update.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseUpdate(object, path, updater, customizer) {\n      return baseSet(object, path, updater(baseGet(object, path)), customizer);\n    }\n\n    /**\n     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n     * without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseWhile(array, predicate, isDrop, fromRight) {\n      var length = array.length,\n          index = fromRight ? length : -1;\n\n      while ((fromRight ? index-- : ++index < length) &&\n        predicate(array[index], index, array)) {}\n\n      return isDrop\n        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n    }\n\n    /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to perform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseWrapperValue(value, actions) {\n      var result = value;\n      if (result instanceof LazyWrapper) {\n        result = result.value();\n      }\n      return arrayReduce(actions, function(result, action) {\n        return action.func.apply(action.thisArg, arrayPush([result], action.args));\n      }, result);\n    }\n\n    /**\n     * The base implementation of methods like `_.xor`, without support for\n     * iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of values.\n     */\n    function baseXor(arrays, iteratee, comparator) {\n      var length = arrays.length;\n      if (length < 2) {\n        return length ? baseUniq(arrays[0]) : [];\n      }\n      var index = -1,\n          result = Array(length);\n\n      while (++index < length) {\n        var array = arrays[index],\n            othIndex = -1;\n\n        while (++othIndex < length) {\n          if (othIndex != index) {\n            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n          }\n        }\n      }\n      return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n    }\n\n    /**\n     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n     *\n     * @private\n     * @param {Array} props The property identifiers.\n     * @param {Array} values The property values.\n     * @param {Function} assignFunc The function to assign values.\n     * @returns {Object} Returns the new object.\n     */\n    function baseZipObject(props, values, assignFunc) {\n      var index = -1,\n          length = props.length,\n          valsLength = values.length,\n          result = {};\n\n      while (++index < length) {\n        var value = index < valsLength ? values[index] : undefined;\n        assignFunc(result, props[index], value);\n      }\n      return result;\n    }\n\n    /**\n     * Casts `value` to an empty array if it's not an array like object.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Array|Object} Returns the cast array-like object.\n     */\n    function castArrayLikeObject(value) {\n      return isArrayLikeObject(value) ? value : [];\n    }\n\n    /**\n     * Casts `value` to `identity` if it's not a function.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Function} Returns cast function.\n     */\n    function castFunction(value) {\n      return typeof value == 'function' ? value : identity;\n    }\n\n    /**\n     * Casts `value` to a path array if it's not one.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {Array} Returns the cast property path array.\n     */\n    function castPath(value, object) {\n      if (isArray(value)) {\n        return value;\n      }\n      return isKey(value, object) ? [value] : stringToPath(toString(value));\n    }\n\n    /**\n     * A `baseRest` alias which can be replaced with `identity` by module\n     * replacement plugins.\n     *\n     * @private\n     * @type {Function}\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    var castRest = baseRest;\n\n    /**\n     * Casts `array` to a slice if it's needed.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {number} start The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the cast slice.\n     */\n    function castSlice(array, start, end) {\n      var length = array.length;\n      end = end === undefined ? length : end;\n      return (!start && end >= length) ? array : baseSlice(array, start, end);\n    }\n\n    /**\n     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n     *\n     * @private\n     * @param {number|Object} id The timer id or timeout object of the timer to clear.\n     */\n    var clearTimeout = ctxClearTimeout || function(id) {\n      return root.clearTimeout(id);\n    };\n\n    /**\n     * Creates a clone of  `buffer`.\n     *\n     * @private\n     * @param {Buffer} buffer The buffer to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Buffer} Returns the cloned buffer.\n     */\n    function cloneBuffer(buffer, isDeep) {\n      if (isDeep) {\n        return buffer.slice();\n      }\n      var length = buffer.length,\n          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n      buffer.copy(result);\n      return result;\n    }\n\n    /**\n     * Creates a clone of `arrayBuffer`.\n     *\n     * @private\n     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function cloneArrayBuffer(arrayBuffer) {\n      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n      new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n      return result;\n    }\n\n    /**\n     * Creates a clone of `dataView`.\n     *\n     * @private\n     * @param {Object} dataView The data view to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned data view.\n     */\n    function cloneDataView(dataView, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n    }\n\n    /**\n     * Creates a clone of `regexp`.\n     *\n     * @private\n     * @param {Object} regexp The regexp to clone.\n     * @returns {Object} Returns the cloned regexp.\n     */\n    function cloneRegExp(regexp) {\n      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n      result.lastIndex = regexp.lastIndex;\n      return result;\n    }\n\n    /**\n     * Creates a clone of the `symbol` object.\n     *\n     * @private\n     * @param {Object} symbol The symbol object to clone.\n     * @returns {Object} Returns the cloned symbol object.\n     */\n    function cloneSymbol(symbol) {\n      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n    }\n\n    /**\n     * Creates a clone of `typedArray`.\n     *\n     * @private\n     * @param {Object} typedArray The typed array to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned typed array.\n     */\n    function cloneTypedArray(typedArray, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n    }\n\n    /**\n     * Compares values to sort them in ascending order.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {number} Returns the sort order indicator for `value`.\n     */\n    function compareAscending(value, other) {\n      if (value !== other) {\n        var valIsDefined = value !== undefined,\n            valIsNull = value === null,\n            valIsReflexive = value === value,\n            valIsSymbol = isSymbol(value);\n\n        var othIsDefined = other !== undefined,\n            othIsNull = other === null,\n            othIsReflexive = other === other,\n            othIsSymbol = isSymbol(other);\n\n        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n            (valIsNull && othIsDefined && othIsReflexive) ||\n            (!valIsDefined && othIsReflexive) ||\n            !valIsReflexive) {\n          return 1;\n        }\n        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n            (othIsNull && valIsDefined && valIsReflexive) ||\n            (!othIsDefined && valIsReflexive) ||\n            !othIsReflexive) {\n          return -1;\n        }\n      }\n      return 0;\n    }\n\n    /**\n     * Used by `_.orderBy` to compare multiple properties of a value to another\n     * and stable sort them.\n     *\n     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n     * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n     * of corresponding values.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {boolean[]|string[]} orders The order to sort by for each property.\n     * @returns {number} Returns the sort order indicator for `object`.\n     */\n    function compareMultiple(object, other, orders) {\n      var index = -1,\n          objCriteria = object.criteria,\n          othCriteria = other.criteria,\n          length = objCriteria.length,\n          ordersLength = orders.length;\n\n      while (++index < length) {\n        var result = compareAscending(objCriteria[index], othCriteria[index]);\n        if (result) {\n          if (index >= ordersLength) {\n            return result;\n          }\n          var order = orders[index];\n          return result * (order == 'desc' ? -1 : 1);\n        }\n      }\n      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n      // that causes it, under certain circumstances, to provide the same value for\n      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n      // for more details.\n      //\n      // This also ensures a stable sort in V8 and other engines.\n      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n      return object.index - other.index;\n    }\n\n    /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgs(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersLength = holders.length,\n          leftIndex = -1,\n          leftLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(leftLength + rangeLength),\n          isUncurried = !isCurried;\n\n      while (++leftIndex < leftLength) {\n        result[leftIndex] = partials[leftIndex];\n      }\n      while (++argsIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[holders[argsIndex]] = args[argsIndex];\n        }\n      }\n      while (rangeLength--) {\n        result[leftIndex++] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgsRight(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersIndex = -1,\n          holdersLength = holders.length,\n          rightIndex = -1,\n          rightLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(rangeLength + rightLength),\n          isUncurried = !isCurried;\n\n      while (++argsIndex < rangeLength) {\n        result[argsIndex] = args[argsIndex];\n      }\n      var offset = argsIndex;\n      while (++rightIndex < rightLength) {\n        result[offset + rightIndex] = partials[rightIndex];\n      }\n      while (++holdersIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[offset + holders[holdersIndex]] = args[argsIndex++];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n    function copyArray(source, array) {\n      var index = -1,\n          length = source.length;\n\n      array || (array = Array(length));\n      while (++index < length) {\n        array[index] = source[index];\n      }\n      return array;\n    }\n\n    /**\n     * Copies properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Array} props The property identifiers to copy.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Function} [customizer] The function to customize copied values.\n     * @returns {Object} Returns `object`.\n     */\n    function copyObject(source, props, object, customizer) {\n      var isNew = !object;\n      object || (object = {});\n\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index];\n\n        var newValue = customizer\n          ? customizer(object[key], source[key], key, object, source)\n          : undefined;\n\n        if (newValue === undefined) {\n          newValue = source[key];\n        }\n        if (isNew) {\n          baseAssignValue(object, key, newValue);\n        } else {\n          assignValue(object, key, newValue);\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Copies own symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbols(source, object) {\n      return copyObject(source, getSymbols(source), object);\n    }\n\n    /**\n     * Copies own and inherited symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbolsIn(source, object) {\n      return copyObject(source, getSymbolsIn(source), object);\n    }\n\n    /**\n     * Creates a function like `_.groupBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} [initializer] The accumulator object initializer.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter, initializer) {\n      return function(collection, iteratee) {\n        var func = isArray(collection) ? arrayAggregator : baseAggregator,\n            accumulator = initializer ? initializer() : {};\n\n        return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n      };\n    }\n\n    /**\n     * Creates a function like `_.assign`.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n      return baseRest(function(object, sources) {\n        var index = -1,\n            length = sources.length,\n            customizer = length > 1 ? sources[length - 1] : undefined,\n            guard = length > 2 ? sources[2] : undefined;\n\n        customizer = (assigner.length > 3 && typeof customizer == 'function')\n          ? (length--, customizer)\n          : undefined;\n\n        if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n          customizer = length < 3 ? undefined : customizer;\n          length = 1;\n        }\n        object = Object(object);\n        while (++index < length) {\n          var source = sources[index];\n          if (source) {\n            assigner(object, source, index, customizer);\n          }\n        }\n        return object;\n      });\n    }\n\n    /**\n     * Creates a `baseEach` or `baseEachRight` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseEach(eachFunc, fromRight) {\n      return function(collection, iteratee) {\n        if (collection == null) {\n          return collection;\n        }\n        if (!isArrayLike(collection)) {\n          return eachFunc(collection, iteratee);\n        }\n        var length = collection.length,\n            index = fromRight ? length : -1,\n            iterable = Object(collection);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          if (iteratee(iterable[index], index, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      };\n    }\n\n    /**\n     * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n      return function(object, iteratee, keysFunc) {\n        var index = -1,\n            iterable = Object(object),\n            props = keysFunc(object),\n            length = props.length;\n\n        while (length--) {\n          var key = props[fromRight ? length : ++index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the optional `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createBind(func, bitmask, thisArg) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(isBind ? thisArg : this, arguments);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.lowerFirst`.\n     *\n     * @private\n     * @param {string} methodName The name of the `String` case method to use.\n     * @returns {Function} Returns the new case function.\n     */\n    function createCaseFirst(methodName) {\n      return function(string) {\n        string = toString(string);\n\n        var strSymbols = hasUnicode(string)\n          ? stringToArray(string)\n          : undefined;\n\n        var chr = strSymbols\n          ? strSymbols[0]\n          : string.charAt(0);\n\n        var trailing = strSymbols\n          ? castSlice(strSymbols, 1).join('')\n          : string.slice(1);\n\n        return chr[methodName]() + trailing;\n      };\n    }\n\n    /**\n     * Creates a function like `_.camelCase`.\n     *\n     * @private\n     * @param {Function} callback The function to combine each word.\n     * @returns {Function} Returns the new compounder function.\n     */\n    function createCompounder(callback) {\n      return function(string) {\n        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n      };\n    }\n\n    /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCtor(Ctor) {\n      return function() {\n        // Use a `switch` statement to work with class constructors. See\n        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n        // for more details.\n        var args = arguments;\n        switch (args.length) {\n          case 0: return new Ctor;\n          case 1: return new Ctor(args[0]);\n          case 2: return new Ctor(args[0], args[1]);\n          case 3: return new Ctor(args[0], args[1], args[2]);\n          case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n        }\n        var thisBinding = baseCreate(Ctor.prototype),\n            result = Ctor.apply(thisBinding, args);\n\n        // Mimic the constructor's `return` behavior.\n        // See https://es5.github.io/#x13.2.2 for more details.\n        return isObject(result) ? result : thisBinding;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to enable currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {number} arity The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCurry(func, bitmask, arity) {\n      var Ctor = createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length,\n            placeholder = getHolder(wrapper);\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n          ? []\n          : replaceHolders(args, placeholder);\n\n        length -= holders.length;\n        if (length < arity) {\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, undefined,\n            args, holders, undefined, undefined, arity - length);\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return apply(fn, this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.find` or `_.findLast` function.\n     *\n     * @private\n     * @param {Function} findIndexFunc The function to find the collection index.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFind(findIndexFunc) {\n      return function(collection, predicate, fromIndex) {\n        var iterable = Object(collection);\n        if (!isArrayLike(collection)) {\n          var iteratee = getIteratee(predicate, 3);\n          collection = keys(collection);\n          predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n        }\n        var index = findIndexFunc(collection, predicate, fromIndex);\n        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n      };\n    }\n\n    /**\n     * Creates a `_.flow` or `_.flowRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new flow function.\n     */\n    function createFlow(fromRight) {\n      return flatRest(function(funcs) {\n        var length = funcs.length,\n            index = length,\n            prereq = LodashWrapper.prototype.thru;\n\n        if (fromRight) {\n          funcs.reverse();\n        }\n        while (index--) {\n          var func = funcs[index];\n          if (typeof func != 'function') {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n            var wrapper = new LodashWrapper([], true);\n          }\n        }\n        index = wrapper ? index : length;\n        while (++index < length) {\n          func = funcs[index];\n\n          var funcName = getFuncName(func),\n              data = funcName == 'wrapper' ? getData(func) : undefined;\n\n          if (data && isLaziable(data[0]) &&\n                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n                !data[4].length && data[9] == 1\n              ) {\n            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n          } else {\n            wrapper = (func.length == 1 && isLaziable(func))\n              ? wrapper[funcName]()\n              : wrapper.thru(func);\n          }\n        }\n        return function() {\n          var args = arguments,\n              value = args[0];\n\n          if (wrapper && args.length == 1 && isArray(value)) {\n            return wrapper.plant(value).value();\n          }\n          var index = 0,\n              result = length ? funcs[index].apply(this, args) : value;\n\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      });\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with optional `this`\n     * binding of `thisArg`, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided\n     *  to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n      var isAry = bitmask & WRAP_ARY_FLAG,\n          isBind = bitmask & WRAP_BIND_FLAG,\n          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n          isFlip = bitmask & WRAP_FLIP_FLAG,\n          Ctor = isBindKey ? undefined : createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length;\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        if (isCurried) {\n          var placeholder = getHolder(wrapper),\n              holdersCount = countHolders(args, placeholder);\n        }\n        if (partials) {\n          args = composeArgs(args, partials, holders, isCurried);\n        }\n        if (partialsRight) {\n          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n        }\n        length -= holdersCount;\n        if (isCurried && length < arity) {\n          var newHolders = replaceHolders(args, placeholder);\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n            args, newHolders, argPos, ary, arity - length\n          );\n        }\n        var thisBinding = isBind ? thisArg : this,\n            fn = isBindKey ? thisBinding[func] : func;\n\n        length = args.length;\n        if (argPos) {\n          args = reorder(args, argPos);\n        } else if (isFlip && length > 1) {\n          args.reverse();\n        }\n        if (isAry && ary < length) {\n          args.length = ary;\n        }\n        if (this && this !== root && this instanceof wrapper) {\n          fn = Ctor || createCtor(fn);\n        }\n        return fn.apply(thisBinding, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.invertBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} toIteratee The function to resolve iteratees.\n     * @returns {Function} Returns the new inverter function.\n     */\n    function createInverter(setter, toIteratee) {\n      return function(object, iteratee) {\n        return baseInverter(object, setter, toIteratee(iteratee), {});\n      };\n    }\n\n    /**\n     * Creates a function that performs a mathematical operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @param {number} [defaultValue] The value used for `undefined` arguments.\n     * @returns {Function} Returns the new mathematical operation function.\n     */\n    function createMathOperation(operator, defaultValue) {\n      return function(value, other) {\n        var result;\n        if (value === undefined && other === undefined) {\n          return defaultValue;\n        }\n        if (value !== undefined) {\n          result = value;\n        }\n        if (other !== undefined) {\n          if (result === undefined) {\n            return other;\n          }\n          if (typeof value == 'string' || typeof other == 'string') {\n            value = baseToString(value);\n            other = baseToString(other);\n          } else {\n            value = baseToNumber(value);\n            other = baseToNumber(other);\n          }\n          result = operator(value, other);\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function like `_.over`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over iteratees.\n     * @returns {Function} Returns the new over function.\n     */\n    function createOver(arrayFunc) {\n      return flatRest(function(iteratees) {\n        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n        return baseRest(function(args) {\n          var thisArg = this;\n          return arrayFunc(iteratees, function(iteratee) {\n            return apply(iteratee, thisArg, args);\n          });\n        });\n      });\n    }\n\n    /**\n     * Creates the padding for `string` based on `length`. The `chars` string\n     * is truncated if the number of characters exceeds `length`.\n     *\n     * @private\n     * @param {number} length The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padding for `string`.\n     */\n    function createPadding(length, chars) {\n      chars = chars === undefined ? ' ' : baseToString(chars);\n\n      var charsLength = chars.length;\n      if (charsLength < 2) {\n        return charsLength ? baseRepeat(chars, length) : chars;\n      }\n      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n      return hasUnicode(chars)\n        ? castSlice(stringToArray(result), 0, length).join('')\n        : result.slice(0, length);\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the `this` binding\n     * of `thisArg` and `partials` prepended to the arguments it receives.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to\n     *  the new function.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createPartial(func, bitmask, thisArg, partials) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var argsIndex = -1,\n            argsLength = arguments.length,\n            leftIndex = -1,\n            leftLength = partials.length,\n            args = Array(leftLength + argsLength),\n            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n        while (++leftIndex < leftLength) {\n          args[leftIndex] = partials[leftIndex];\n        }\n        while (argsLength--) {\n          args[leftIndex++] = arguments[++argsIndex];\n        }\n        return apply(fn, isBind ? thisArg : this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.range` or `_.rangeRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new range function.\n     */\n    function createRange(fromRight) {\n      return function(start, end, step) {\n        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n          end = step = undefined;\n        }\n        // Ensure the sign of `-0` is preserved.\n        start = toFinite(start);\n        if (end === undefined) {\n          end = start;\n          start = 0;\n        } else {\n          end = toFinite(end);\n        }\n        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n        return baseRange(start, end, step, fromRight);\n      };\n    }\n\n    /**\n     * Creates a function that performs a relational operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @returns {Function} Returns the new relational operation function.\n     */\n    function createRelationalOperation(operator) {\n      return function(value, other) {\n        if (!(typeof value == 'string' && typeof other == 'string')) {\n          value = toNumber(value);\n          other = toNumber(other);\n        }\n        return operator(value, other);\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to continue currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {Function} wrapFunc The function to create the `func` wrapper.\n     * @param {*} placeholder The placeholder value.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n      var isCurry = bitmask & WRAP_CURRY_FLAG,\n          newHolders = isCurry ? holders : undefined,\n          newHoldersRight = isCurry ? undefined : holders,\n          newPartials = isCurry ? partials : undefined,\n          newPartialsRight = isCurry ? undefined : partials;\n\n      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n      }\n      var newData = [\n        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n        newHoldersRight, argPos, ary, arity\n      ];\n\n      var result = wrapFunc.apply(undefined, newData);\n      if (isLaziable(func)) {\n        setData(result, newData);\n      }\n      result.placeholder = placeholder;\n      return setWrapToString(result, func, bitmask);\n    }\n\n    /**\n     * Creates a function like `_.round`.\n     *\n     * @private\n     * @param {string} methodName The name of the `Math` method to use when rounding.\n     * @returns {Function} Returns the new round function.\n     */\n    function createRound(methodName) {\n      var func = Math[methodName];\n      return function(number, precision) {\n        number = toNumber(number);\n        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n        if (precision && nativeIsFinite(number)) {\n          // Shift with exponential notation to avoid floating-point issues.\n          // See [MDN](https://mdn.io/round#Examples) for more details.\n          var pair = (toString(number) + 'e').split('e'),\n              value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n          pair = (toString(value) + 'e').split('e');\n          return +(pair[0] + 'e' + (+pair[1] - precision));\n        }\n        return func(number);\n      };\n    }\n\n    /**\n     * Creates a set object of `values`.\n     *\n     * @private\n     * @param {Array} values The values to add to the set.\n     * @returns {Object} Returns the new set.\n     */\n    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n      return new Set(values);\n    };\n\n    /**\n     * Creates a `_.toPairs` or `_.toPairsIn` function.\n     *\n     * @private\n     * @param {Function} keysFunc The function to get the keys of a given object.\n     * @returns {Function} Returns the new pairs function.\n     */\n    function createToPairs(keysFunc) {\n      return function(object) {\n        var tag = getTag(object);\n        if (tag == mapTag) {\n          return mapToArray(object);\n        }\n        if (tag == setTag) {\n          return setToPairs(object);\n        }\n        return baseToPairs(object, keysFunc(object));\n      };\n    }\n\n    /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags.\n     *    1 - `_.bind`\n     *    2 - `_.bindKey`\n     *    4 - `_.curry` or `_.curryRight` of a bound function\n     *    8 - `_.curry`\n     *   16 - `_.curryRight`\n     *   32 - `_.partial`\n     *   64 - `_.partialRight`\n     *  128 - `_.rearg`\n     *  256 - `_.ary`\n     *  512 - `_.flip`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n      if (!isBindKey && typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = partials ? partials.length : 0;\n      if (!length) {\n        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n        partials = holders = undefined;\n      }\n      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n      arity = arity === undefined ? arity : toInteger(arity);\n      length -= holders ? holders.length : 0;\n\n      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n        var partialsRight = partials,\n            holdersRight = holders;\n\n        partials = holders = undefined;\n      }\n      var data = isBindKey ? undefined : getData(func);\n\n      var newData = [\n        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n        argPos, ary, arity\n      ];\n\n      if (data) {\n        mergeData(newData, data);\n      }\n      func = newData[0];\n      bitmask = newData[1];\n      thisArg = newData[2];\n      partials = newData[3];\n      holders = newData[4];\n      arity = newData[9] = newData[9] === undefined\n        ? (isBindKey ? 0 : func.length)\n        : nativeMax(newData[9] - length, 0);\n\n      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n      }\n      if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n        var result = createBind(func, bitmask, thisArg);\n      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n        result = createCurry(func, bitmask, arity);\n      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n        result = createPartial(func, bitmask, thisArg, partials);\n      } else {\n        result = createHybrid.apply(undefined, newData);\n      }\n      var setter = data ? baseSetData : setData;\n      return setWrapToString(setter(result, newData), func, bitmask);\n    }\n\n    /**\n     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n     * of source objects to the destination object for all destination properties\n     * that resolve to `undefined`.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to assign.\n     * @param {Object} object The parent object of `objValue`.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsAssignIn(objValue, srcValue, key, object) {\n      if (objValue === undefined ||\n          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n        return srcValue;\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n     * objects into destination objects that are passed thru.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to merge.\n     * @param {Object} object The parent object of `objValue`.\n     * @param {Object} source The parent object of `srcValue`.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n      if (isObject(objValue) && isObject(srcValue)) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, objValue);\n        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n        stack['delete'](srcValue);\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n     * objects.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {string} key The key of the property to inspect.\n     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n     */\n    function customOmitClone(value) {\n      return isPlainObject(value) ? undefined : value;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `array` and `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          arrLength = array.length,\n          othLength = other.length;\n\n      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n        return false;\n      }\n      // Check that cyclic values are equal.\n      var arrStacked = stack.get(array);\n      var othStacked = stack.get(other);\n      if (arrStacked && othStacked) {\n        return arrStacked == other && othStacked == array;\n      }\n      var index = -1,\n          result = true,\n          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n      stack.set(array, other);\n      stack.set(other, array);\n\n      // Ignore non-index properties.\n      while (++index < arrLength) {\n        var arrValue = array[index],\n            othValue = other[index];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, arrValue, index, other, array, stack)\n            : customizer(arrValue, othValue, index, array, other, stack);\n        }\n        if (compared !== undefined) {\n          if (compared) {\n            continue;\n          }\n          result = false;\n          break;\n        }\n        // Recursively compare arrays (susceptible to call stack limits).\n        if (seen) {\n          if (!arraySome(other, function(othValue, othIndex) {\n                if (!cacheHas(seen, othIndex) &&\n                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n                  return seen.push(othIndex);\n                }\n              })) {\n            result = false;\n            break;\n          }\n        } else if (!(\n              arrValue === othValue ||\n                equalFunc(arrValue, othValue, bitmask, customizer, stack)\n            )) {\n          result = false;\n          break;\n        }\n      }\n      stack['delete'](array);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n      switch (tag) {\n        case dataViewTag:\n          if ((object.byteLength != other.byteLength) ||\n              (object.byteOffset != other.byteOffset)) {\n            return false;\n          }\n          object = object.buffer;\n          other = other.buffer;\n\n        case arrayBufferTag:\n          if ((object.byteLength != other.byteLength) ||\n              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n            return false;\n          }\n          return true;\n\n        case boolTag:\n        case dateTag:\n        case numberTag:\n          // Coerce booleans to `1` or `0` and dates to milliseconds.\n          // Invalid dates are coerced to `NaN`.\n          return eq(+object, +other);\n\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings, primitives and objects,\n          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n          // for more details.\n          return object == (other + '');\n\n        case mapTag:\n          var convert = mapToArray;\n\n        case setTag:\n          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n          convert || (convert = setToArray);\n\n          if (object.size != other.size && !isPartial) {\n            return false;\n          }\n          // Assume cyclic values are equal.\n          var stacked = stack.get(object);\n          if (stacked) {\n            return stacked == other;\n          }\n          bitmask |= COMPARE_UNORDERED_FLAG;\n\n          // Recursively compare objects (susceptible to call stack limits).\n          stack.set(object, other);\n          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n          stack['delete'](object);\n          return result;\n\n        case symbolTag:\n          if (symbolValueOf) {\n            return symbolValueOf.call(object) == symbolValueOf.call(other);\n          }\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          objProps = getAllKeys(object),\n          objLength = objProps.length,\n          othProps = getAllKeys(other),\n          othLength = othProps.length;\n\n      if (objLength != othLength && !isPartial) {\n        return false;\n      }\n      var index = objLength;\n      while (index--) {\n        var key = objProps[index];\n        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n          return false;\n        }\n      }\n      // Check that cyclic values are equal.\n      var objStacked = stack.get(object);\n      var othStacked = stack.get(other);\n      if (objStacked && othStacked) {\n        return objStacked == other && othStacked == object;\n      }\n      var result = true;\n      stack.set(object, other);\n      stack.set(other, object);\n\n      var skipCtor = isPartial;\n      while (++index < objLength) {\n        key = objProps[index];\n        var objValue = object[key],\n            othValue = other[key];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, objValue, key, other, object, stack)\n            : customizer(objValue, othValue, key, object, other, stack);\n        }\n        // Recursively compare objects (susceptible to call stack limits).\n        if (!(compared === undefined\n              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n              : compared\n            )) {\n          result = false;\n          break;\n        }\n        skipCtor || (skipCtor = key == 'constructor');\n      }\n      if (result && !skipCtor) {\n        var objCtor = object.constructor,\n            othCtor = other.constructor;\n\n        // Non `Object` object instances with different constructors are not equal.\n        if (objCtor != othCtor &&\n            ('constructor' in object && 'constructor' in other) &&\n            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n              typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n          result = false;\n        }\n      }\n      stack['delete'](object);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseRest` which flattens the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    function flatRest(func) {\n      return setToString(overRest(func, undefined, flatten), func + '');\n    }\n\n    /**\n     * Creates an array of own enumerable property names and symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeys(object) {\n      return baseGetAllKeys(object, keys, getSymbols);\n    }\n\n    /**\n     * Creates an array of own and inherited enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeysIn(object) {\n      return baseGetAllKeys(object, keysIn, getSymbolsIn);\n    }\n\n    /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n    var getData = !metaMap ? noop : function(func) {\n      return metaMap.get(func);\n    };\n\n    /**\n     * Gets the name of `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {string} Returns the function name.\n     */\n    function getFuncName(func) {\n      var result = (func.name + ''),\n          array = realNames[result],\n          length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n      while (length--) {\n        var data = array[length],\n            otherFunc = data.func;\n        if (otherFunc == null || otherFunc == func) {\n          return data.name;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets the argument placeholder value for `func`.\n     *\n     * @private\n     * @param {Function} func The function to inspect.\n     * @returns {*} Returns the placeholder value.\n     */\n    function getHolder(func) {\n      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n      return object.placeholder;\n    }\n\n    /**\n     * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n     * this function returns the custom method, otherwise it returns `baseIteratee`.\n     * If arguments are provided, the chosen function is invoked with them and\n     * its result is returned.\n     *\n     * @private\n     * @param {*} [value] The value to convert to an iteratee.\n     * @param {number} [arity] The arity of the created iteratee.\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getIteratee() {\n      var result = lodash.iteratee || iteratee;\n      result = result === iteratee ? baseIteratee : result;\n      return arguments.length ? result(arguments[0], arguments[1]) : result;\n    }\n\n    /**\n     * Gets the data for `map`.\n     *\n     * @private\n     * @param {Object} map The map to query.\n     * @param {string} key The reference key.\n     * @returns {*} Returns the map data.\n     */\n    function getMapData(map, key) {\n      var data = map.__data__;\n      return isKeyable(key)\n        ? data[typeof key == 'string' ? 'string' : 'hash']\n        : data.map;\n    }\n\n    /**\n     * Gets the property names, values, and compare flags of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the match data of `object`.\n     */\n    function getMatchData(object) {\n      var result = keys(object),\n          length = result.length;\n\n      while (length--) {\n        var key = result[length],\n            value = object[key];\n\n        result[length] = [key, value, isStrictComparable(value)];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the native function at `key` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the method to get.\n     * @returns {*} Returns the function if it's native, else `undefined`.\n     */\n    function getNative(object, key) {\n      var value = getValue(object, key);\n      return baseIsNative(value) ? value : undefined;\n    }\n\n    /**\n     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the raw `toStringTag`.\n     */\n    function getRawTag(value) {\n      var isOwn = hasOwnProperty.call(value, symToStringTag),\n          tag = value[symToStringTag];\n\n      try {\n        value[symToStringTag] = undefined;\n        var unmasked = true;\n      } catch (e) {}\n\n      var result = nativeObjectToString.call(value);\n      if (unmasked) {\n        if (isOwn) {\n          value[symToStringTag] = tag;\n        } else {\n          delete value[symToStringTag];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array of the own enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n      if (object == null) {\n        return [];\n      }\n      object = Object(object);\n      return arrayFilter(nativeGetSymbols(object), function(symbol) {\n        return propertyIsEnumerable.call(object, symbol);\n      });\n    };\n\n    /**\n     * Creates an array of the own and inherited enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n      var result = [];\n      while (object) {\n        arrayPush(result, getSymbols(object));\n        object = getPrototype(object);\n      }\n      return result;\n    };\n\n    /**\n     * Gets the `toStringTag` of `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    var getTag = baseGetTag;\n\n    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n        (Map && getTag(new Map) != mapTag) ||\n        (Promise && getTag(Promise.resolve()) != promiseTag) ||\n        (Set && getTag(new Set) != setTag) ||\n        (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n      getTag = function(value) {\n        var result = baseGetTag(value),\n            Ctor = result == objectTag ? value.constructor : undefined,\n            ctorString = Ctor ? toSource(Ctor) : '';\n\n        if (ctorString) {\n          switch (ctorString) {\n            case dataViewCtorString: return dataViewTag;\n            case mapCtorString: return mapTag;\n            case promiseCtorString: return promiseTag;\n            case setCtorString: return setTag;\n            case weakMapCtorString: return weakMapTag;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} transforms The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n    function getView(start, end, transforms) {\n      var index = -1,\n          length = transforms.length;\n\n      while (++index < length) {\n        var data = transforms[index],\n            size = data.size;\n\n        switch (data.type) {\n          case 'drop':      start += size; break;\n          case 'dropRight': end -= size; break;\n          case 'take':      end = nativeMin(end, start + size); break;\n          case 'takeRight': start = nativeMax(start, end - size); break;\n        }\n      }\n      return { 'start': start, 'end': end };\n    }\n\n    /**\n     * Extracts wrapper details from the `source` body comment.\n     *\n     * @private\n     * @param {string} source The source to inspect.\n     * @returns {Array} Returns the wrapper details.\n     */\n    function getWrapDetails(source) {\n      var match = source.match(reWrapDetails);\n      return match ? match[1].split(reSplitDetails) : [];\n    }\n\n    /**\n     * Checks if `path` exists on `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @param {Function} hasFunc The function to check properties.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     */\n    function hasPath(object, path, hasFunc) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          result = false;\n\n      while (++index < length) {\n        var key = toKey(path[index]);\n        if (!(result = object != null && hasFunc(object, key))) {\n          break;\n        }\n        object = object[key];\n      }\n      if (result || ++index != length) {\n        return result;\n      }\n      length = object == null ? 0 : object.length;\n      return !!length && isLength(length) && isIndex(key, length) &&\n        (isArray(object) || isArguments(object));\n    }\n\n    /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n    function initCloneArray(array) {\n      var length = array.length,\n          result = new array.constructor(length);\n\n      // Add properties assigned by `RegExp#exec`.\n      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n        result.index = array.index;\n        result.input = array.input;\n      }\n      return result;\n    }\n\n    /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneObject(object) {\n      return (typeof object.constructor == 'function' && !isPrototype(object))\n        ? baseCreate(getPrototype(object))\n        : {};\n    }\n\n    /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, isDeep) {\n      var Ctor = object.constructor;\n      switch (tag) {\n        case arrayBufferTag:\n          return cloneArrayBuffer(object);\n\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n\n        case dataViewTag:\n          return cloneDataView(object, isDeep);\n\n        case float32Tag: case float64Tag:\n        case int8Tag: case int16Tag: case int32Tag:\n        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n          return cloneTypedArray(object, isDeep);\n\n        case mapTag:\n          return new Ctor;\n\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n\n        case regexpTag:\n          return cloneRegExp(object);\n\n        case setTag:\n          return new Ctor;\n\n        case symbolTag:\n          return cloneSymbol(object);\n      }\n    }\n\n    /**\n     * Inserts wrapper `details` in a comment at the top of the `source` body.\n     *\n     * @private\n     * @param {string} source The source to modify.\n     * @returns {Array} details The details to insert.\n     * @returns {string} Returns the modified source.\n     */\n    function insertWrapDetails(source, details) {\n      var length = details.length;\n      if (!length) {\n        return source;\n      }\n      var lastIndex = length - 1;\n      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n      details = details.join(length > 2 ? ', ' : ' ');\n      return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n    }\n\n    /**\n     * Checks if `value` is a flattenable `arguments` object or array.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n     */\n    function isFlattenable(value) {\n      return isArray(value) || isArguments(value) ||\n        !!(spreadableSymbol && value && value[spreadableSymbol]);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n    function isIndex(value, length) {\n      var type = typeof value;\n      length = length == null ? MAX_SAFE_INTEGER : length;\n\n      return !!length &&\n        (type == 'number' ||\n          (type != 'symbol' && reIsUint.test(value))) &&\n            (value > -1 && value % 1 == 0 && value < length);\n    }\n\n    /**\n     * Checks if the given arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n     *  else `false`.\n     */\n    function isIterateeCall(value, index, object) {\n      if (!isObject(object)) {\n        return false;\n      }\n      var type = typeof index;\n      if (type == 'number'\n            ? (isArrayLike(object) && isIndex(index, object.length))\n            : (type == 'string' && index in object)\n          ) {\n        return eq(object[index], value);\n      }\n      return false;\n    }\n\n    /**\n     * Checks if `value` is a property name and not a property path.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n     */\n    function isKey(value, object) {\n      if (isArray(value)) {\n        return false;\n      }\n      var type = typeof value;\n      if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n          value == null || isSymbol(value)) {\n        return true;\n      }\n      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n        (object != null && value in Object(object));\n    }\n\n    /**\n     * Checks if `value` is suitable for use as unique object key.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n     */\n    function isKeyable(value) {\n      var type = typeof value;\n      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n        ? (value !== '__proto__')\n        : (value === null);\n    }\n\n    /**\n     * Checks if `func` has a lazy counterpart.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n     *  else `false`.\n     */\n    function isLaziable(func) {\n      var funcName = getFuncName(func),\n          other = lodash[funcName];\n\n      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n        return false;\n      }\n      if (func === other) {\n        return true;\n      }\n      var data = getData(other);\n      return !!data && func === data[0];\n    }\n\n    /**\n     * Checks if `func` has its source masked.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n     */\n    function isMasked(func) {\n      return !!maskSrcKey && (maskSrcKey in func);\n    }\n\n    /**\n     * Checks if `func` is capable of being masked.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n     */\n    var isMaskable = coreJsData ? isFunction : stubFalse;\n\n    /**\n     * Checks if `value` is likely a prototype object.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n     */\n    function isPrototype(value) {\n      var Ctor = value && value.constructor,\n          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n      return value === proto;\n    }\n\n    /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n    function isStrictComparable(value) {\n      return value === value && !isObject(value);\n    }\n\n    /**\n     * A specialized version of `matchesProperty` for source values suitable\n     * for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function matchesStrictComparable(key, srcValue) {\n      return function(object) {\n        if (object == null) {\n          return false;\n        }\n        return object[key] === srcValue &&\n          (srcValue !== undefined || (key in Object(object)));\n      };\n    }\n\n    /**\n     * A specialized version of `_.memoize` which clears the memoized function's\n     * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n     *\n     * @private\n     * @param {Function} func The function to have its output memoized.\n     * @returns {Function} Returns the new memoized function.\n     */\n    function memoizeCapped(func) {\n      var result = memoize(func, function(key) {\n        if (cache.size === MAX_MEMOIZE_SIZE) {\n          cache.clear();\n        }\n        return key;\n      });\n\n      var cache = result.cache;\n      return result;\n    }\n\n    /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers used to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and\n     * `_.rearg` modify function arguments, making the order in which they are\n     * executed important, preventing the merging of metadata. However, we make\n     * an exception for a safe combined case where curried functions have `_.ary`\n     * and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n    function mergeData(data, source) {\n      var bitmask = data[1],\n          srcBitmask = source[1],\n          newBitmask = bitmask | srcBitmask,\n          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n      var isCombo =\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n      // Exit early if metadata can't be merged.\n      if (!(isCommon || isCombo)) {\n        return data;\n      }\n      // Use source `thisArg` if available.\n      if (srcBitmask & WRAP_BIND_FLAG) {\n        data[2] = source[2];\n        // Set when currying a bound function.\n        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n      }\n      // Compose partial arguments.\n      var value = source[3];\n      if (value) {\n        var partials = data[3];\n        data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n      }\n      // Compose partial right arguments.\n      value = source[5];\n      if (value) {\n        partials = data[5];\n        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n      }\n      // Use source `argPos` if available.\n      value = source[7];\n      if (value) {\n        data[7] = value;\n      }\n      // Use source `ary` if it's smaller.\n      if (srcBitmask & WRAP_ARY_FLAG) {\n        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n      }\n      // Use source `arity` if one is not provided.\n      if (data[9] == null) {\n        data[9] = source[9];\n      }\n      // Use source `func` and merge bitmasks.\n      data[0] = source[0];\n      data[1] = newBitmask;\n\n      return data;\n    }\n\n    /**\n     * This function is like\n     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * except that it includes inherited enumerable properties.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function nativeKeysIn(object) {\n      var result = [];\n      if (object != null) {\n        for (var key in Object(object)) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a string using `Object.prototype.toString`.\n     *\n     * @private\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     */\n    function objectToString(value) {\n      return nativeObjectToString.call(value);\n    }\n\n    /**\n     * A specialized version of `baseRest` which transforms the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @param {Function} transform The rest array transform.\n     * @returns {Function} Returns the new function.\n     */\n    function overRest(func, start, transform) {\n      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n      return function() {\n        var args = arguments,\n            index = -1,\n            length = nativeMax(args.length - start, 0),\n            array = Array(length);\n\n        while (++index < length) {\n          array[index] = args[start + index];\n        }\n        index = -1;\n        var otherArgs = Array(start + 1);\n        while (++index < start) {\n          otherArgs[index] = args[index];\n        }\n        otherArgs[start] = transform(array);\n        return apply(func, this, otherArgs);\n      };\n    }\n\n    /**\n     * Gets the parent value at `path` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} path The path to get the parent value of.\n     * @returns {*} Returns the parent value.\n     */\n    function parent(object, path) {\n      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n    }\n\n    /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n    function reorder(array, indexes) {\n      var arrLength = array.length,\n          length = nativeMin(indexes.length, arrLength),\n          oldArray = copyArray(array);\n\n      while (length--) {\n        var index = indexes[length];\n        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n      }\n      return array;\n    }\n\n    /**\n     * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the property to get.\n     * @returns {*} Returns the property value.\n     */\n    function safeGet(object, key) {\n      if (key === 'constructor' && typeof object[key] === 'function') {\n        return;\n      }\n\n      if (key == '__proto__') {\n        return;\n      }\n\n      return object[key];\n    }\n\n    /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity\n     * function to avoid garbage collection pauses in V8. See\n     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var setData = shortOut(baseSetData);\n\n    /**\n     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    var setTimeout = ctxSetTimeout || function(func, wait) {\n      return root.setTimeout(func, wait);\n    };\n\n    /**\n     * Sets the `toString` method of `func` to return `string`.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var setToString = shortOut(baseSetToString);\n\n    /**\n     * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n     * with wrapper details in a comment at the top of the source body.\n     *\n     * @private\n     * @param {Function} wrapper The function to modify.\n     * @param {Function} reference The reference function.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Function} Returns `wrapper`.\n     */\n    function setWrapToString(wrapper, reference, bitmask) {\n      var source = (reference + '');\n      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n    }\n\n    /**\n     * Creates a function that'll short out and invoke `identity` instead\n     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n     * milliseconds.\n     *\n     * @private\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new shortable function.\n     */\n    function shortOut(func) {\n      var count = 0,\n          lastCalled = 0;\n\n      return function() {\n        var stamp = nativeNow(),\n            remaining = HOT_SPAN - (stamp - lastCalled);\n\n        lastCalled = stamp;\n        if (remaining > 0) {\n          if (++count >= HOT_COUNT) {\n            return arguments[0];\n          }\n        } else {\n          count = 0;\n        }\n        return func.apply(undefined, arguments);\n      };\n    }\n\n    /**\n     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @param {number} [size=array.length] The size of `array`.\n     * @returns {Array} Returns `array`.\n     */\n    function shuffleSelf(array, size) {\n      var index = -1,\n          length = array.length,\n          lastIndex = length - 1;\n\n      size = size === undefined ? length : size;\n      while (++index < size) {\n        var rand = baseRandom(index, lastIndex),\n            value = array[rand];\n\n        array[rand] = array[index];\n        array[index] = value;\n      }\n      array.length = size;\n      return array;\n    }\n\n    /**\n     * Converts `string` to a property path array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the property path array.\n     */\n    var stringToPath = memoizeCapped(function(string) {\n      var result = [];\n      if (string.charCodeAt(0) === 46 /* . */) {\n        result.push('');\n      }\n      string.replace(rePropName, function(match, number, quote, subString) {\n        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n      });\n      return result;\n    });\n\n    /**\n     * Converts `value` to a string key if it's not a string or symbol.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {string|symbol} Returns the key.\n     */\n    function toKey(value) {\n      if (typeof value == 'string' || isSymbol(value)) {\n        return value;\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * Converts `func` to its source code.\n     *\n     * @private\n     * @param {Function} func The function to convert.\n     * @returns {string} Returns the source code.\n     */\n    function toSource(func) {\n      if (func != null) {\n        try {\n          return funcToString.call(func);\n        } catch (e) {}\n        try {\n          return (func + '');\n        } catch (e) {}\n      }\n      return '';\n    }\n\n    /**\n     * Updates wrapper `details` based on `bitmask` flags.\n     *\n     * @private\n     * @returns {Array} details The details to modify.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Array} Returns `details`.\n     */\n    function updateWrapDetails(details, bitmask) {\n      arrayEach(wrapFlags, function(pair) {\n        var value = '_.' + pair[0];\n        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n          details.push(value);\n        }\n      });\n      return details.sort();\n    }\n\n    /**\n     * Creates a clone of `wrapper`.\n     *\n     * @private\n     * @param {Object} wrapper The wrapper to clone.\n     * @returns {Object} Returns the cloned wrapper.\n     */\n    function wrapperClone(wrapper) {\n      if (wrapper instanceof LazyWrapper) {\n        return wrapper.clone();\n      }\n      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n      result.__actions__ = copyArray(wrapper.__actions__);\n      result.__index__  = wrapper.__index__;\n      result.__values__ = wrapper.__values__;\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `array` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {number} [size=1] The length of each chunk\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the new array of chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n    function chunk(array, size, guard) {\n      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n        size = 1;\n      } else {\n        size = nativeMax(toInteger(size), 0);\n      }\n      var length = array == null ? 0 : array.length;\n      if (!length || size < 1) {\n        return [];\n      }\n      var index = 0,\n          resIndex = 0,\n          result = Array(nativeCeil(length / size));\n\n      while (index < length) {\n        result[resIndex++] = baseSlice(array, index, (index += size));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array == null ? 0 : array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[resIndex++] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates a new array concatenating `array` with any additional arrays\n     * and/or values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to concatenate.\n     * @param {...*} [values] The values to concatenate.\n     * @returns {Array} Returns the new concatenated array.\n     * @example\n     *\n     * var array = [1];\n     * var other = _.concat(array, 2, [3], [[4]]);\n     *\n     * console.log(other);\n     * // => [1, 2, 3, [4]]\n     *\n     * console.log(array);\n     * // => [1]\n     */\n    function concat() {\n      var length = arguments.length;\n      if (!length) {\n        return [];\n      }\n      var args = Array(length - 1),\n          array = arguments[0],\n          index = length;\n\n      while (index--) {\n        args[index - 1] = arguments[index];\n      }\n      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n    }\n\n    /**\n     * Creates an array of `array` values not included in the other given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * **Note:** Unlike `_.pullAll`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.without, _.xor\n     * @example\n     *\n     * _.difference([2, 1], [2, 3]);\n     * // => [1]\n     */\n    var difference = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `iteratee` which\n     * is invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var differenceBy = baseRest(function(array, values) {\n      var iteratee = last(values);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `comparator`\n     * which is invoked to compare elements of `array` to `values`. The order and\n     * references of result values are determined by the first array. The comparator\n     * is invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     *\n     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }]\n     */\n    var differenceWith = baseRest(function(array, values) {\n      var comparator = last(values);\n      if (isArrayLikeObject(comparator)) {\n        comparator = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function drop(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function dropRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.dropRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropRightWhile(users, ['active', false]);\n     * // => objects for ['barney']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropRightWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.dropWhile(users, function(o) { return !o.active; });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropWhile(users, ['active', false]);\n     * // => objects for ['pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true)\n        : [];\n    }\n\n    /**\n     * Fills elements of `array` with `value` from `start` up to, but not\n     * including, `end`.\n     *\n     * **Note:** This method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Array\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.fill(array, 'a');\n     * console.log(array);\n     * // => ['a', 'a', 'a']\n     *\n     * _.fill(Array(3), 2);\n     * // => [2, 2, 2]\n     *\n     * _.fill([4, 6, 8, 10], '*', 1, 3);\n     * // => [4, '*', '*', 10]\n     */\n    function fill(array, value, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n        start = 0;\n        end = length;\n      }\n      return baseFill(array, value, start, end);\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.findIndex(users, function(o) { return o.user == 'barney'; });\n     * // => 0\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findIndex(users, { 'user': 'fred', 'active': false });\n     * // => 1\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findIndex(users, ['active', false]);\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findIndex(users, 'active');\n     * // => 2\n     */\n    function findIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index);\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n     * // => 2\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n     * // => 0\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastIndex(users, ['active', false]);\n     * // => 2\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n    function findLastIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length - 1;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = fromIndex < 0\n          ? nativeMax(length + index, 0)\n          : nativeMin(index, length - 1);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n    }\n\n    /**\n     * Flattens `array` a single level deep.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, [3, [4]], 5]\n     */\n    function flatten(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, 1) : [];\n    }\n\n    /**\n     * Recursively flattens `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, 3, 4, 5]\n     */\n    function flattenDeep(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, INFINITY) : [];\n    }\n\n    /**\n     * Recursively flatten `array` up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * var array = [1, [2, [3, [4]], 5]];\n     *\n     * _.flattenDepth(array, 1);\n     * // => [1, 2, [3, [4]], 5]\n     *\n     * _.flattenDepth(array, 2);\n     * // => [1, 2, 3, [4], 5]\n     */\n    function flattenDepth(array, depth) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(array, depth);\n    }\n\n    /**\n     * The inverse of `_.toPairs`; this method returns an object composed\n     * from key-value `pairs`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} pairs The key-value pairs.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.fromPairs([['a', 1], ['b', 2]]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function fromPairs(pairs) {\n      var index = -1,\n          length = pairs == null ? 0 : pairs.length,\n          result = {};\n\n      while (++index < length) {\n        var pair = pairs[index];\n        result[pair[0]] = pair[1];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias first\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.head([1, 2, 3]);\n     * // => 1\n     *\n     * _.head([]);\n     * // => undefined\n     */\n    function head(array) {\n      return (array && array.length) ? array[0] : undefined;\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found in `array`\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. If `fromIndex` is negative, it's used as the\n     * offset from the end of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 1, 2], 2);\n     * // => 1\n     *\n     * // Search from the `fromIndex`.\n     * _.indexOf([1, 2, 1, 2], 2, 2);\n     * // => 3\n     */\n    function indexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseIndexOf(array, value, index);\n    }\n\n    /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n    function initial(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 0, -1) : [];\n    }\n\n    /**\n     * Creates an array of unique values that are included in all given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersection([2, 1], [2, 3]);\n     * // => [2]\n     */\n    var intersection = baseRest(function(arrays) {\n      var mapped = arrayMap(arrays, castArrayLikeObject);\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped)\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `iteratee`\n     * which is invoked for each element of each `arrays` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [2.1]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }]\n     */\n    var intersectionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      if (iteratee === last(mapped)) {\n        iteratee = undefined;\n      } else {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `comparator`\n     * which is invoked to compare elements of `arrays`. The order and references\n     * of result values are determined by the first array. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.intersectionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }]\n     */\n    var intersectionWith = baseRest(function(arrays) {\n      var comparator = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      if (comparator) {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Converts all elements in `array` into a string separated by `separator`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to convert.\n     * @param {string} [separator=','] The element separator.\n     * @returns {string} Returns the joined string.\n     * @example\n     *\n     * _.join(['a', 'b', 'c'], '~');\n     * // => 'a~b~c'\n     */\n    function join(array, separator) {\n      return array == null ? '' : nativeJoin.call(array, separator);\n    }\n\n    /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the last element of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     */\n    function last(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? array[length - 1] : undefined;\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 1, 2], 2);\n     * // => 3\n     *\n     * // Search from the `fromIndex`.\n     * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n      }\n      return value === value\n        ? strictLastIndexOf(array, value, index)\n        : baseFindIndex(array, baseIsNaN, index, true);\n    }\n\n    /**\n     * Gets the element at index `n` of `array`. If `n` is negative, the nth\n     * element from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.11.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=0] The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     *\n     * _.nth(array, 1);\n     * // => 'b'\n     *\n     * _.nth(array, -2);\n     * // => 'c';\n     */\n    function nth(array, n) {\n      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n    }\n\n    /**\n     * Removes all given values from `array` using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n     * to remove elements from an array by predicate.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pull(array, 'a', 'c');\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    var pull = baseRest(pullAll);\n\n    /**\n     * This method is like `_.pull` except that it accepts an array of values to remove.\n     *\n     * **Note:** Unlike `_.difference`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pullAll(array, ['a', 'c']);\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    function pullAll(array, values) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values)\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `iteratee` which is\n     * invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The iteratee is invoked with one argument: (value).\n     *\n     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n     *\n     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n     * console.log(array);\n     * // => [{ 'x': 2 }]\n     */\n    function pullAllBy(array, values, iteratee) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, getIteratee(iteratee, 2))\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `comparator` which\n     * is invoked to compare elements of `array` to `values`. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n     *\n     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n     * console.log(array);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n     */\n    function pullAllWith(array, values, comparator) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, undefined, comparator)\n        : array;\n    }\n\n    /**\n     * Removes elements from `array` corresponding to `indexes` and returns an\n     * array of removed elements.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     * var pulled = _.pullAt(array, [1, 3]);\n     *\n     * console.log(array);\n     * // => ['a', 'c']\n     *\n     * console.log(pulled);\n     * // => ['b', 'd']\n     */\n    var pullAt = flatRest(function(array, indexes) {\n      var length = array == null ? 0 : array.length,\n          result = baseAt(array, indexes);\n\n      basePullAt(array, arrayMap(indexes, function(index) {\n        return isIndex(index, length) ? +index : index;\n      }).sort(compareAscending));\n\n      return result;\n    });\n\n    /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is invoked\n     * with three arguments: (value, index, array).\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n     * to pull elements from an array by value.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) {\n     *   return n % 2 == 0;\n     * });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n    function remove(array, predicate) {\n      var result = [];\n      if (!(array && array.length)) {\n        return result;\n      }\n      var index = -1,\n          indexes = [],\n          length = array.length;\n\n      predicate = getIteratee(predicate, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result.push(value);\n          indexes.push(index);\n        }\n      }\n      basePullAt(array, indexes);\n      return result;\n    }\n\n    /**\n     * Reverses `array` so that the first element becomes the last, the second\n     * element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates `array` and is based on\n     * [`Array#reverse`](https://mdn.io/Array/reverse).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.reverse(array);\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function reverse(array) {\n      return array == null ? array : nativeReverse.call(array);\n    }\n\n    /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This method is used instead of\n     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n     * returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function slice(array, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n        start = 0;\n        end = length;\n      }\n      else {\n        start = start == null ? 0 : toInteger(start);\n        end = end === undefined ? length : toInteger(end);\n      }\n      return baseSlice(array, start, end);\n    }\n\n    /**\n     * Uses a binary search to determine the lowest index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     */\n    function sortedIndex(array, value) {\n      return baseSortedIndex(array, value);\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 0\n     */\n    function sortedIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 1\n     */\n    function sortedIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value);\n        if (index < length && eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n     * // => 4\n     */\n    function sortedLastIndex(array, value) {\n      return baseSortedIndex(array, value, true);\n    }\n\n    /**\n     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 1\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 1\n     */\n    function sortedLastIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n    }\n\n    /**\n     * This method is like `_.lastIndexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 3\n     */\n    function sortedLastIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value, true) - 1;\n        if (eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.uniq` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniq([1, 1, 2]);\n     * // => [1, 2]\n     */\n    function sortedUniq(array) {\n      return (array && array.length)\n        ? baseSortedUniq(array)\n        : [];\n    }\n\n    /**\n     * This method is like `_.uniqBy` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n     * // => [1.1, 2.3]\n     */\n    function sortedUniqBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSortedUniq(array, getIteratee(iteratee, 2))\n        : [];\n    }\n\n    /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.tail([1, 2, 3]);\n     * // => [2, 3]\n     */\n    function tail(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 1, length) : [];\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n    function take(array, n, guard) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n    function takeRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.takeRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeRightWhile(users, ['active', false]);\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeRightWhile(users, 'active');\n     * // => []\n     */\n    function takeRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), false, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.takeWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeWhile(users, ['active', false]);\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeWhile(users, 'active');\n     * // => []\n     */\n    function takeWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3))\n        : [];\n    }\n\n    /**\n     * Creates an array of unique values, in order, from all given arrays using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([2], [1, 2]);\n     * // => [2, 1]\n     */\n    var union = baseRest(function(arrays) {\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which uniqueness is computed. Result values are chosen from the first\n     * array in which the value occurs. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    var unionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `comparator` which\n     * is invoked to compare elements of `arrays`. Result values are chosen from\n     * the first array in which the value occurs. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.unionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var unionWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n    });\n\n    /**\n     * Creates a duplicate-free version of an array, using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons, in which only the first occurrence of each element\n     * is kept. The order of result values is determined by the order they occur\n     * in the array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniq([2, 1, 2]);\n     * // => [2, 1]\n     */\n    function uniq(array) {\n      return (array && array.length) ? baseUniq(array) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * uniqueness is computed. The order of result values is determined by the\n     * order they occur in the array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniqBy(array, iteratee) {\n      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `comparator` which\n     * is invoked to compare elements of `array`. The order of result values is\n     * determined by the order they occur in the array.The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.uniqWith(objects, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n     */\n    function uniqWith(array, comparator) {\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-zip\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.2.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['a', 'b'], [1, 2], [true, false]]\n     */\n    function unzip(array) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var length = 0;\n      array = arrayFilter(array, function(group) {\n        if (isArrayLikeObject(group)) {\n          length = nativeMax(group.length, length);\n          return true;\n        }\n      });\n      return baseTimes(length, function(index) {\n        return arrayMap(array, baseProperty(index));\n      });\n    }\n\n    /**\n     * This method is like `_.unzip` except that it accepts `iteratee` to specify\n     * how regrouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  regrouped values.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n     * // => [[1, 10, 100], [2, 20, 200]]\n     *\n     * _.unzipWith(zipped, _.add);\n     * // => [3, 30, 300]\n     */\n    function unzipWith(array, iteratee) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var result = unzip(array);\n      if (iteratee == null) {\n        return result;\n      }\n      return arrayMap(result, function(group) {\n        return apply(iteratee, undefined, group);\n      });\n    }\n\n    /**\n     * Creates an array excluding all given values using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.pull`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.xor\n     * @example\n     *\n     * _.without([2, 1, 2, 3], 1, 2);\n     * // => [3]\n     */\n    var without = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, values)\n        : [];\n    });\n\n    /**\n     * Creates an array of unique values that is the\n     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n     * of the given arrays. The order of result values is determined by the order\n     * they occur in the arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.without\n     * @example\n     *\n     * _.xor([2, 1], [2, 3]);\n     * // => [1, 3]\n     */\n    var xor = baseRest(function(arrays) {\n      return baseXor(arrayFilter(arrays, isArrayLikeObject));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which by which they're compared. The order of result values is determined\n     * by the order they occur in the arrays. The iteratee is invoked with one\n     * argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2, 3.4]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var xorBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `comparator` which is\n     * invoked to compare elements of `arrays`. The order of result values is\n     * determined by the order they occur in the arrays. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.xorWith(objects, others, _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var xorWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n    });\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the\n     * first elements of the given arrays, the second of which contains the\n     * second elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     */\n    var zip = baseRest(unzip);\n\n    /**\n     * This method is like `_.fromPairs` except that it accepts two arrays,\n     * one of property identifiers and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.4.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject(['a', 'b'], [1, 2]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function zipObject(props, values) {\n      return baseZipObject(props || [], values || [], assignValue);\n    }\n\n    /**\n     * This method is like `_.zipObject` except that it supports property paths.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n     */\n    function zipObjectDeep(props, values) {\n      return baseZipObject(props || [], values || [], baseSet);\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts `iteratee` to specify\n     * how grouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  grouped values.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n     *   return a + b + c;\n     * });\n     * // => [111, 222]\n     */\n    var zipWith = baseRest(function(arrays) {\n      var length = arrays.length,\n          iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n      return unzipWith(arrays, iteratee);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n     * chain sequences enabled. The result of such sequences must be unwrapped\n     * with `_#value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Seq\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _\n     *   .chain(users)\n     *   .sortBy('age')\n     *   .map(function(o) {\n     *     return o.user + ' is ' + o.age;\n     *   })\n     *   .head()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      var result = lodash(value);\n      result.__chain__ = true;\n      return result;\n    }\n\n    /**\n     * This method invokes `interceptor` and returns `value`. The interceptor\n     * is invoked with one argument; (value). The purpose of this method is to\n     * \"tap into\" a method chain sequence in order to modify intermediate results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) {\n     *    // Mutate input array.\n     *    array.pop();\n     *  })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     * The purpose of this method is to \"pass thru\" values replacing intermediate\n     * results in a method chain sequence.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _('  abc  ')\n     *  .chain()\n     *  .trim()\n     *  .thru(function(value) {\n     *    return [value];\n     *  })\n     *  .value();\n     * // => ['abc']\n     */\n    function thru(value, interceptor) {\n      return interceptor(value);\n    }\n\n    /**\n     * This method is the wrapper version of `_.at`.\n     *\n     * @name at\n     * @memberOf _\n     * @since 1.0.0\n     * @category Seq\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _(object).at(['a[0].b.c', 'a[1]']).value();\n     * // => [3, 4]\n     */\n    var wrapperAt = flatRest(function(paths) {\n      var length = paths.length,\n          start = length ? paths[0] : 0,\n          value = this.__wrapped__,\n          interceptor = function(object) { return baseAt(object, paths); };\n\n      if (length > 1 || this.__actions__.length ||\n          !(value instanceof LazyWrapper) || !isIndex(start)) {\n        return this.thru(interceptor);\n      }\n      value = value.slice(start, +start + (length ? 1 : 0));\n      value.__actions__.push({\n        'func': thru,\n        'args': [interceptor],\n        'thisArg': undefined\n      });\n      return new LodashWrapper(value, this.__chain__).thru(function(array) {\n        if (length && !array.length) {\n          array.push(undefined);\n        }\n        return array;\n      });\n    });\n\n    /**\n     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n     *\n     * @name chain\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // A sequence without explicit chaining.\n     * _(users).head();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // A sequence with explicit chaining.\n     * _(users)\n     *   .chain()\n     *   .head()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n    function wrapperChain() {\n      return chain(this);\n    }\n\n    /**\n     * Executes the chain sequence and returns the wrapped result.\n     *\n     * @name commit\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapped = _(array).push(3);\n     *\n     * console.log(array);\n     * // => [1, 2]\n     *\n     * wrapped = wrapped.commit();\n     * console.log(array);\n     * // => [1, 2, 3]\n     *\n     * wrapped.last();\n     * // => 3\n     *\n     * console.log(array);\n     * // => [1, 2, 3]\n     */\n    function wrapperCommit() {\n      return new LodashWrapper(this.value(), this.__chain__);\n    }\n\n    /**\n     * Gets the next value on a wrapped object following the\n     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n     *\n     * @name next\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the next iterator value.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 1 }\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 2 }\n     *\n     * wrapped.next();\n     * // => { 'done': true, 'value': undefined }\n     */\n    function wrapperNext() {\n      if (this.__values__ === undefined) {\n        this.__values__ = toArray(this.value());\n      }\n      var done = this.__index__ >= this.__values__.length,\n          value = done ? undefined : this.__values__[this.__index__++];\n\n      return { 'done': done, 'value': value };\n    }\n\n    /**\n     * Enables the wrapper to be iterable.\n     *\n     * @name Symbol.iterator\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped[Symbol.iterator]() === wrapped;\n     * // => true\n     *\n     * Array.from(wrapped);\n     * // => [1, 2]\n     */\n    function wrapperToIterator() {\n      return this;\n    }\n\n    /**\n     * Creates a clone of the chain sequence planting `value` as the wrapped value.\n     *\n     * @name plant\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @param {*} value The value to plant.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2]).map(square);\n     * var other = wrapped.plant([3, 4]);\n     *\n     * other.value();\n     * // => [9, 16]\n     *\n     * wrapped.value();\n     * // => [1, 4]\n     */\n    function wrapperPlant(value) {\n      var result,\n          parent = this;\n\n      while (parent instanceof baseLodash) {\n        var clone = wrapperClone(parent);\n        clone.__index__ = 0;\n        clone.__values__ = undefined;\n        if (result) {\n          previous.__wrapped__ = clone;\n        } else {\n          result = clone;\n        }\n        var previous = clone;\n        parent = parent.__wrapped__;\n      }\n      previous.__wrapped__ = value;\n      return result;\n    }\n\n    /**\n     * This method is the wrapper version of `_.reverse`.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function wrapperReverse() {\n      var value = this.__wrapped__;\n      if (value instanceof LazyWrapper) {\n        var wrapped = value;\n        if (this.__actions__.length) {\n          wrapped = new LazyWrapper(this);\n        }\n        wrapped = wrapped.reverse();\n        wrapped.__actions__.push({\n          'func': thru,\n          'args': [reverse],\n          'thisArg': undefined\n        });\n        return new LodashWrapper(wrapped, this.__chain__);\n      }\n      return this.thru(reverse);\n    }\n\n    /**\n     * Executes the chain sequence to resolve the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @since 0.1.0\n     * @alias toJSON, valueOf\n     * @category Seq\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n    function wrapperValue() {\n      return baseWrapperValue(this.__wrapped__, this.__actions__);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the number of times the key was returned by `iteratee`. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': 1, '6': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        ++result[key];\n      } else {\n        baseAssignValue(result, key, 1);\n      }\n    });\n\n    /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * Iteration is stopped once `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * **Note:** This method returns `true` for\n     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n     * elements of empty collections.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes'], Boolean);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.every(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.every(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.every(users, 'active');\n     * // => false\n     */\n    function every(collection, predicate, guard) {\n      var func = isArray(collection) ? arrayEvery : baseEvery;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * **Note:** Unlike `_.remove`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.reject\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.filter(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, { 'age': 36, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.filter(users, 'active');\n     * // => objects for ['barney']\n     *\n     * // Combining several predicates using `_.overEvery` or `_.overSome`.\n     * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n     * // => objects for ['fred', 'barney']\n     */\n    function filter(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': true },\n     *   { 'user': 'fred',    'age': 40, 'active': false },\n     *   { 'user': 'pebbles', 'age': 1,  'active': true }\n     * ];\n     *\n     * _.find(users, function(o) { return o.age < 40; });\n     * // => object for 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.find(users, { 'age': 1, 'active': true });\n     * // => object for 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.find(users, ['active', false]);\n     * // => object for 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.find(users, 'active');\n     * // => object for 'barney'\n     */\n    var find = createFind(findIndex);\n\n    /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=collection.length-1] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 1;\n     * });\n     * // => 3\n     */\n    var findLast = createFind(findLastIndex);\n\n    /**\n     * Creates a flattened array of values by running each element in `collection`\n     * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n     * with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [n, n];\n     * }\n     *\n     * _.flatMap([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMap(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), 1);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDeep([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMapDeep(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), INFINITY);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDepth([1, 2], duplicate, 2);\n     * // => [[1, 1], [2, 2]]\n     */\n    function flatMapDepth(collection, iteratee, depth) {\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(map(collection, iteratee), depth);\n    }\n\n    /**\n     * Iterates over elements of `collection` and invokes `iteratee` for each element.\n     * The iteratee is invoked with three arguments: (value, index|key, collection).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n     * property are iterated like arrays. To avoid this behavior use `_.forIn`\n     * or `_.forOwn` for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias each\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEachRight\n     * @example\n     *\n     * _.forEach([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `1` then `2`.\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forEach(collection, iteratee) {\n      var func = isArray(collection) ? arrayEach : baseEach;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEach\n     * @example\n     *\n     * _.forEachRight([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `2` then `1`.\n     */\n    function forEachRight(collection, iteratee) {\n      var func = isArray(collection) ? arrayEachRight : baseEachRight;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The order of grouped values\n     * is determined by the order they occur in `collection`. The corresponding\n     * value of each key is an array of elements responsible for generating the\n     * key. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': [4.2], '6': [6.1, 6.3] }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        result[key].push(value);\n      } else {\n        baseAssignValue(result, key, [value]);\n      }\n    });\n\n    /**\n     * Checks if `value` is in `collection`. If `collection` is a string, it's\n     * checked for a substring of `value`, otherwise\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * is used for equality comparisons. If `fromIndex` is negative, it's used as\n     * the offset from the end of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {boolean} Returns `true` if `value` is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'a': 1, 'b': 2 }, 1);\n     * // => true\n     *\n     * _.includes('abcd', 'bc');\n     * // => true\n     */\n    function includes(collection, value, fromIndex, guard) {\n      collection = isArrayLike(collection) ? collection : values(collection);\n      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n      var length = collection.length;\n      if (fromIndex < 0) {\n        fromIndex = nativeMax(length + fromIndex, 0);\n      }\n      return isString(collection)\n        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n    }\n\n    /**\n     * Invokes the method at `path` of each element in `collection`, returning\n     * an array of the results of each invoked method. Any additional arguments\n     * are provided to each invoked method. If `path` is a function, it's invoked\n     * for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array|Function|string} path The path of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke each method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invokeMap([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    var invokeMap = baseRest(function(collection, path, args) {\n      var index = -1,\n          isFunc = typeof path == 'function',\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value) {\n        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n      });\n      return result;\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the last element responsible for generating the key. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var array = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.keyBy(array, function(o) {\n     *   return String.fromCharCode(o.code);\n     * });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.keyBy(array, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     */\n    var keyBy = createAggregator(function(result, value, key) {\n      baseAssignValue(result, key, value);\n    });\n\n    /**\n     * Creates an array of values by running each element in `collection` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n     *\n     * The guarded methods are:\n     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * _.map([4, 8], square);\n     * // => [16, 64]\n     *\n     * _.map({ 'a': 4, 'b': 8 }, square);\n     * // => [16, 64] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, iteratee) {\n      var func = isArray(collection) ? arrayMap : baseMap;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.sortBy` except that it allows specifying the sort\n     * orders of the iteratees to sort by. If `orders` is unspecified, all values\n     * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n     * descending or \"asc\" for ascending sort order of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @param {string[]} [orders] The sort orders of `iteratees`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 34 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 36 }\n     * ];\n     *\n     * // Sort by `user` in ascending order and by `age` in descending order.\n     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     */\n    function orderBy(collection, iteratees, orders, guard) {\n      if (collection == null) {\n        return [];\n      }\n      if (!isArray(iteratees)) {\n        iteratees = iteratees == null ? [] : [iteratees];\n      }\n      orders = guard ? undefined : orders;\n      if (!isArray(orders)) {\n        orders = orders == null ? [] : [orders];\n      }\n      return baseOrderBy(collection, iteratees, orders);\n    }\n\n    /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, the second of which\n     * contains elements `predicate` returns falsey for. The predicate is\n     * invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * _.partition(users, function(o) { return o.active; });\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.partition(users, { 'age': 1, 'active': false });\n     * // => objects for [['pebbles'], ['barney', 'fred']]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.partition(users, ['active', false]);\n     * // => objects for [['barney', 'pebbles'], ['fred']]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.partition(users, 'active');\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     */\n    var partition = createAggregator(function(result, value, key) {\n      result[key ? 0 : 1].push(value);\n    }, function() { return [[], []]; });\n\n    /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` thru `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not given, the first element of `collection` is used as the initial\n     * value. The iteratee is invoked with four arguments:\n     * (accumulator, value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.reduce`, `_.reduceRight`, and `_.transform`.\n     *\n     * The guarded methods are:\n     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n     * and `sortBy`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduceRight\n     * @example\n     *\n     * _.reduce([1, 2], function(sum, n) {\n     *   return sum + n;\n     * }, 0);\n     * // => 3\n     *\n     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     *   return result;\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n     */\n    function reduce(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduce : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduce\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     *\n     * _.reduceRight(array, function(flattened, other) {\n     *   return flattened.concat(other);\n     * }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduceRight : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n    }\n\n    /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.filter\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * _.reject(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.reject(users, { 'age': 40, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.reject(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.reject(users, 'active');\n     * // => objects for ['barney']\n     */\n    function reject(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, negate(getIteratee(predicate, 3)));\n    }\n\n    /**\n     * Gets a random element from `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     */\n    function sample(collection) {\n      var func = isArray(collection) ? arraySample : baseSample;\n      return func(collection);\n    }\n\n    /**\n     * Gets `n` random elements at unique keys from `collection` up to the\n     * size of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} [n=1] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the random elements.\n     * @example\n     *\n     * _.sampleSize([1, 2, 3], 2);\n     * // => [3, 1]\n     *\n     * _.sampleSize([1, 2, 3], 4);\n     * // => [2, 3, 1]\n     */\n    function sampleSize(collection, n, guard) {\n      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n      return func(collection, n);\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the\n     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n    function shuffle(collection) {\n      var func = isArray(collection) ? arrayShuffle : baseShuffle;\n      return func(collection);\n    }\n\n    /**\n     * Gets the size of `collection` by returning its length for array-like\n     * values or the number of own enumerable string keyed properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the collection size.\n     * @example\n     *\n     * _.size([1, 2, 3]);\n     * // => 3\n     *\n     * _.size({ 'a': 1, 'b': 2 });\n     * // => 2\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      if (collection == null) {\n        return 0;\n      }\n      if (isArrayLike(collection)) {\n        return isString(collection) ? stringSize(collection) : collection.length;\n      }\n      var tag = getTag(collection);\n      if (tag == mapTag || tag == setTag) {\n        return collection.size;\n      }\n      return baseKeys(collection).length;\n    }\n\n    /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * Iteration is stopped once `predicate` returns truthy. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': true },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.some(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.some(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.some(users, 'active');\n     * // => true\n     */\n    function some(collection, predicate, guard) {\n      var func = isArray(collection) ? arraySome : baseSome;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection thru each iteratee. This method\n     * performs a stable sort, that is, it preserves the original sort order of\n     * equal elements. The iteratees are invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 30 },\n     *   { 'user': 'barney', 'age': 34 }\n     * ];\n     *\n     * _.sortBy(users, [function(o) { return o.user; }]);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n     *\n     * _.sortBy(users, ['user', 'age']);\n     * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n     */\n    var sortBy = baseRest(function(collection, iteratees) {\n      if (collection == null) {\n        return [];\n      }\n      var length = iteratees.length;\n      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n        iteratees = [];\n      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n        iteratees = [iteratees[0]];\n      }\n      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the timestamp of the number of milliseconds that have elapsed since\n     * the Unix epoch (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Date\n     * @returns {number} Returns the timestamp.\n     * @example\n     *\n     * _.defer(function(stamp) {\n     *   console.log(_.now() - stamp);\n     * }, _.now());\n     * // => Logs the number of milliseconds it took for the deferred invocation.\n     */\n    var now = ctxNow || function() {\n      return root.Date.now();\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it's called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => Logs 'done saving!' after the two async saves have completed.\n     */\n    function after(n, func) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func`, with up to `n` arguments,\n     * ignoring any additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n    function ary(func, n, guard) {\n      n = guard ? undefined : n;\n      n = (func && n == null) ? func.length : n;\n      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n    }\n\n    /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it's called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery(element).on('click', _.before(5, addContactToList));\n     * // => Allows adding up to 4 contacts to the list.\n     */\n    function before(n, func) {\n      var result;\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n > 0) {\n          result = func.apply(this, arguments);\n        }\n        if (n <= 1) {\n          func = undefined;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and `partials` prepended to the arguments it receives.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * function greet(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * }\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n    var bind = baseRest(function(func, thisArg, partials) {\n      var bitmask = WRAP_BIND_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bind));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(func, bitmask, thisArg, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes the method at `object[key]` with `partials`\n     * prepended to the arguments it receives.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist. See\n     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Function\n     * @param {Object} object The object to invoke the method on.\n     * @param {string} key The key of the method.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n    var bindKey = baseRest(function(object, key, partials) {\n      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bindKey));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(key, bitmask, object, partials, holders);\n    });\n\n    /**\n     * Creates a function that accepts arguments of `func` and either invokes\n     * `func` returning its result, if at least `arity` number of arguments have\n     * been provided, or returns a function that accepts the remaining `func`\n     * arguments, and so on. The arity of `func` may be specified if `func.length`\n     * is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n    function curry(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curry.placeholder;\n      return result;\n    }\n\n    /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n    function curryRight(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curryRight.placeholder;\n      return result;\n    }\n\n    /**\n     * Creates a debounced function that delays invoking `func` until after `wait`\n     * milliseconds have elapsed since the last time the debounced function was\n     * invoked. The debounced function comes with a `cancel` method to cancel\n     * delayed `func` invocations and a `flush` method to immediately invoke them.\n     * Provide `options` to indicate whether `func` should be invoked on the\n     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n     * with the last arguments provided to the debounced function. Subsequent\n     * calls to the debounced function return the result of the last `func`\n     * invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the debounced function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to debounce.\n     * @param {number} [wait=0] The number of milliseconds to delay.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=false]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {number} [options.maxWait]\n     *  The maximum time `func` is allowed to be delayed before it's invoked.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // Avoid costly calculations while the window size is in flux.\n     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n     *\n     * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n     * jQuery(element).on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * }));\n     *\n     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n     * var source = new EventSource('/stream');\n     * jQuery(source).on('message', debounced);\n     *\n     * // Cancel the trailing debounced invocation.\n     * jQuery(window).on('popstate', debounced.cancel);\n     */\n    function debounce(func, wait, options) {\n      var lastArgs,\n          lastThis,\n          maxWait,\n          result,\n          timerId,\n          lastCallTime,\n          lastInvokeTime = 0,\n          leading = false,\n          maxing = false,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      wait = toNumber(wait) || 0;\n      if (isObject(options)) {\n        leading = !!options.leading;\n        maxing = 'maxWait' in options;\n        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n\n      function invokeFunc(time) {\n        var args = lastArgs,\n            thisArg = lastThis;\n\n        lastArgs = lastThis = undefined;\n        lastInvokeTime = time;\n        result = func.apply(thisArg, args);\n        return result;\n      }\n\n      function leadingEdge(time) {\n        // Reset any `maxWait` timer.\n        lastInvokeTime = time;\n        // Start the timer for the trailing edge.\n        timerId = setTimeout(timerExpired, wait);\n        // Invoke the leading edge.\n        return leading ? invokeFunc(time) : result;\n      }\n\n      function remainingWait(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime,\n            timeWaiting = wait - timeSinceLastCall;\n\n        return maxing\n          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n          : timeWaiting;\n      }\n\n      function shouldInvoke(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime;\n\n        // Either this is the first call, activity has stopped and we're at the\n        // trailing edge, the system time has gone backwards and we're treating\n        // it as the trailing edge, or we've hit the `maxWait` limit.\n        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n      }\n\n      function timerExpired() {\n        var time = now();\n        if (shouldInvoke(time)) {\n          return trailingEdge(time);\n        }\n        // Restart the timer.\n        timerId = setTimeout(timerExpired, remainingWait(time));\n      }\n\n      function trailingEdge(time) {\n        timerId = undefined;\n\n        // Only invoke if we have `lastArgs` which means `func` has been\n        // debounced at least once.\n        if (trailing && lastArgs) {\n          return invokeFunc(time);\n        }\n        lastArgs = lastThis = undefined;\n        return result;\n      }\n\n      function cancel() {\n        if (timerId !== undefined) {\n          clearTimeout(timerId);\n        }\n        lastInvokeTime = 0;\n        lastArgs = lastCallTime = lastThis = timerId = undefined;\n      }\n\n      function flush() {\n        return timerId === undefined ? result : trailingEdge(now());\n      }\n\n      function debounced() {\n        var time = now(),\n            isInvoking = shouldInvoke(time);\n\n        lastArgs = arguments;\n        lastThis = this;\n        lastCallTime = time;\n\n        if (isInvoking) {\n          if (timerId === undefined) {\n            return leadingEdge(lastCallTime);\n          }\n          if (maxing) {\n            // Handle invocations in a tight loop.\n            clearTimeout(timerId);\n            timerId = setTimeout(timerExpired, wait);\n            return invokeFunc(lastCallTime);\n          }\n        }\n        if (timerId === undefined) {\n          timerId = setTimeout(timerExpired, wait);\n        }\n        return result;\n      }\n      debounced.cancel = cancel;\n      debounced.flush = flush;\n      return debounced;\n    }\n\n    /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) {\n     *   console.log(text);\n     * }, 'deferred');\n     * // => Logs 'deferred' after one millisecond.\n     */\n    var defer = baseRest(function(func, args) {\n      return baseDelay(func, 1, args);\n    });\n\n    /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) {\n     *   console.log(text);\n     * }, 1000, 'later');\n     * // => Logs 'later' after one second.\n     */\n    var delay = baseRest(function(func, wait, args) {\n      return baseDelay(func, toNumber(wait) || 0, args);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments reversed.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to flip arguments for.\n     * @returns {Function} Returns the new flipped function.\n     * @example\n     *\n     * var flipped = _.flip(function() {\n     *   return _.toArray(arguments);\n     * });\n     *\n     * flipped('a', 'b', 'c', 'd');\n     * // => ['d', 'c', 'b', 'a']\n     */\n    function flip(func) {\n      return createWrap(func, WRAP_FLIP_FLAG);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided, it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is used as the map cache key. The `func`\n     * is invoked with the `this` binding of the memoized function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the\n     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n     * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoized function.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     * var other = { 'c': 3, 'd': 4 };\n     *\n     * var values = _.memoize(_.values);\n     * values(object);\n     * // => [1, 2]\n     *\n     * values(other);\n     * // => [3, 4]\n     *\n     * object.a = 2;\n     * values(object);\n     * // => [1, 2]\n     *\n     * // Modify the result cache.\n     * values.cache.set(object, ['a', 'b']);\n     * values(object);\n     * // => ['a', 'b']\n     *\n     * // Replace `_.memoize.Cache`.\n     * _.memoize.Cache = WeakMap;\n     */\n    function memoize(func, resolver) {\n      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var memoized = function() {\n        var args = arguments,\n            key = resolver ? resolver.apply(this, args) : args[0],\n            cache = memoized.cache;\n\n        if (cache.has(key)) {\n          return cache.get(key);\n        }\n        var result = func.apply(this, args);\n        memoized.cache = cache.set(key, result) || cache;\n        return result;\n      };\n      memoized.cache = new (memoize.Cache || MapCache);\n      return memoized;\n    }\n\n    // Expose `MapCache`.\n    memoize.Cache = MapCache;\n\n    /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new negated function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n    function negate(predicate) {\n      if (typeof predicate != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function() {\n        var args = arguments;\n        switch (args.length) {\n          case 0: return !predicate.call(this);\n          case 1: return !predicate.call(this, args[0]);\n          case 2: return !predicate.call(this, args[0], args[1]);\n          case 3: return !predicate.call(this, args[0], args[1], args[2]);\n        }\n        return !predicate.apply(this, args);\n      };\n    }\n\n    /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first invocation. The `func` is\n     * invoked with the `this` binding and arguments of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // => `createApplication` is invoked once\n     */\n    function once(func) {\n      return before(2, func);\n    }\n\n    /**\n     * Creates a function that invokes `func` with its arguments transformed.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to wrap.\n     * @param {...(Function|Function[])} [transforms=[_.identity]]\n     *  The argument transforms.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function doubled(n) {\n     *   return n * 2;\n     * }\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var func = _.overArgs(function(x, y) {\n     *   return [x, y];\n     * }, [square, doubled]);\n     *\n     * func(9, 3);\n     * // => [81, 6]\n     *\n     * func(10, 5);\n     * // => [100, 10]\n     */\n    var overArgs = castRest(function(func, transforms) {\n      transforms = (transforms.length == 1 && isArray(transforms[0]))\n        ? arrayMap(transforms[0], baseUnary(getIteratee()))\n        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n      var funcsLength = transforms.length;\n      return baseRest(function(args) {\n        var index = -1,\n            length = nativeMin(args.length, funcsLength);\n\n        while (++index < length) {\n          args[index] = transforms[index].call(this, args[index]);\n        }\n        return apply(func, this, args);\n      });\n    });\n\n    /**\n     * Creates a function that invokes `func` with `partials` prepended to the\n     * arguments it receives. This method is like `_.bind` except it does **not**\n     * alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.2.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // Partially applied with placeholders.\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n    var partial = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partial));\n      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to the arguments it receives.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // Partially applied with placeholders.\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n    var partialRight = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partialRight));\n      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified `indexes` where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, [2, 0, 1]);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     */\n    var rearg = flatRest(function(func, indexes) {\n      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * created function and arguments from `start` and beyond provided as\n     * an array.\n     *\n     * **Note:** This method is based on the\n     * [rest parameter](https://mdn.io/rest_parameters).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.rest(function(what, names) {\n     *   return what + ' ' + _.initial(names).join(', ') +\n     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n     * });\n     *\n     * say('hello', 'fred', 'barney', 'pebbles');\n     * // => 'hello fred, barney, & pebbles'\n     */\n    function rest(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start === undefined ? start : toInteger(start);\n      return baseRest(func, start);\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * create function and an array of arguments much like\n     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n     *\n     * **Note:** This method is based on the\n     * [spread operator](https://mdn.io/spread_operator).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Function\n     * @param {Function} func The function to spread arguments over.\n     * @param {number} [start=0] The start position of the spread.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.spread(function(who, what) {\n     *   return who + ' says ' + what;\n     * });\n     *\n     * say(['fred', 'hello']);\n     * // => 'fred says hello'\n     *\n     * var numbers = Promise.all([\n     *   Promise.resolve(40),\n     *   Promise.resolve(36)\n     * ]);\n     *\n     * numbers.then(_.spread(function(x, y) {\n     *   return x + y;\n     * }));\n     * // => a Promise of 76\n     */\n    function spread(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start == null ? 0 : nativeMax(toInteger(start), 0);\n      return baseRest(function(args) {\n        var array = args[start],\n            otherArgs = castSlice(args, 0, start);\n\n        if (array) {\n          arrayPush(otherArgs, array);\n        }\n        return apply(func, this, otherArgs);\n      });\n    }\n\n    /**\n     * Creates a throttled function that only invokes `func` at most once per\n     * every `wait` milliseconds. The throttled function comes with a `cancel`\n     * method to cancel delayed `func` invocations and a `flush` method to\n     * immediately invoke them. Provide `options` to indicate whether `func`\n     * should be invoked on the leading and/or trailing edge of the `wait`\n     * timeout. The `func` is invoked with the last arguments provided to the\n     * throttled function. Subsequent calls to the throttled function return the\n     * result of the last `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the throttled function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to throttle.\n     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=true]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // Avoid excessively updating the position while scrolling.\n     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n     *\n     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n     * jQuery(element).on('click', throttled);\n     *\n     * // Cancel the trailing throttled invocation.\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (isObject(options)) {\n        leading = 'leading' in options ? !!options.leading : leading;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n      return debounce(func, wait, {\n        'leading': leading,\n        'maxWait': wait,\n        'trailing': trailing\n      });\n    }\n\n    /**\n     * Creates a function that accepts up to one argument, ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.unary(parseInt));\n     * // => [6, 8, 10]\n     */\n    function unary(func) {\n      return ary(func, 1);\n    }\n\n    /**\n     * Creates a function that provides `value` to `wrapper` as its first\n     * argument. Any additional arguments provided to the function are appended\n     * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n     * binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} [wrapper=identity] The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '<\/p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles<\/p>'\n     */\n    function wrap(value, wrapper) {\n      return partial(castFunction(wrapper), value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Casts `value` as an array if it's not one.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Lang\n     * @param {*} value The value to inspect.\n     * @returns {Array} Returns the cast array.\n     * @example\n     *\n     * _.castArray(1);\n     * // => [1]\n     *\n     * _.castArray({ 'a': 1 });\n     * // => [{ 'a': 1 }]\n     *\n     * _.castArray('abc');\n     * // => ['abc']\n     *\n     * _.castArray(null);\n     * // => [null]\n     *\n     * _.castArray(undefined);\n     * // => [undefined]\n     *\n     * _.castArray();\n     * // => []\n     *\n     * var array = [1, 2, 3];\n     * console.log(_.castArray(array) === array);\n     * // => true\n     */\n    function castArray() {\n      if (!arguments.length) {\n        return [];\n      }\n      var value = arguments[0];\n      return isArray(value) ? value : [value];\n    }\n\n    /**\n     * Creates a shallow clone of `value`.\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n     * and supports cloning arrays, array buffers, booleans, date objects, maps,\n     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n     * arrays. The own enumerable properties of `arguments` objects are cloned\n     * as plain objects. An empty object is returned for uncloneable values such\n     * as error objects, functions, DOM nodes, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeep\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var shallow = _.clone(objects);\n     * console.log(shallow[0] === objects[0]);\n     * // => true\n     */\n    function clone(value) {\n      return baseClone(value, CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.clone` except that it accepts `customizer` which\n     * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n     * cloning is handled by the method instead. The `customizer` is invoked with\n     * up to four arguments; (value [, index|key, object, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeepWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(false);\n     *   }\n     * }\n     *\n     * var el = _.cloneWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 0\n     */\n    function cloneWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * This method is like `_.clone` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.clone\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var deep = _.cloneDeep(objects);\n     * console.log(deep[0] === objects[0]);\n     * // => false\n     */\n    function cloneDeep(value) {\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.cloneWith` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.cloneWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(true);\n     *   }\n     * }\n     *\n     * var el = _.cloneDeepWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 20\n     */\n    function cloneDeepWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * Checks if `object` conforms to `source` by invoking the predicate\n     * properties of `source` with the corresponding property values of `object`.\n     *\n     * **Note:** This method is equivalent to `_.conforms` when `source` is\n     * partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n     * // => true\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n     * // => false\n     */\n    function conformsTo(object, source) {\n      return source == null || baseConformsTo(object, source, keys(source));\n    }\n\n    /**\n     * Performs a\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * comparison between two values to determine if they are equivalent.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.eq(object, object);\n     * // => true\n     *\n     * _.eq(object, other);\n     * // => false\n     *\n     * _.eq('a', 'a');\n     * // => true\n     *\n     * _.eq('a', Object('a'));\n     * // => false\n     *\n     * _.eq(NaN, NaN);\n     * // => true\n     */\n    function eq(value, other) {\n      return value === other || (value !== value && other !== other);\n    }\n\n    /**\n     * Checks if `value` is greater than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     * @see _.lt\n     * @example\n     *\n     * _.gt(3, 1);\n     * // => true\n     *\n     * _.gt(3, 3);\n     * // => false\n     *\n     * _.gt(1, 3);\n     * // => false\n     */\n    var gt = createRelationalOperation(baseGt);\n\n    /**\n     * Checks if `value` is greater than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than or equal to\n     *  `other`, else `false`.\n     * @see _.lte\n     * @example\n     *\n     * _.gte(3, 1);\n     * // => true\n     *\n     * _.gte(3, 3);\n     * // => true\n     *\n     * _.gte(1, 3);\n     * // => false\n     */\n    var gte = createRelationalOperation(function(value, other) {\n      return value >= other;\n    });\n\n    /**\n     * Checks if `value` is likely an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n        !propertyIsEnumerable.call(value, 'callee');\n    };\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(document.body.children);\n     * // => false\n     *\n     * _.isArray('abc');\n     * // => false\n     *\n     * _.isArray(_.noop);\n     * // => false\n     */\n    var isArray = Array.isArray;\n\n    /**\n     * Checks if `value` is classified as an `ArrayBuffer` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     * @example\n     *\n     * _.isArrayBuffer(new ArrayBuffer(2));\n     * // => true\n     *\n     * _.isArrayBuffer(new Array(2));\n     * // => false\n     */\n    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n    /**\n     * Checks if `value` is array-like. A value is considered array-like if it's\n     * not a function and has a `value.length` that's an integer greater than or\n     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n     * @example\n     *\n     * _.isArrayLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLike(document.body.children);\n     * // => true\n     *\n     * _.isArrayLike('abc');\n     * // => true\n     *\n     * _.isArrayLike(_.noop);\n     * // => false\n     */\n    function isArrayLike(value) {\n      return value != null && isLength(value.length) && !isFunction(value);\n    }\n\n    /**\n     * This method is like `_.isArrayLike` except that it also checks if `value`\n     * is an object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array-like object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArrayLikeObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLikeObject(document.body.children);\n     * // => true\n     *\n     * _.isArrayLikeObject('abc');\n     * // => false\n     *\n     * _.isArrayLikeObject(_.noop);\n     * // => false\n     */\n    function isArrayLikeObject(value) {\n      return isObjectLike(value) && isArrayLike(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        (isObjectLike(value) && baseGetTag(value) == boolTag);\n    }\n\n    /**\n     * Checks if `value` is a buffer.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n     * @example\n     *\n     * _.isBuffer(new Buffer(2));\n     * // => true\n     *\n     * _.isBuffer(new Uint8Array(2));\n     * // => false\n     */\n    var isBuffer = nativeIsBuffer || stubFalse;\n\n    /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n    /**\n     * Checks if `value` is likely a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n    function isElement(value) {\n      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n    }\n\n    /**\n     * Checks if `value` is an empty object, collection, map, or set.\n     *\n     * Objects are considered empty if they have no own enumerable string keyed\n     * properties.\n     *\n     * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n     * jQuery-like collections are considered empty if they have a `length` of `0`.\n     * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n    function isEmpty(value) {\n      if (value == null) {\n        return true;\n      }\n      if (isArrayLike(value) &&\n          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n            isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n        return !value.length;\n      }\n      var tag = getTag(value);\n      if (tag == mapTag || tag == setTag) {\n        return !value.size;\n      }\n      if (isPrototype(value)) {\n        return !baseKeys(value).length;\n      }\n      for (var key in value) {\n        if (hasOwnProperty.call(value, key)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent.\n     *\n     * **Note:** This method supports comparing arrays, array buffers, booleans,\n     * date objects, error objects, maps, numbers, `Object` objects, regexes,\n     * sets, strings, symbols, and typed arrays. `Object` objects are compared\n     * by their own, not inherited, enumerable properties. Functions and DOM\n     * nodes are compared by strict equality, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * object === other;\n     * // => false\n     */\n    function isEqual(value, other) {\n      return baseIsEqual(value, other);\n    }\n\n    /**\n     * This method is like `_.isEqual` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with up to\n     * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, othValue) {\n     *   if (isGreeting(objValue) && isGreeting(othValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqualWith(array, other, customizer);\n     * // => true\n     */\n    function isEqualWith(value, other, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      var result = customizer ? customizer(value, other) : undefined;\n      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n    }\n\n    /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n    function isError(value) {\n      if (!isObjectLike(value)) {\n        return false;\n      }\n      var tag = baseGetTag(value);\n      return tag == errorTag || tag == domExcTag ||\n        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n    }\n\n    /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on\n     * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(3);\n     * // => true\n     *\n     * _.isFinite(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     *\n     * _.isFinite('3');\n     * // => false\n     */\n    function isFinite(value) {\n      return typeof value == 'number' && nativeIsFinite(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    function isFunction(value) {\n      if (!isObject(value)) {\n        return false;\n      }\n      // The use of `Object#toString` avoids issues with the `typeof` operator\n      // in Safari 9 which returns 'object' for typed arrays and other constructors.\n      var tag = baseGetTag(value);\n      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n    }\n\n    /**\n     * Checks if `value` is an integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n     * @example\n     *\n     * _.isInteger(3);\n     * // => true\n     *\n     * _.isInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isInteger(Infinity);\n     * // => false\n     *\n     * _.isInteger('3');\n     * // => false\n     */\n    function isInteger(value) {\n      return typeof value == 'number' && value == toInteger(value);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     * @example\n     *\n     * _.isLength(3);\n     * // => true\n     *\n     * _.isLength(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isLength(Infinity);\n     * // => false\n     *\n     * _.isLength('3');\n     * // => false\n     */\n    function isLength(value) {\n      return typeof value == 'number' &&\n        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is the\n     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(_.noop);\n     * // => true\n     *\n     * _.isObject(null);\n     * // => false\n     */\n    function isObject(value) {\n      var type = typeof value;\n      return value != null && (type == 'object' || type == 'function');\n    }\n\n    /**\n     * Checks if `value` is object-like. A value is object-like if it's not `null`\n     * and has a `typeof` result of \"object\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n     * @example\n     *\n     * _.isObjectLike({});\n     * // => true\n     *\n     * _.isObjectLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isObjectLike(_.noop);\n     * // => false\n     *\n     * _.isObjectLike(null);\n     * // => false\n     */\n    function isObjectLike(value) {\n      return value != null && typeof value == 'object';\n    }\n\n    /**\n     * Checks if `value` is classified as a `Map` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     * @example\n     *\n     * _.isMap(new Map);\n     * // => true\n     *\n     * _.isMap(new WeakMap);\n     * // => false\n     */\n    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n    /**\n     * Performs a partial deep comparison between `object` and `source` to\n     * determine if `object` contains equivalent property values.\n     *\n     * **Note:** This method is equivalent to `_.matches` when `source` is\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.isMatch(object, { 'b': 2 });\n     * // => true\n     *\n     * _.isMatch(object, { 'b': 1 });\n     * // => false\n     */\n    function isMatch(object, source) {\n      return object === source || baseIsMatch(object, source, getMatchData(source));\n    }\n\n    /**\n     * This method is like `_.isMatch` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with five\n     * arguments: (objValue, srcValue, index|key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (isGreeting(objValue) && isGreeting(srcValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatchWith(object, source, customizer);\n     * // => true\n     */\n    function isMatchWith(object, source, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseIsMatch(object, source, getMatchData(source), customizer);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is based on\n     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n     * `undefined` and other non-number values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // An `NaN` primitive is the only value that is not equal to itself.\n      // Perform the `toStringTag` check first to avoid errors with some\n      // ActiveX objects in IE.\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is a pristine native function.\n     *\n     * **Note:** This method can't reliably detect native functions in the presence\n     * of the core-js package because core-js circumvents this kind of detection.\n     * Despite multiple requests, the core-js maintainer has made it clear: any\n     * attempt to fix the detection will be obstructed. As a result, we're left\n     * with little choice but to throw an error. Unfortunately, this also affects\n     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n     * which rely on core-js.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n    function isNative(value) {\n      if (isMaskable(value)) {\n        throw new Error(CORE_ERROR_TEXT);\n      }\n      return baseIsNative(value);\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is `null` or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n     * @example\n     *\n     * _.isNil(null);\n     * // => true\n     *\n     * _.isNil(void 0);\n     * // => true\n     *\n     * _.isNil(NaN);\n     * // => false\n     */\n    function isNil(value) {\n      return value == null;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n     * classified as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(3);\n     * // => true\n     *\n     * _.isNumber(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isNumber(Infinity);\n     * // => true\n     *\n     * _.isNumber('3');\n     * // => false\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        (isObjectLike(value) && baseGetTag(value) == numberTag);\n    }\n\n    /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.8.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n    function isPlainObject(value) {\n      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n        return false;\n      }\n      var proto = getPrototype(value);\n      if (proto === null) {\n        return true;\n      }\n      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n      return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n        funcToString.call(Ctor) == objectCtorString;\n    }\n\n    /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n    /**\n     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n     * double precision number which isn't the result of a rounded unsafe integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n     * @example\n     *\n     * _.isSafeInteger(3);\n     * // => true\n     *\n     * _.isSafeInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isSafeInteger(Infinity);\n     * // => false\n     *\n     * _.isSafeInteger('3');\n     * // => false\n     */\n    function isSafeInteger(value) {\n      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Set` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     * @example\n     *\n     * _.isSet(new Set);\n     * // => true\n     *\n     * _.isSet(new WeakSet);\n     * // => false\n     */\n    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Symbol` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n     * @example\n     *\n     * _.isSymbol(Symbol.iterator);\n     * // => true\n     *\n     * _.isSymbol('abc');\n     * // => false\n     */\n    function isSymbol(value) {\n      return typeof value == 'symbol' ||\n        (isObjectLike(value) && baseGetTag(value) == symbolTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n      return value === undefined;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakMap` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n     * @example\n     *\n     * _.isWeakMap(new WeakMap);\n     * // => true\n     *\n     * _.isWeakMap(new Map);\n     * // => false\n     */\n    function isWeakMap(value) {\n      return isObjectLike(value) && getTag(value) == weakMapTag;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakSet` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n     * @example\n     *\n     * _.isWeakSet(new WeakSet);\n     * // => true\n     *\n     * _.isWeakSet(new Set);\n     * // => false\n     */\n    function isWeakSet(value) {\n      return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n    }\n\n    /**\n     * Checks if `value` is less than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     * @see _.gt\n     * @example\n     *\n     * _.lt(1, 3);\n     * // => true\n     *\n     * _.lt(3, 3);\n     * // => false\n     *\n     * _.lt(3, 1);\n     * // => false\n     */\n    var lt = createRelationalOperation(baseLt);\n\n    /**\n     * Checks if `value` is less than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than or equal to\n     *  `other`, else `false`.\n     * @see _.gte\n     * @example\n     *\n     * _.lte(1, 3);\n     * // => true\n     *\n     * _.lte(3, 3);\n     * // => true\n     *\n     * _.lte(3, 1);\n     * // => false\n     */\n    var lte = createRelationalOperation(function(value, other) {\n      return value <= other;\n    });\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * _.toArray({ 'a': 1, 'b': 2 });\n     * // => [1, 2]\n     *\n     * _.toArray('abc');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toArray(1);\n     * // => []\n     *\n     * _.toArray(null);\n     * // => []\n     */\n    function toArray(value) {\n      if (!value) {\n        return [];\n      }\n      if (isArrayLike(value)) {\n        return isString(value) ? stringToArray(value) : copyArray(value);\n      }\n      if (symIterator && value[symIterator]) {\n        return iteratorToArray(value[symIterator]());\n      }\n      var tag = getTag(value),\n          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n      return func(value);\n    }\n\n    /**\n     * Converts `value` to a finite number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.12.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted number.\n     * @example\n     *\n     * _.toFinite(3.2);\n     * // => 3.2\n     *\n     * _.toFinite(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toFinite(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toFinite('3.2');\n     * // => 3.2\n     */\n    function toFinite(value) {\n      if (!value) {\n        return value === 0 ? value : 0;\n      }\n      value = toNumber(value);\n      if (value === INFINITY || value === -INFINITY) {\n        var sign = (value < 0 ? -1 : 1);\n        return sign * MAX_INTEGER;\n      }\n      return value === value ? value : 0;\n    }\n\n    /**\n     * Converts `value` to an integer.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toInteger(3.2);\n     * // => 3\n     *\n     * _.toInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toInteger(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toInteger('3.2');\n     * // => 3\n     */\n    function toInteger(value) {\n      var result = toFinite(value),\n          remainder = result % 1;\n\n      return result === result ? (remainder ? result - remainder : result) : 0;\n    }\n\n    /**\n     * Converts `value` to an integer suitable for use as the length of an\n     * array-like object.\n     *\n     * **Note:** This method is based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toLength(3.2);\n     * // => 3\n     *\n     * _.toLength(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toLength(Infinity);\n     * // => 4294967295\n     *\n     * _.toLength('3.2');\n     * // => 3\n     */\n    function toLength(value) {\n      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n    }\n\n    /**\n     * Converts `value` to a number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     * @example\n     *\n     * _.toNumber(3.2);\n     * // => 3.2\n     *\n     * _.toNumber(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toNumber(Infinity);\n     * // => Infinity\n     *\n     * _.toNumber('3.2');\n     * // => 3.2\n     */\n    function toNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      if (isObject(value)) {\n        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n        value = isObject(other) ? (other + '') : other;\n      }\n      if (typeof value != 'string') {\n        return value === 0 ? value : +value;\n      }\n      value = baseTrim(value);\n      var isBinary = reIsBinary.test(value);\n      return (isBinary || reIsOctal.test(value))\n        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n        : (reIsBadHex.test(value) ? NAN : +value);\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable string\n     * keyed properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n      return copyObject(value, keysIn(value));\n    }\n\n    /**\n     * Converts `value` to a safe integer. A safe integer can be compared and\n     * represented correctly.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toSafeInteger(3.2);\n     * // => 3\n     *\n     * _.toSafeInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toSafeInteger(Infinity);\n     * // => 9007199254740991\n     *\n     * _.toSafeInteger('3.2');\n     * // => 3\n     */\n    function toSafeInteger(value) {\n      return value\n        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n        : (value === 0 ? value : 0);\n    }\n\n    /**\n     * Converts `value` to a string. An empty string is returned for `null`\n     * and `undefined` values. The sign of `-0` is preserved.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.toString(null);\n     * // => ''\n     *\n     * _.toString(-0);\n     * // => '-0'\n     *\n     * _.toString([1, 2, 3]);\n     * // => '1,2,3'\n     */\n    function toString(value) {\n      return value == null ? '' : baseToString(value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable string keyed properties of source objects to the\n     * destination object. Source objects are applied from left to right.\n     * Subsequent sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object` and is loosely based on\n     * [`Object.assign`](https://mdn.io/Object/assign).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assignIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assign({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var assign = createAssigner(function(object, source) {\n      if (isPrototype(source) || isArrayLike(source)) {\n        copyObject(source, keys(source), object);\n        return;\n      }\n      for (var key in source) {\n        if (hasOwnProperty.call(source, key)) {\n          assignValue(object, key, source[key]);\n        }\n      }\n    });\n\n    /**\n     * This method is like `_.assign` except that it iterates over own and\n     * inherited source properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assign\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n     */\n    var assignIn = createAssigner(function(object, source) {\n      copyObject(source, keysIn(source), object);\n    });\n\n    /**\n     * This method is like `_.assignIn` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extendWith\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignInWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keysIn(source), object, customizer);\n    });\n\n    /**\n     * This method is like `_.assign` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignInWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keys(source), object, customizer);\n    });\n\n    /**\n     * Creates an array of values corresponding to `paths` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Array} Returns the picked values.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _.at(object, ['a[0].b.c', 'a[1]']);\n     * // => [3, 4]\n     */\n    var at = flatRest(baseAt);\n\n    /**\n     * Creates an object that inherits from the `prototype` object. If a\n     * `properties` object is given, its own enumerable string keyed properties\n     * are assigned to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, {\n     *   'constructor': Circle\n     * });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties == null ? result : baseAssign(result, properties);\n    }\n\n    /**\n     * Assigns own and inherited enumerable string keyed properties of source\n     * objects to the destination object for all destination properties that\n     * resolve to `undefined`. Source objects are applied from left to right.\n     * Once a property is set, additional values of the same property are ignored.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaultsDeep\n     * @example\n     *\n     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var defaults = baseRest(function(object, sources) {\n      object = Object(object);\n\n      var index = -1;\n      var length = sources.length;\n      var guard = length > 2 ? sources[2] : undefined;\n\n      if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n        length = 1;\n      }\n\n      while (++index < length) {\n        var source = sources[index];\n        var props = keysIn(source);\n        var propsIndex = -1;\n        var propsLength = props.length;\n\n        while (++propsIndex < propsLength) {\n          var key = props[propsIndex];\n          var value = object[key];\n\n          if (value === undefined ||\n              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n            object[key] = source[key];\n          }\n        }\n      }\n\n      return object;\n    });\n\n    /**\n     * This method is like `_.defaults` except that it recursively assigns\n     * default properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaults\n     * @example\n     *\n     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n     * // => { 'a': { 'b': 2, 'c': 3 } }\n     */\n    var defaultsDeep = baseRest(function(args) {\n      args.push(undefined, customDefaultsMerge);\n      return apply(mergeWith, undefined, args);\n    });\n\n    /**\n     * This method is like `_.find` except that it returns the key of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(o) { return o.age < 40; });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findKey(users, { 'age': 1, 'active': true });\n     * // => 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n    function findKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(o) { return o.age < 40; });\n     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastKey(users, { 'age': 36, 'active': true });\n     * // => 'barney'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n    }\n\n    /**\n     * Iterates over own and inherited enumerable string keyed properties of an\n     * object and invokes `iteratee` for each property. The iteratee is invoked\n     * with three arguments: (value, key, object). Iteratee functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forInRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n     */\n    function forIn(object, iteratee) {\n      return object == null\n        ? object\n        : baseFor(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n     */\n    function forInRight(object, iteratee) {\n      return object == null\n        ? object\n        : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * Iterates over own enumerable string keyed properties of an object and\n     * invokes `iteratee` for each property. The iteratee is invoked with three\n     * arguments: (value, key, object). Iteratee functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwnRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forOwn(object, iteratee) {\n      return object && baseForOwn(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwnRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n     */\n    function forOwnRight(object, iteratee) {\n      return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an array of function property names from own enumerable properties\n     * of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functionsIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functions(new Foo);\n     * // => ['a', 'b']\n     */\n    function functions(object) {\n      return object == null ? [] : baseFunctions(object, keys(object));\n    }\n\n    /**\n     * Creates an array of function property names from own and inherited\n     * enumerable properties of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functions\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functionsIn(new Foo);\n     * // => ['a', 'b', 'c']\n     */\n    function functionsIn(object) {\n      return object == null ? [] : baseFunctions(object, keysIn(object));\n    }\n\n    /**\n     * Gets the value at `path` of `object`. If the resolved value is\n     * `undefined`, the `defaultValue` is returned in its place.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.get(object, 'a[0].b.c');\n     * // => 3\n     *\n     * _.get(object, ['a', '0', 'b', 'c']);\n     * // => 3\n     *\n     * _.get(object, 'a.b.c', 'default');\n     * // => 'default'\n     */\n    function get(object, path, defaultValue) {\n      var result = object == null ? undefined : baseGet(object, path);\n      return result === undefined ? defaultValue : result;\n    }\n\n    /**\n     * Checks if `path` is a direct property of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = { 'a': { 'b': 2 } };\n     * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.has(object, 'a');\n     * // => true\n     *\n     * _.has(object, 'a.b');\n     * // => true\n     *\n     * _.has(object, ['a', 'b']);\n     * // => true\n     *\n     * _.has(other, 'a');\n     * // => false\n     */\n    function has(object, path) {\n      return object != null && hasPath(object, path, baseHas);\n    }\n\n    /**\n     * Checks if `path` is a direct or inherited property of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.hasIn(object, 'a');\n     * // => true\n     *\n     * _.hasIn(object, 'a.b');\n     * // => true\n     *\n     * _.hasIn(object, ['a', 'b']);\n     * // => true\n     *\n     * _.hasIn(object, 'b');\n     * // => false\n     */\n    function hasIn(object, path) {\n      return object != null && hasPath(object, path, baseHasIn);\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite\n     * property assignments of previous values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invert(object);\n     * // => { '1': 'c', '2': 'b' }\n     */\n    var invert = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      result[value] = key;\n    }, constant(identity));\n\n    /**\n     * This method is like `_.invert` except that the inverted object is generated\n     * from the results of running each element of `object` thru `iteratee`. The\n     * corresponding inverted value of each inverted key is an array of keys\n     * responsible for generating the inverted value. The iteratee is invoked\n     * with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invertBy(object);\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     *\n     * _.invertBy(object, function(value) {\n     *   return 'group' + value;\n     * });\n     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n     */\n    var invertBy = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      if (hasOwnProperty.call(result, value)) {\n        result[value].push(key);\n      } else {\n        result[value] = [key];\n      }\n    }, getIteratee);\n\n    /**\n     * Invokes the method at `path` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n     *\n     * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n     * // => [2, 3]\n     */\n    var invoke = baseRest(baseInvoke);\n\n    /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n    function keys(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n    function keysIn(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n    }\n\n    /**\n     * The opposite of `_.mapValues`; this method creates an object with the\n     * same values as `object` and keys generated by running each own enumerable\n     * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n     * with three arguments: (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapValues\n     * @example\n     *\n     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   return key + value;\n     * });\n     * // => { 'a1': 1, 'b2': 2 }\n     */\n    function mapKeys(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, iteratee(value, key, object), value);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated\n     * by running each own enumerable string keyed property of `object` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapKeys\n     * @example\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * _.mapValues(users, function(o) { return o.age; });\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n    function mapValues(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, key, iteratee(value, key, object));\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.assign` except that it recursively merges own and\n     * inherited enumerable string keyed properties of source objects into the\n     * destination object. Source properties that resolve to `undefined` are\n     * skipped if a destination value exists. Array and plain object properties\n     * are merged recursively. Other objects and value types are overridden by\n     * assignment. Source objects are applied from left to right. Subsequent\n     * sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {\n     *   'a': [{ 'b': 2 }, { 'd': 4 }]\n     * };\n     *\n     * var other = {\n     *   'a': [{ 'c': 3 }, { 'e': 5 }]\n     * };\n     *\n     * _.merge(object, other);\n     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n     */\n    var merge = createAssigner(function(object, source, srcIndex) {\n      baseMerge(object, source, srcIndex);\n    });\n\n    /**\n     * This method is like `_.merge` except that it accepts `customizer` which\n     * is invoked to produce the merged values of the destination and source\n     * properties. If `customizer` returns `undefined`, merging is handled by the\n     * method instead. The `customizer` is invoked with six arguments:\n     * (objValue, srcValue, key, object, source, stack).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} customizer The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (_.isArray(objValue)) {\n     *     return objValue.concat(srcValue);\n     *   }\n     * }\n     *\n     * var object = { 'a': [1], 'b': [2] };\n     * var other = { 'a': [3], 'b': [4] };\n     *\n     * _.mergeWith(object, other, customizer);\n     * // => { 'a': [1, 3], 'b': [2, 4] }\n     */\n    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n      baseMerge(object, source, srcIndex, customizer);\n    });\n\n    /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable property paths of `object` that are not omitted.\n     *\n     * **Note:** This method is considerably slower than `_.pick`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to omit.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omit(object, ['a', 'c']);\n     * // => { 'b': '2' }\n     */\n    var omit = flatRest(function(object, paths) {\n      var result = {};\n      if (object == null) {\n        return result;\n      }\n      var isDeep = false;\n      paths = arrayMap(paths, function(path) {\n        path = castPath(path, object);\n        isDeep || (isDeep = path.length > 1);\n        return path;\n      });\n      copyObject(object, getAllKeysIn(object), result);\n      if (isDeep) {\n        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n      }\n      var length = paths.length;\n      while (length--) {\n        baseUnset(result, paths[length]);\n      }\n      return result;\n    });\n\n    /**\n     * The opposite of `_.pickBy`; this method creates an object composed of\n     * the own and inherited enumerable string keyed properties of `object` that\n     * `predicate` doesn't return truthy for. The predicate is invoked with two\n     * arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omitBy(object, _.isNumber);\n     * // => { 'b': '2' }\n     */\n    function omitBy(object, predicate) {\n      return pickBy(object, negate(getIteratee(predicate)));\n    }\n\n    /**\n     * Creates an object composed of the picked `object` properties.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pick(object, ['a', 'c']);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var pick = flatRest(function(object, paths) {\n      return object == null ? {} : basePick(object, paths);\n    });\n\n    /**\n     * Creates an object composed of the `object` properties `predicate` returns\n     * truthy for. The predicate is invoked with two arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pickBy(object, _.isNumber);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    function pickBy(object, predicate) {\n      if (object == null) {\n        return {};\n      }\n      var props = arrayMap(getAllKeysIn(object), function(prop) {\n        return [prop];\n      });\n      predicate = getIteratee(predicate);\n      return basePickBy(object, props, function(value, path) {\n        return predicate(value, path[0]);\n      });\n    }\n\n    /**\n     * This method is like `_.get` except that if the resolved value is a\n     * function it's invoked with the `this` binding of its parent object and\n     * its result is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to resolve.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n     *\n     * _.result(object, 'a[0].b.c1');\n     * // => 3\n     *\n     * _.result(object, 'a[0].b.c2');\n     * // => 4\n     *\n     * _.result(object, 'a[0].b.c3', 'default');\n     * // => 'default'\n     *\n     * _.result(object, 'a[0].b.c3', _.constant('default'));\n     * // => 'default'\n     */\n    function result(object, path, defaultValue) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length;\n\n      // Ensure the loop is entered when path is empty.\n      if (!length) {\n        length = 1;\n        object = undefined;\n      }\n      while (++index < length) {\n        var value = object == null ? undefined : object[toKey(path[index])];\n        if (value === undefined) {\n          index = length;\n          value = defaultValue;\n        }\n        object = isFunction(value) ? value.call(object) : value;\n      }\n      return object;\n    }\n\n    /**\n     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n     * it's created. Arrays are created for missing index properties while objects\n     * are created for all other missing properties. Use `_.setWith` to customize\n     * `path` creation.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.set(object, 'a[0].b.c', 4);\n     * console.log(object.a[0].b.c);\n     * // => 4\n     *\n     * _.set(object, ['x', '0', 'y', 'z'], 5);\n     * console.log(object.x[0].y.z);\n     * // => 5\n     */\n    function set(object, path, value) {\n      return object == null ? object : baseSet(object, path, value);\n    }\n\n    /**\n     * This method is like `_.set` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.setWith(object, '[0][1]', 'a', Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function setWith(object, path, value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseSet(object, path, value, customizer);\n    }\n\n    /**\n     * Creates an array of own enumerable string keyed-value pairs for `object`\n     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n     * entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entries\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairs(new Foo);\n     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n     */\n    var toPairs = createToPairs(keys);\n\n    /**\n     * Creates an array of own and inherited enumerable string keyed-value pairs\n     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n     * or set, its entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entriesIn\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairsIn(new Foo);\n     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n     */\n    var toPairsIn = createToPairs(keysIn);\n\n    /**\n     * An alternative to `_.reduce`; this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable string keyed properties thru `iteratee`, with each invocation\n     * potentially mutating the `accumulator` object. If `accumulator` is not\n     * provided, a new object with the same `[[Prototype]]` will be used. The\n     * iteratee is invoked with four arguments: (accumulator, value, key, object).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.transform([2, 3, 4], function(result, n) {\n     *   result.push(n *= n);\n     *   return n % 2 == 0;\n     * }, []);\n     * // => [4, 9]\n     *\n     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     */\n    function transform(object, iteratee, accumulator) {\n      var isArr = isArray(object),\n          isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n      iteratee = getIteratee(iteratee, 4);\n      if (accumulator == null) {\n        var Ctor = object && object.constructor;\n        if (isArrLike) {\n          accumulator = isArr ? new Ctor : [];\n        }\n        else if (isObject(object)) {\n          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n        }\n        else {\n          accumulator = {};\n        }\n      }\n      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n        return iteratee(accumulator, value, index, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * Removes the property at `path` of `object`.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n     * _.unset(object, 'a[0].b.c');\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     *\n     * _.unset(object, ['a', '0', 'b', 'c']);\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     */\n    function unset(object, path) {\n      return object == null ? true : baseUnset(object, path);\n    }\n\n    /**\n     * This method is like `_.set` except that accepts `updater` to produce the\n     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n     * is invoked with one argument: (value).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n     * console.log(object.a[0].b.c);\n     * // => 9\n     *\n     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n     * console.log(object.x[0].y.z);\n     * // => 0\n     */\n    function update(object, path, updater) {\n      return object == null ? object : baseUpdate(object, path, castFunction(updater));\n    }\n\n    /**\n     * This method is like `_.update` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function updateWith(object, path, updater, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n    }\n\n    /**\n     * Creates an array of the own enumerable string keyed property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n    function values(object) {\n      return object == null ? [] : baseValues(object, keys(object));\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable string keyed property\n     * values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n    function valuesIn(object) {\n      return object == null ? [] : baseValues(object, keysIn(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Clamps `number` within the inclusive `lower` and `upper` bounds.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Number\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     * @example\n     *\n     * _.clamp(-10, -5, 5);\n     * // => -5\n     *\n     * _.clamp(10, -5, 5);\n     * // => 5\n     */\n    function clamp(number, lower, upper) {\n      if (upper === undefined) {\n        upper = lower;\n        lower = undefined;\n      }\n      if (upper !== undefined) {\n        upper = toNumber(upper);\n        upper = upper === upper ? upper : 0;\n      }\n      if (lower !== undefined) {\n        lower = toNumber(lower);\n        lower = lower === lower ? lower : 0;\n      }\n      return baseClamp(toNumber(number), lower, upper);\n    }\n\n    /**\n     * Checks if `n` is between `start` and up to, but not including, `end`. If\n     * `end` is not specified, it's set to `start` with `start` then set to `0`.\n     * If `start` is greater than `end` the params are swapped to support\n     * negative ranges.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.3.0\n     * @category Number\n     * @param {number} number The number to check.\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     * @see _.range, _.rangeRight\n     * @example\n     *\n     * _.inRange(3, 2, 4);\n     * // => true\n     *\n     * _.inRange(4, 8);\n     * // => true\n     *\n     * _.inRange(4, 2);\n     * // => false\n     *\n     * _.inRange(2, 2);\n     * // => false\n     *\n     * _.inRange(1.2, 2);\n     * // => true\n     *\n     * _.inRange(5.2, 4);\n     * // => false\n     *\n     * _.inRange(-3, -2, -6);\n     * // => true\n     */\n    function inRange(number, start, end) {\n      start = toFinite(start);\n      if (end === undefined) {\n        end = start;\n        start = 0;\n      } else {\n        end = toFinite(end);\n      }\n      number = toNumber(number);\n      return baseInRange(number, start, end);\n    }\n\n    /**\n     * Produces a random number between the inclusive `lower` and `upper` bounds.\n     * If only one argument is provided a number between `0` and the given number\n     * is returned. If `floating` is `true`, or either `lower` or `upper` are\n     * floats, a floating-point number is returned instead of an integer.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Number\n     * @param {number} [lower=0] The lower bound.\n     * @param {number} [upper=1] The upper bound.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(lower, upper, floating) {\n      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n        upper = floating = undefined;\n      }\n      if (floating === undefined) {\n        if (typeof upper == 'boolean') {\n          floating = upper;\n          upper = undefined;\n        }\n        else if (typeof lower == 'boolean') {\n          floating = lower;\n          lower = undefined;\n        }\n      }\n      if (lower === undefined && upper === undefined) {\n        lower = 0;\n        upper = 1;\n      }\n      else {\n        lower = toFinite(lower);\n        if (upper === undefined) {\n          upper = lower;\n          lower = 0;\n        } else {\n          upper = toFinite(upper);\n        }\n      }\n      if (lower > upper) {\n        var temp = lower;\n        lower = upper;\n        upper = temp;\n      }\n      if (floating || lower % 1 || upper % 1) {\n        var rand = nativeRandom();\n        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n      }\n      return baseRandom(lower, upper);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar--');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__FOO_BAR__');\n     * // => 'fooBar'\n     */\n    var camelCase = createCompounder(function(result, word, index) {\n      word = word.toLowerCase();\n      return result + (index ? capitalize(word) : word);\n    });\n\n    /**\n     * Converts the first character of `string` to upper case and the remaining\n     * to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('FRED');\n     * // => 'Fred'\n     */\n    function capitalize(string) {\n      return upperFirst(toString(string).toLowerCase());\n    }\n\n    /**\n     * Deburrs `string` by converting\n     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n     * letters to basic Latin letters and removing\n     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to deburr.\n     * @returns {string} Returns the deburred string.\n     * @example\n     *\n     * _.deburr('déjà vu');\n     * // => 'deja vu'\n     */\n    function deburr(string) {\n      string = toString(string);\n      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n    }\n\n    /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search up to.\n     * @returns {boolean} Returns `true` if `string` ends with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n    function endsWith(string, target, position) {\n      string = toString(string);\n      target = baseToString(target);\n\n      var length = string.length;\n      position = position === undefined\n        ? length\n        : baseClamp(toInteger(position), 0, length);\n\n      var end = position;\n      position -= target.length;\n      return position >= 0 && string.slice(position, end) == target;\n    }\n\n    /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n     * corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional\n     * characters use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value. See\n     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * When working with HTML you should always\n     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n     * XSS vectors.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n    function escape(string) {\n      string = toString(string);\n      return (string && reHasUnescapedHtml.test(string))\n        ? string.replace(reUnescapedHtml, escapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n     * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escapeRegExp('[lodash](https://lodash.com/)');\n     * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n     */\n    function escapeRegExp(string) {\n      string = toString(string);\n      return (string && reHasRegExpChar.test(string))\n        ? string.replace(reRegExpChar, '\\\\$&')\n        : string;\n    }\n\n    /**\n     * Converts `string` to\n     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__FOO_BAR__');\n     * // => 'foo-bar'\n     */\n    var kebabCase = createCompounder(function(result, word, index) {\n      return result + (index ? '-' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts `string`, as space separated words, to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.lowerCase('--Foo-Bar--');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('fooBar');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('__FOO_BAR__');\n     * // => 'foo bar'\n     */\n    var lowerCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts the first character of `string` to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.lowerFirst('Fred');\n     * // => 'fred'\n     *\n     * _.lowerFirst('FRED');\n     * // => 'fRED'\n     */\n    var lowerFirst = createCaseFirst('toLowerCase');\n\n    /**\n     * Pads `string` on the left and right sides if it's shorter than `length`.\n     * Padding characters are truncated if they can't be evenly divided by `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n    function pad(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      if (!length || strLength >= length) {\n        return string;\n      }\n      var mid = (length - strLength) / 2;\n      return (\n        createPadding(nativeFloor(mid), chars) +\n        string +\n        createPadding(nativeCeil(mid), chars)\n      );\n    }\n\n    /**\n     * Pads `string` on the right side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padEnd('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padEnd('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padEnd('abc', 3);\n     * // => 'abc'\n     */\n    function padEnd(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (string + createPadding(length - strLength, chars))\n        : string;\n    }\n\n    /**\n     * Pads `string` on the left side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padStart('abc', 6);\n     * // => '   abc'\n     *\n     * _.padStart('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padStart('abc', 3);\n     * // => 'abc'\n     */\n    function padStart(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (createPadding(length - strLength, chars) + string)\n        : string;\n    }\n\n    /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n     * hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the\n     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix=10] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n    function parseInt(string, radix, guard) {\n      if (guard || radix == null) {\n        radix = 0;\n      } else if (radix) {\n        radix = +radix;\n      }\n      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n    }\n\n    /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=1] The number of times to repeat the string.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n    function repeat(string, n, guard) {\n      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      return baseRepeat(toString(string), n);\n    }\n\n    /**\n     * Replaces matches for `pattern` in `string` with `replacement`.\n     *\n     * **Note:** This method is based on\n     * [`String#replace`](https://mdn.io/String/replace).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to modify.\n     * @param {RegExp|string} pattern The pattern to replace.\n     * @param {Function|string} replacement The match replacement.\n     * @returns {string} Returns the modified string.\n     * @example\n     *\n     * _.replace('Hi Fred', 'Fred', 'Barney');\n     * // => 'Hi Barney'\n     */\n    function replace() {\n      var args = arguments,\n          string = toString(args[0]);\n\n      return args.length < 3 ? string : string.replace(args[1], args[2]);\n    }\n\n    /**\n     * Converts `string` to\n     * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--FOO-BAR--');\n     * // => 'foo_bar'\n     */\n    var snakeCase = createCompounder(function(result, word, index) {\n      return result + (index ? '_' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Splits `string` by `separator`.\n     *\n     * **Note:** This method is based on\n     * [`String#split`](https://mdn.io/String/split).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to split.\n     * @param {RegExp|string} separator The separator pattern to split by.\n     * @param {number} [limit] The length to truncate results to.\n     * @returns {Array} Returns the string segments.\n     * @example\n     *\n     * _.split('a-b-c', '-', 2);\n     * // => ['a', 'b']\n     */\n    function split(string, separator, limit) {\n      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n        separator = limit = undefined;\n      }\n      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n      if (!limit) {\n        return [];\n      }\n      string = toString(string);\n      if (string && (\n            typeof separator == 'string' ||\n            (separator != null && !isRegExp(separator))\n          )) {\n        separator = baseToString(separator);\n        if (!separator && hasUnicode(string)) {\n          return castSlice(stringToArray(string), 0, limit);\n        }\n      }\n      return string.split(separator, limit);\n    }\n\n    /**\n     * Converts `string` to\n     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.1.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the start cased string.\n     * @example\n     *\n     * _.startCase('--foo-bar--');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('fooBar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('__FOO_BAR__');\n     * // => 'FOO BAR'\n     */\n    var startCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + upperFirst(word);\n    });\n\n    /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n    function startsWith(string, target, position) {\n      string = toString(string);\n      position = position == null\n        ? 0\n        : baseClamp(toInteger(position), 0, string.length);\n\n      target = baseToString(target);\n      return string.slice(position, position + target.length) == target;\n    }\n\n    /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is given, it takes precedence over `_.templateSettings` values.\n     *\n     * **Note:** In the development build `_.template` utilizes\n     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for easier debugging.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options={}] The options object.\n     * @param {RegExp} [options.escape=_.templateSettings.escape]\n     *  The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n     *  The \"evaluate\" delimiter.\n     * @param {Object} [options.imports=_.templateSettings.imports]\n     *  An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n     *  The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL='lodash.templateSources[n]']\n     *  The sourceURL of the compiled template.\n     * @param {string} [options.variable='obj']\n     *  The data object variable name.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // Use the \"interpolate\" delimiter to create a compiled template.\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // Use the HTML \"escape\" delimiter to escape data property values.\n     * var compiled = _.template('<b><%- value %><\/b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;<\/b>'\n     *\n     * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %><\/li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred<\/li><li>barney<\/li>'\n     *\n     * // Use the internal `print` function in \"evaluate\" delimiters.\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n     * // Disable support by replacing the \"interpolate\" delimiter.\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // Use backslashes to treat delimiters as plain text.\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // Use the `imports` option to import `jQuery` as `jq`.\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %><\/li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred<\/li><li>barney<\/li>'\n     *\n     * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n     *\n     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     * //   var __t, __p = '';\n     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     * //   return __p;\n     * // }\n     *\n     * // Use custom template delimiters.\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // Use the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and stack traces.\n     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(string, options, guard) {\n      // Based on John Resig's `tmpl` implementation\n      // (http://ejohn.org/blog/javascript-micro-templating/)\n      // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n      var settings = lodash.templateSettings;\n\n      if (guard && isIterateeCall(string, options, guard)) {\n        options = undefined;\n      }\n      string = toString(string);\n      options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n          importsKeys = keys(imports),\n          importsValues = baseValues(imports, importsKeys);\n\n      var isEscaping,\n          isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // Compile the regexp to match each delimiter.\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      // Use a sourceURL for easier debugging.\n      // The sourceURL gets injected into the source that's eval-ed, so be careful\n      // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in\n      // and escape the comment, thus injecting code that gets evaled.\n      var sourceURL = '//# sourceURL=' +\n        (hasOwnProperty.call(options, 'sourceURL')\n          ? (options.sourceURL + '').replace(/\\s/g, ' ')\n          : ('lodash.templateSources[' + (++templateCounter) + ']')\n        ) + '\\n';\n\n      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // Escape characters that can't be included in string literals.\n        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // Replace delimiters with snippets.\n        if (escapeValue) {\n          isEscaping = true;\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // The JS engine embedded in Adobe products needs `match` returned in\n        // order to produce the correct `offset` value.\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // If `variable` is not specified wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain.\n      var variable = hasOwnProperty.call(options, 'variable') && options.variable;\n      if (!variable) {\n        source = 'with (obj) {\\n' + source + '\\n}\\n';\n      }\n      // Throw an error if a forbidden character was found in `variable`, to prevent\n      // potential command injection attacks.\n      else if (reForbiddenIdentifierChars.test(variable)) {\n        throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);\n      }\n\n      // Cleanup code by stripping empty strings.\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // Frame code as the function body.\n      source = 'function(' + (variable || 'obj') + ') {\\n' +\n        (variable\n          ? ''\n          : 'obj || (obj = {});\\n'\n        ) +\n        \"var __t, __p = ''\" +\n        (isEscaping\n           ? ', __e = _.escape'\n           : ''\n        ) +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      var result = attempt(function() {\n        return Function(importsKeys, sourceURL + 'return ' + source)\n          .apply(undefined, importsValues);\n      });\n\n      // Provide the compiled function's source by its `toString` method or\n      // the `source` property as a convenience for inlining compiled templates.\n      result.source = source;\n      if (isError(result)) {\n        throw result;\n      }\n      return result;\n    }\n\n    /**\n     * Converts `string`, as a whole, to lower case just like\n     * [String#toLowerCase](https://mdn.io/toLowerCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.toLower('--Foo-Bar--');\n     * // => '--foo-bar--'\n     *\n     * _.toLower('fooBar');\n     * // => 'foobar'\n     *\n     * _.toLower('__FOO_BAR__');\n     * // => '__foo_bar__'\n     */\n    function toLower(value) {\n      return toString(value).toLowerCase();\n    }\n\n    /**\n     * Converts `string`, as a whole, to upper case just like\n     * [String#toUpperCase](https://mdn.io/toUpperCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.toUpper('--foo-bar--');\n     * // => '--FOO-BAR--'\n     *\n     * _.toUpper('fooBar');\n     * // => 'FOOBAR'\n     *\n     * _.toUpper('__foo_bar__');\n     * // => '__FOO_BAR__'\n     */\n    function toUpper(value) {\n      return toString(value).toUpperCase();\n    }\n\n    /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar']\n     */\n    function trim(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return baseTrim(string);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          chrSymbols = stringToArray(chars),\n          start = charsStartIndex(strSymbols, chrSymbols),\n          end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n      return castSlice(strSymbols, start, end).join('');\n    }\n\n    /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimEnd('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimEnd('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n    function trimEnd(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.slice(0, trimmedEndIndex(string) + 1);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n      return castSlice(strSymbols, 0, end).join('');\n    }\n\n    /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimStart('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimStart('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n    function trimStart(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimStart, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          start = charsStartIndex(strSymbols, stringToArray(chars));\n\n      return castSlice(strSymbols, start).join('');\n    }\n\n    /**\n     * Truncates `string` if it's longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object} [options={}] The options object.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.truncate('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': ' '\n     * });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': /,? +/\n     * });\n     * // => 'hi-diddly-ho there...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'omission': ' [...]'\n     * });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n    function truncate(string, options) {\n      var length = DEFAULT_TRUNC_LENGTH,\n          omission = DEFAULT_TRUNC_OMISSION;\n\n      if (isObject(options)) {\n        var separator = 'separator' in options ? options.separator : separator;\n        length = 'length' in options ? toInteger(options.length) : length;\n        omission = 'omission' in options ? baseToString(options.omission) : omission;\n      }\n      string = toString(string);\n\n      var strLength = string.length;\n      if (hasUnicode(string)) {\n        var strSymbols = stringToArray(string);\n        strLength = strSymbols.length;\n      }\n      if (length >= strLength) {\n        return string;\n      }\n      var end = length - stringSize(omission);\n      if (end < 1) {\n        return omission;\n      }\n      var result = strSymbols\n        ? castSlice(strSymbols, 0, end).join('')\n        : string.slice(0, end);\n\n      if (separator === undefined) {\n        return result + omission;\n      }\n      if (strSymbols) {\n        end += (result.length - end);\n      }\n      if (isRegExp(separator)) {\n        if (string.slice(end).search(separator)) {\n          var match,\n              substring = result;\n\n          if (!separator.global) {\n            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n          }\n          separator.lastIndex = 0;\n          while ((match = separator.exec(substring))) {\n            var newEnd = match.index;\n          }\n          result = result.slice(0, newEnd === undefined ? end : newEnd);\n        }\n      } else if (string.indexOf(baseToString(separator), end) != end) {\n        var index = result.lastIndexOf(separator);\n        if (index > -1) {\n          result = result.slice(0, index);\n        }\n      }\n      return result + omission;\n    }\n\n    /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n     * their corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional\n     * HTML entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.6.0\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n    function unescape(string) {\n      string = toString(string);\n      return (string && reHasEscapedHtml.test(string))\n        ? string.replace(reEscapedHtml, unescapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Converts `string`, as space separated words, to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.upperCase('--foo-bar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('fooBar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('__foo_bar__');\n     * // => 'FOO BAR'\n     */\n    var upperCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toUpperCase();\n    });\n\n    /**\n     * Converts the first character of `string` to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.upperFirst('fred');\n     * // => 'Fred'\n     *\n     * _.upperFirst('FRED');\n     * // => 'FRED'\n     */\n    var upperFirst = createCaseFirst('toUpperCase');\n\n    /**\n     * Splits `string` into an array of its words.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {RegExp|string} [pattern] The pattern to match words.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the words of `string`.\n     * @example\n     *\n     * _.words('fred, barney, & pebbles');\n     * // => ['fred', 'barney', 'pebbles']\n     *\n     * _.words('fred, barney, & pebbles', /[^, ]+/g);\n     * // => ['fred', 'barney', '&', 'pebbles']\n     */\n    function words(string, pattern, guard) {\n      string = toString(string);\n      pattern = guard ? undefined : pattern;\n\n      if (pattern === undefined) {\n        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n      }\n      return string.match(pattern) || [];\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Attempts to invoke `func`, returning either the result or the caught error\n     * object. Any additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Function} func The function to attempt.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // Avoid throwing errors for invalid selectors.\n     * var elements = _.attempt(function(selector) {\n     *   return document.querySelectorAll(selector);\n     * }, '>_>');\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n    var attempt = baseRest(function(func, args) {\n      try {\n        return apply(func, undefined, args);\n      } catch (e) {\n        return isError(e) ? e : new Error(e);\n      }\n    });\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method.\n     *\n     * **Note:** This method doesn't set the \"length\" property of bound functions.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} methodNames The object method names to bind.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'click': function() {\n     *     console.log('clicked ' + this.label);\n     *   }\n     * };\n     *\n     * _.bindAll(view, ['click']);\n     * jQuery(element).on('click', view.click);\n     * // => Logs 'clicked docs' when clicked.\n     */\n    var bindAll = flatRest(function(object, methodNames) {\n      arrayEach(methodNames, function(key) {\n        key = toKey(key);\n        baseAssignValue(object, key, bind(object[key], object));\n      });\n      return object;\n    });\n\n    /**\n     * Creates a function that iterates over `pairs` and invokes the corresponding\n     * function of the first predicate to return truthy. The predicate-function\n     * pairs are invoked with the `this` binding and arguments of the created\n     * function.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Array} pairs The predicate-function pairs.\n     * @returns {Function} Returns the new composite function.\n     * @example\n     *\n     * var func = _.cond([\n     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],\n     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n     *   [_.stubTrue,                      _.constant('no match')]\n     * ]);\n     *\n     * func({ 'a': 1, 'b': 2 });\n     * // => 'matches A'\n     *\n     * func({ 'a': 0, 'b': 1 });\n     * // => 'matches B'\n     *\n     * func({ 'a': '1', 'b': '2' });\n     * // => 'no match'\n     */\n    function cond(pairs) {\n      var length = pairs == null ? 0 : pairs.length,\n          toIteratee = getIteratee();\n\n      pairs = !length ? [] : arrayMap(pairs, function(pair) {\n        if (typeof pair[1] != 'function') {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return [toIteratee(pair[0]), pair[1]];\n      });\n\n      return baseRest(function(args) {\n        var index = -1;\n        while (++index < length) {\n          var pair = pairs[index];\n          if (apply(pair[0], this, args)) {\n            return apply(pair[1], this, args);\n          }\n        }\n      });\n    }\n\n    /**\n     * Creates a function that invokes the predicate properties of `source` with\n     * the corresponding property values of a given object, returning `true` if\n     * all predicates return truthy, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.conformsTo` with\n     * `source` partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 2, 'b': 1 },\n     *   { 'a': 1, 'b': 2 }\n     * ];\n     *\n     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n     * // => [{ 'a': 1, 'b': 2 }]\n     */\n    function conforms(source) {\n      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new constant function.\n     * @example\n     *\n     * var objects = _.times(2, _.constant({ 'a': 1 }));\n     *\n     * console.log(objects);\n     * // => [{ 'a': 1 }, { 'a': 1 }]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Checks `value` to determine whether a default value should be returned in\n     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n     * or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Util\n     * @param {*} value The value to check.\n     * @param {*} defaultValue The default value.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * _.defaultTo(1, 10);\n     * // => 1\n     *\n     * _.defaultTo(undefined, 10);\n     * // => 10\n     */\n    function defaultTo(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value;\n    }\n\n    /**\n     * Creates a function that returns the result of invoking the given functions\n     * with the `this` binding of the created function, where each successive\n     * invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flowRight\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow([_.add, square]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flow = createFlow();\n\n    /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the given functions from right to left.\n     *\n     * @static\n     * @since 3.0.0\n     * @memberOf _\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flow\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight([square, _.add]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flowRight = createFlow(true);\n\n    /**\n     * This method returns the first argument it receives.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     *\n     * console.log(_.identity(object) === object);\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Creates a function that invokes `func` with the arguments of the created\n     * function. If `func` is a property name, the created function returns the\n     * property value for a given element. If `func` is an array or object, the\n     * created function returns `true` for elements that contain the equivalent\n     * source properties, otherwise it returns `false`.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Util\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, _.iteratee(['user', 'fred']));\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, _.iteratee('user'));\n     * // => ['barney', 'fred']\n     *\n     * // Create custom iteratee shorthands.\n     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {\n     *     return func.test(string);\n     *   };\n     * });\n     *\n     * _.filter(['abc', 'def'], /ef/);\n     * // => ['def']\n     */\n    function iteratee(func) {\n      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between a given\n     * object and `source`, returning `true` if the given object has equivalent\n     * property values, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.isMatch` with `source`\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matches(source) {\n      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between the\n     * value at `path` of a given object to `srcValue`, returning `true` if the\n     * object value is equivalent, else `false`.\n     *\n     * **Note:** Partial comparisons will match empty array and empty object\n     * `srcValue` values against any array or object value, respectively. See\n     * `_.isEqual` for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.find(objects, _.matchesProperty('a', 4));\n     * // => { 'a': 4, 'b': 5, 'c': 6 }\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matchesProperty(path, srcValue) {\n      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that invokes the method at `path` of a given object.\n     * Any additional arguments are provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': _.constant(2) } },\n     *   { 'a': { 'b': _.constant(1) } }\n     * ];\n     *\n     * _.map(objects, _.method('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(objects, _.method(['a', 'b']));\n     * // => [2, 1]\n     */\n    var method = baseRest(function(path, args) {\n      return function(object) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * The opposite of `_.method`; this method creates a function that invokes\n     * the method at a given path of `object`. Any additional arguments are\n     * provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var array = _.times(3, _.constant),\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n     * // => [2, 0]\n     */\n    var methodOf = baseRest(function(object, args) {\n      return function(path) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * Adds all own enumerable string keyed function properties of a source\n     * object to the destination object. If `object` is a function, then methods\n     * are added to its prototype as well.\n     *\n     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n     * avoid conflicts caused by modifying the original.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Function|Object} [object=lodash] The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n    function mixin(object, source, options) {\n      var props = keys(source),\n          methodNames = baseFunctions(source, props);\n\n      if (options == null &&\n          !(isObject(source) && (methodNames.length || !props.length))) {\n        options = source;\n        source = object;\n        object = this;\n        methodNames = baseFunctions(source, keys(source));\n      }\n      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n          isFunc = isFunction(object);\n\n      arrayEach(methodNames, function(methodName) {\n        var func = source[methodName];\n        object[methodName] = func;\n        if (isFunc) {\n          object.prototype[methodName] = function() {\n            var chainAll = this.__chain__;\n            if (chain || chainAll) {\n              var result = object(this.__wrapped__),\n                  actions = result.__actions__ = copyArray(this.__actions__);\n\n              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n              result.__chain__ = chainAll;\n              return result;\n            }\n            return func.apply(object, arrayPush([this.value()], arguments));\n          };\n        }\n      });\n\n      return object;\n    }\n\n    /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      if (root._ === this) {\n        root._ = oldDash;\n      }\n      return this;\n    }\n\n    /**\n     * This method returns `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Util\n     * @example\n     *\n     * _.times(2, _.noop);\n     * // => [undefined, undefined]\n     */\n    function noop() {\n      // No operation performed.\n    }\n\n    /**\n     * Creates a function that gets the argument at index `n`. If `n` is negative,\n     * the nth argument from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [n=0] The index of the argument to return.\n     * @returns {Function} Returns the new pass-thru function.\n     * @example\n     *\n     * var func = _.nthArg(1);\n     * func('a', 'b', 'c', 'd');\n     * // => 'b'\n     *\n     * var func = _.nthArg(-2);\n     * func('a', 'b', 'c', 'd');\n     * // => 'c'\n     */\n    function nthArg(n) {\n      n = toInteger(n);\n      return baseRest(function(args) {\n        return baseNth(args, n);\n      });\n    }\n\n    /**\n     * Creates a function that invokes `iteratees` with the arguments it receives\n     * and returns their results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.over([Math.max, Math.min]);\n     *\n     * func(1, 2, 3, 4);\n     * // => [4, 1]\n     */\n    var over = createOver(arrayMap);\n\n    /**\n     * Creates a function that checks if **all** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overEvery([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => false\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overEvery = createOver(arrayEvery);\n\n    /**\n     * Creates a function that checks if **any** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overSome([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => true\n     *\n     * func(NaN);\n     * // => false\n     *\n     * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])\n     * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])\n     */\n    var overSome = createOver(arraySome);\n\n    /**\n     * Creates a function that returns the value at `path` of a given object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': 2 } },\n     *   { 'a': { 'b': 1 } }\n     * ];\n     *\n     * _.map(objects, _.property('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n     * // => [1, 2]\n     */\n    function property(path) {\n      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n    }\n\n    /**\n     * The opposite of `_.property`; this method creates a function that returns\n     * the value at a given path of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var array = [0, 1, 2],\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n     * // => [2, 0]\n     */\n    function propertyOf(object) {\n      return function(path) {\n        return object == null ? undefined : baseGet(object, path);\n      };\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n     * `start` is specified without an `end` or `step`. If `end` is not specified,\n     * it's set to `start` with `start` then set to `0`.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.rangeRight\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(-4);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    var range = createRange();\n\n    /**\n     * This method is like `_.range` except that it populates values in\n     * descending order.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.range\n     * @example\n     *\n     * _.rangeRight(4);\n     * // => [3, 2, 1, 0]\n     *\n     * _.rangeRight(-4);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 5);\n     * // => [4, 3, 2, 1]\n     *\n     * _.rangeRight(0, 20, 5);\n     * // => [15, 10, 5, 0]\n     *\n     * _.rangeRight(0, -4, -1);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.rangeRight(0);\n     * // => []\n     */\n    var rangeRight = createRange(true);\n\n    /**\n     * This method returns a new empty array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Array} Returns the new empty array.\n     * @example\n     *\n     * var arrays = _.times(2, _.stubArray);\n     *\n     * console.log(arrays);\n     * // => [[], []]\n     *\n     * console.log(arrays[0] === arrays[1]);\n     * // => false\n     */\n    function stubArray() {\n      return [];\n    }\n\n    /**\n     * This method returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `false`.\n     * @example\n     *\n     * _.times(2, _.stubFalse);\n     * // => [false, false]\n     */\n    function stubFalse() {\n      return false;\n    }\n\n    /**\n     * This method returns a new empty object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Object} Returns the new empty object.\n     * @example\n     *\n     * var objects = _.times(2, _.stubObject);\n     *\n     * console.log(objects);\n     * // => [{}, {}]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => false\n     */\n    function stubObject() {\n      return {};\n    }\n\n    /**\n     * This method returns an empty string.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {string} Returns the empty string.\n     * @example\n     *\n     * _.times(2, _.stubString);\n     * // => ['', '']\n     */\n    function stubString() {\n      return '';\n    }\n\n    /**\n     * This method returns `true`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `true`.\n     * @example\n     *\n     * _.times(2, _.stubTrue);\n     * // => [true, true]\n     */\n    function stubTrue() {\n      return true;\n    }\n\n    /**\n     * Invokes the iteratee `n` times, returning an array of the results of\n     * each invocation. The iteratee is invoked with one argument; (index).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.times(3, String);\n     * // => ['0', '1', '2']\n     *\n     *  _.times(4, _.constant(0));\n     * // => [0, 0, 0, 0]\n     */\n    function times(n, iteratee) {\n      n = toInteger(n);\n      if (n < 1 || n > MAX_SAFE_INTEGER) {\n        return [];\n      }\n      var index = MAX_ARRAY_LENGTH,\n          length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n      iteratee = getIteratee(iteratee);\n      n -= MAX_ARRAY_LENGTH;\n\n      var result = baseTimes(length, iteratee);\n      while (++index < n) {\n        iteratee(index);\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a property path array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the new property path array.\n     * @example\n     *\n     * _.toPath('a.b.c');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toPath('a[0].b.c');\n     * // => ['a', '0', 'b', 'c']\n     */\n    function toPath(value) {\n      if (isArray(value)) {\n        return arrayMap(value, toKey);\n      }\n      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {string} [prefix=''] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return toString(prefix) + id;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Adds two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {number} augend The first number in an addition.\n     * @param {number} addend The second number in an addition.\n     * @returns {number} Returns the total.\n     * @example\n     *\n     * _.add(6, 4);\n     * // => 10\n     */\n    var add = createMathOperation(function(augend, addend) {\n      return augend + addend;\n    }, 0);\n\n    /**\n     * Computes `number` rounded up to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round up.\n     * @param {number} [precision=0] The precision to round up to.\n     * @returns {number} Returns the rounded up number.\n     * @example\n     *\n     * _.ceil(4.006);\n     * // => 5\n     *\n     * _.ceil(6.004, 2);\n     * // => 6.01\n     *\n     * _.ceil(6040, -2);\n     * // => 6100\n     */\n    var ceil = createRound('ceil');\n\n    /**\n     * Divide two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} dividend The first number in a division.\n     * @param {number} divisor The second number in a division.\n     * @returns {number} Returns the quotient.\n     * @example\n     *\n     * _.divide(6, 4);\n     * // => 1.5\n     */\n    var divide = createMathOperation(function(dividend, divisor) {\n      return dividend / divisor;\n    }, 1);\n\n    /**\n     * Computes `number` rounded down to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round down.\n     * @param {number} [precision=0] The precision to round down to.\n     * @returns {number} Returns the rounded down number.\n     * @example\n     *\n     * _.floor(4.006);\n     * // => 4\n     *\n     * _.floor(0.046, 2);\n     * // => 0.04\n     *\n     * _.floor(4060, -2);\n     * // => 4000\n     */\n    var floor = createRound('floor');\n\n    /**\n     * Computes the maximum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => undefined\n     */\n    function max(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseGt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.max` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.maxBy(objects, function(o) { return o.n; });\n     * // => { 'n': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.maxBy(objects, 'n');\n     * // => { 'n': 2 }\n     */\n    function maxBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)\n        : undefined;\n    }\n\n    /**\n     * Computes the mean of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * _.mean([4, 2, 8, 6]);\n     * // => 5\n     */\n    function mean(array) {\n      return baseMean(array, identity);\n    }\n\n    /**\n     * This method is like `_.mean` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be averaged.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.meanBy(objects, function(o) { return o.n; });\n     * // => 5\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.meanBy(objects, 'n');\n     * // => 5\n     */\n    function meanBy(array, iteratee) {\n      return baseMean(array, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * Computes the minimum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => undefined\n     */\n    function min(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseLt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.min` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.minBy(objects, function(o) { return o.n; });\n     * // => { 'n': 1 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.minBy(objects, 'n');\n     * // => { 'n': 1 }\n     */\n    function minBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)\n        : undefined;\n    }\n\n    /**\n     * Multiply two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} multiplier The first number in a multiplication.\n     * @param {number} multiplicand The second number in a multiplication.\n     * @returns {number} Returns the product.\n     * @example\n     *\n     * _.multiply(6, 4);\n     * // => 24\n     */\n    var multiply = createMathOperation(function(multiplier, multiplicand) {\n      return multiplier * multiplicand;\n    }, 1);\n\n    /**\n     * Computes `number` rounded to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round.\n     * @param {number} [precision=0] The precision to round to.\n     * @returns {number} Returns the rounded number.\n     * @example\n     *\n     * _.round(4.006);\n     * // => 4\n     *\n     * _.round(4.006, 2);\n     * // => 4.01\n     *\n     * _.round(4060, -2);\n     * // => 4100\n     */\n    var round = createRound('round');\n\n    /**\n     * Subtract two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {number} minuend The first number in a subtraction.\n     * @param {number} subtrahend The second number in a subtraction.\n     * @returns {number} Returns the difference.\n     * @example\n     *\n     * _.subtract(6, 4);\n     * // => 2\n     */\n    var subtract = createMathOperation(function(minuend, subtrahend) {\n      return minuend - subtrahend;\n    }, 0);\n\n    /**\n     * Computes the sum of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.sum([4, 2, 8, 6]);\n     * // => 20\n     */\n    function sum(array) {\n      return (array && array.length)\n        ? baseSum(array, identity)\n        : 0;\n    }\n\n    /**\n     * This method is like `_.sum` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be summed.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.sumBy(objects, function(o) { return o.n; });\n     * // => 20\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sumBy(objects, 'n');\n     * // => 20\n     */\n    function sumBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSum(array, getIteratee(iteratee, 2))\n        : 0;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return wrapped values in chain sequences.\n    lodash.after = after;\n    lodash.ary = ary;\n    lodash.assign = assign;\n    lodash.assignIn = assignIn;\n    lodash.assignInWith = assignInWith;\n    lodash.assignWith = assignWith;\n    lodash.at = at;\n    lodash.before = before;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.castArray = castArray;\n    lodash.chain = chain;\n    lodash.chunk = chunk;\n    lodash.compact = compact;\n    lodash.concat = concat;\n    lodash.cond = cond;\n    lodash.conforms = conforms;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.curry = curry;\n    lodash.curryRight = curryRight;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defaultsDeep = defaultsDeep;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.differenceBy = differenceBy;\n    lodash.differenceWith = differenceWith;\n    lodash.drop = drop;\n    lodash.dropRight = dropRight;\n    lodash.dropRightWhile = dropRightWhile;\n    lodash.dropWhile = dropWhile;\n    lodash.fill = fill;\n    lodash.filter = filter;\n    lodash.flatMap = flatMap;\n    lodash.flatMapDeep = flatMapDeep;\n    lodash.flatMapDepth = flatMapDepth;\n    lodash.flatten = flatten;\n    lodash.flattenDeep = flattenDeep;\n    lodash.flattenDepth = flattenDepth;\n    lodash.flip = flip;\n    lodash.flow = flow;\n    lodash.flowRight = flowRight;\n    lodash.fromPairs = fromPairs;\n    lodash.functions = functions;\n    lodash.functionsIn = functionsIn;\n    lodash.groupBy = groupBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.intersectionBy = intersectionBy;\n    lodash.intersectionWith = intersectionWith;\n    lodash.invert = invert;\n    lodash.invertBy = invertBy;\n    lodash.invokeMap = invokeMap;\n    lodash.iteratee = iteratee;\n    lodash.keyBy = keyBy;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.map = map;\n    lodash.mapKeys = mapKeys;\n    lodash.mapValues = mapValues;\n    lodash.matches = matches;\n    lodash.matchesProperty = matchesProperty;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.mergeWith = mergeWith;\n    lodash.method = method;\n    lodash.methodOf = methodOf;\n    lodash.mixin = mixin;\n    lodash.negate = negate;\n    lodash.nthArg = nthArg;\n    lodash.omit = omit;\n    lodash.omitBy = omitBy;\n    lodash.once = once;\n    lodash.orderBy = orderBy;\n    lodash.over = over;\n    lodash.overArgs = overArgs;\n    lodash.overEvery = overEvery;\n    lodash.overSome = overSome;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.partition = partition;\n    lodash.pick = pick;\n    lodash.pickBy = pickBy;\n    lodash.property = property;\n    lodash.propertyOf = propertyOf;\n    lodash.pull = pull;\n    lodash.pullAll = pullAll;\n    lodash.pullAllBy = pullAllBy;\n    lodash.pullAllWith = pullAllWith;\n    lodash.pullAt = pullAt;\n    lodash.range = range;\n    lodash.rangeRight = rangeRight;\n    lodash.rearg = rearg;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.reverse = reverse;\n    lodash.sampleSize = sampleSize;\n    lodash.set = set;\n    lodash.setWith = setWith;\n    lodash.shuffle = shuffle;\n    lodash.slice = slice;\n    lodash.sortBy = sortBy;\n    lodash.sortedUniq = sortedUniq;\n    lodash.sortedUniqBy = sortedUniqBy;\n    lodash.split = split;\n    lodash.spread = spread;\n    lodash.tail = tail;\n    lodash.take = take;\n    lodash.takeRight = takeRight;\n    lodash.takeRightWhile = takeRightWhile;\n    lodash.takeWhile = takeWhile;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.thru = thru;\n    lodash.toArray = toArray;\n    lodash.toPairs = toPairs;\n    lodash.toPairsIn = toPairsIn;\n    lodash.toPath = toPath;\n    lodash.toPlainObject = toPlainObject;\n    lodash.transform = transform;\n    lodash.unary = unary;\n    lodash.union = union;\n    lodash.unionBy = unionBy;\n    lodash.unionWith = unionWith;\n    lodash.uniq = uniq;\n    lodash.uniqBy = uniqBy;\n    lodash.uniqWith = uniqWith;\n    lodash.unset = unset;\n    lodash.unzip = unzip;\n    lodash.unzipWith = unzipWith;\n    lodash.update = update;\n    lodash.updateWith = updateWith;\n    lodash.values = values;\n    lodash.valuesIn = valuesIn;\n    lodash.without = without;\n    lodash.words = words;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.xorBy = xorBy;\n    lodash.xorWith = xorWith;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n    lodash.zipObjectDeep = zipObjectDeep;\n    lodash.zipWith = zipWith;\n\n    // Add aliases.\n    lodash.entries = toPairs;\n    lodash.entriesIn = toPairsIn;\n    lodash.extend = assignIn;\n    lodash.extendWith = assignInWith;\n\n    // Add methods to `lodash.prototype`.\n    mixin(lodash, lodash);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return unwrapped values in chain sequences.\n    lodash.add = add;\n    lodash.attempt = attempt;\n    lodash.camelCase = camelCase;\n    lodash.capitalize = capitalize;\n    lodash.ceil = ceil;\n    lodash.clamp = clamp;\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.cloneDeepWith = cloneDeepWith;\n    lodash.cloneWith = cloneWith;\n    lodash.conformsTo = conformsTo;\n    lodash.deburr = deburr;\n    lodash.defaultTo = defaultTo;\n    lodash.divide = divide;\n    lodash.endsWith = endsWith;\n    lodash.eq = eq;\n    lodash.escape = escape;\n    lodash.escapeRegExp = escapeRegExp;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.floor = floor;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.get = get;\n    lodash.gt = gt;\n    lodash.gte = gte;\n    lodash.has = has;\n    lodash.hasIn = hasIn;\n    lodash.head = head;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.indexOf = indexOf;\n    lodash.inRange = inRange;\n    lodash.invoke = invoke;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isArrayBuffer = isArrayBuffer;\n    lodash.isArrayLike = isArrayLike;\n    lodash.isArrayLikeObject = isArrayLikeObject;\n    lodash.isBoolean = isBoolean;\n    lodash.isBuffer = isBuffer;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isEqualWith = isEqualWith;\n    lodash.isError = isError;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isInteger = isInteger;\n    lodash.isLength = isLength;\n    lodash.isMap = isMap;\n    lodash.isMatch = isMatch;\n    lodash.isMatchWith = isMatchWith;\n    lodash.isNaN = isNaN;\n    lodash.isNative = isNative;\n    lodash.isNil = isNil;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isObjectLike = isObjectLike;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isSafeInteger = isSafeInteger;\n    lodash.isSet = isSet;\n    lodash.isString = isString;\n    lodash.isSymbol = isSymbol;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.isWeakMap = isWeakMap;\n    lodash.isWeakSet = isWeakSet;\n    lodash.join = join;\n    lodash.kebabCase = kebabCase;\n    lodash.last = last;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.lowerCase = lowerCase;\n    lodash.lowerFirst = lowerFirst;\n    lodash.lt = lt;\n    lodash.lte = lte;\n    lodash.max = max;\n    lodash.maxBy = maxBy;\n    lodash.mean = mean;\n    lodash.meanBy = meanBy;\n    lodash.min = min;\n    lodash.minBy = minBy;\n    lodash.stubArray = stubArray;\n    lodash.stubFalse = stubFalse;\n    lodash.stubObject = stubObject;\n    lodash.stubString = stubString;\n    lodash.stubTrue = stubTrue;\n    lodash.multiply = multiply;\n    lodash.nth = nth;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.pad = pad;\n    lodash.padEnd = padEnd;\n    lodash.padStart = padStart;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.repeat = repeat;\n    lodash.replace = replace;\n    lodash.result = result;\n    lodash.round = round;\n    lodash.runInContext = runInContext;\n    lodash.sample = sample;\n    lodash.size = size;\n    lodash.snakeCase = snakeCase;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.sortedIndexBy = sortedIndexBy;\n    lodash.sortedIndexOf = sortedIndexOf;\n    lodash.sortedLastIndex = sortedLastIndex;\n    lodash.sortedLastIndexBy = sortedLastIndexBy;\n    lodash.sortedLastIndexOf = sortedLastIndexOf;\n    lodash.startCase = startCase;\n    lodash.startsWith = startsWith;\n    lodash.subtract = subtract;\n    lodash.sum = sum;\n    lodash.sumBy = sumBy;\n    lodash.template = template;\n    lodash.times = times;\n    lodash.toFinite = toFinite;\n    lodash.toInteger = toInteger;\n    lodash.toLength = toLength;\n    lodash.toLower = toLower;\n    lodash.toNumber = toNumber;\n    lodash.toSafeInteger = toSafeInteger;\n    lodash.toString = toString;\n    lodash.toUpper = toUpper;\n    lodash.trim = trim;\n    lodash.trimEnd = trimEnd;\n    lodash.trimStart = trimStart;\n    lodash.truncate = truncate;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n    lodash.upperCase = upperCase;\n    lodash.upperFirst = upperFirst;\n\n    // Add aliases.\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.first = head;\n\n    mixin(lodash, (function() {\n      var source = {};\n      baseForOwn(lodash, function(func, methodName) {\n        if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }()), { 'chain': false });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type {string}\n     */\n    lodash.VERSION = VERSION;\n\n    // Assign default placeholders.\n    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n      lodash[methodName].placeholder = lodash;\n    });\n\n    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n    arrayEach(['drop', 'take'], function(methodName, index) {\n      LazyWrapper.prototype[methodName] = function(n) {\n        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);\n\n        var result = (this.__filtered__ && !index)\n          ? new LazyWrapper(this)\n          : this.clone();\n\n        if (result.__filtered__) {\n          result.__takeCount__ = nativeMin(n, result.__takeCount__);\n        } else {\n          result.__views__.push({\n            'size': nativeMin(n, MAX_ARRAY_LENGTH),\n            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')\n          });\n        }\n        return result;\n      };\n\n      LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n        return this.reverse()[methodName](n).reverse();\n      };\n    });\n\n    // Add `LazyWrapper` methods that accept an `iteratee` value.\n    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n      var type = index + 1,\n          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;\n\n      LazyWrapper.prototype[methodName] = function(iteratee) {\n        var result = this.clone();\n        result.__iteratees__.push({\n          'iteratee': getIteratee(iteratee, 3),\n          'type': type\n        });\n        result.__filtered__ = result.__filtered__ || isFilter;\n        return result;\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.head` and `_.last`.\n    arrayEach(['head', 'last'], function(methodName, index) {\n      var takeName = 'take' + (index ? 'Right' : '');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[takeName](1).value()[0];\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.\n    arrayEach(['initial', 'tail'], function(methodName, index) {\n      var dropName = 'drop' + (index ? '' : 'Right');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n      };\n    });\n\n    LazyWrapper.prototype.compact = function() {\n      return this.filter(identity);\n    };\n\n    LazyWrapper.prototype.find = function(predicate) {\n      return this.filter(predicate).head();\n    };\n\n    LazyWrapper.prototype.findLast = function(predicate) {\n      return this.reverse().find(predicate);\n    };\n\n    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {\n      if (typeof path == 'function') {\n        return new LazyWrapper(this);\n      }\n      return this.map(function(value) {\n        return baseInvoke(value, path, args);\n      });\n    });\n\n    LazyWrapper.prototype.reject = function(predicate) {\n      return this.filter(negate(getIteratee(predicate)));\n    };\n\n    LazyWrapper.prototype.slice = function(start, end) {\n      start = toInteger(start);\n\n      var result = this;\n      if (result.__filtered__ && (start > 0 || end < 0)) {\n        return new LazyWrapper(result);\n      }\n      if (start < 0) {\n        result = result.takeRight(-start);\n      } else if (start) {\n        result = result.drop(start);\n      }\n      if (end !== undefined) {\n        end = toInteger(end);\n        result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n      }\n      return result;\n    };\n\n    LazyWrapper.prototype.takeRightWhile = function(predicate) {\n      return this.reverse().takeWhile(predicate).reverse();\n    };\n\n    LazyWrapper.prototype.toArray = function() {\n      return this.take(MAX_ARRAY_LENGTH);\n    };\n\n    // Add `LazyWrapper` methods to `lodash.prototype`.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),\n          isTaker = /^(?:head|last)$/.test(methodName),\n          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],\n          retUnwrapped = isTaker || /^find/.test(methodName);\n\n      if (!lodashFunc) {\n        return;\n      }\n      lodash.prototype[methodName] = function() {\n        var value = this.__wrapped__,\n            args = isTaker ? [1] : arguments,\n            isLazy = value instanceof LazyWrapper,\n            iteratee = args[0],\n            useLazy = isLazy || isArray(value);\n\n        var interceptor = function(value) {\n          var result = lodashFunc.apply(lodash, arrayPush([value], args));\n          return (isTaker && chainAll) ? result[0] : result;\n        };\n\n        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n          // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n          isLazy = useLazy = false;\n        }\n        var chainAll = this.__chain__,\n            isHybrid = !!this.__actions__.length,\n            isUnwrapped = retUnwrapped && !chainAll,\n            onlyLazy = isLazy && !isHybrid;\n\n        if (!retUnwrapped && useLazy) {\n          value = onlyLazy ? value : new LazyWrapper(this);\n          var result = func.apply(value, args);\n          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n          return new LodashWrapper(result, chainAll);\n        }\n        if (isUnwrapped && onlyLazy) {\n          return func.apply(this, args);\n        }\n        result = this.thru(interceptor);\n        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;\n      };\n    });\n\n    // Add `Array` methods to `lodash.prototype`.\n    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n      var func = arrayProto[methodName],\n          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n          retUnwrapped = /^(?:pop|shift)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments;\n        if (retUnwrapped && !this.__chain__) {\n          var value = this.value();\n          return func.apply(isArray(value) ? value : [], args);\n        }\n        return this[chainName](function(value) {\n          return func.apply(isArray(value) ? value : [], args);\n        });\n      };\n    });\n\n    // Map minified method names to their real names.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (lodashFunc) {\n        var key = lodashFunc.name + '';\n        if (!hasOwnProperty.call(realNames, key)) {\n          realNames[key] = [];\n        }\n        realNames[key].push({ 'name': methodName, 'func': lodashFunc });\n      }\n    });\n\n    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{\n      'name': 'wrapper',\n      'func': undefined\n    }];\n\n    // Add methods to `LazyWrapper`.\n    LazyWrapper.prototype.clone = lazyClone;\n    LazyWrapper.prototype.reverse = lazyReverse;\n    LazyWrapper.prototype.value = lazyValue;\n\n    // Add chain sequence methods to the `lodash` wrapper.\n    lodash.prototype.at = wrapperAt;\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.commit = wrapperCommit;\n    lodash.prototype.next = wrapperNext;\n    lodash.prototype.plant = wrapperPlant;\n    lodash.prototype.reverse = wrapperReverse;\n    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n    // Add lazy aliases.\n    lodash.prototype.first = lodash.prototype.head;\n\n    if (symIterator) {\n      lodash.prototype[symIterator] = wrapperToIterator;\n    }\n    return lodash;\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  // Export lodash.\n  var _ = runInContext();\n\n  // Some AMD build optimizers, like r.js, check for condition patterns like:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // Expose Lodash on the global object to prevent errors when Lodash is\n    // loaded by a script tag in the presence of an AMD loader.\n    // See http://requirejs.org/docs/errors.html#mismatch for more details.\n    // Use `_.noConflict` to remove Lodash from the global object.\n    root._ = _;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    define(function() {\n      return _;\n    });\n  }\n  // Check for `exports` after `define` in case a build optimizer adds it.\n  else if (freeModule) {\n    // Export for Node.js.\n    (freeModule.exports = _)._ = _;\n    // Export for CommonJS support.\n    freeExports._ = _;\n  }\n  else {\n    // Export to the global object.\n    root._ = _;\n  }\n}.call(this));\n","module.exports = import(\"/uxasset/externals/@devsnc/library-appsee-web-sdk/4.1.2/index.jsdbx\");;","module.exports = import(\"/uxasset/externals/axios/1.13.1/index.jsdbx\");;","function _assertThisInitialized(e) {\n  if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  return e;\n}\nmodule.exports = _assertThisInitialized, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _classCallCheck(a, n) {\n  if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\");\n}\nmodule.exports = _classCallCheck, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var isNativeReflectConstruct = require(\"./isNativeReflectConstruct.js\");\nvar setPrototypeOf = require(\"./setPrototypeOf.js\");\nfunction _construct(t, e, r) {\n  if (isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments);\n  var o = [null];\n  o.push.apply(o, e);\n  var p = new (t.bind.apply(t, o))();\n  return r && setPrototypeOf(p, r.prototype), p;\n}\nmodule.exports = _construct, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperties(e, r) {\n  for (var t = 0; t < r.length; t++) {\n    var o = r[t];\n    o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, toPropertyKey(o.key), o);\n  }\n}\nfunction _createClass(e, r, t) {\n  return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", {\n    writable: !1\n  }), e;\n}\nmodule.exports = _createClass, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _extends() {\n  return module.exports = _extends = Object.assign ? Object.assign.bind() : function (n) {\n    for (var e = 1; e < arguments.length; e++) {\n      var t = arguments[e];\n      for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n    }\n    return n;\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _extends.apply(null, arguments);\n}\nmodule.exports = _extends, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _getPrototypeOf(t) {\n  return module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {\n    return t.__proto__ || Object.getPrototypeOf(t);\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _getPrototypeOf(t);\n}\nmodule.exports = _getPrototypeOf, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var setPrototypeOf = require(\"./setPrototypeOf.js\");\nfunction _inherits(t, e) {\n  if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\");\n  t.prototype = Object.create(e && e.prototype, {\n    constructor: {\n      value: t,\n      writable: !0,\n      configurable: !0\n    }\n  }), Object.defineProperty(t, \"prototype\", {\n    writable: !1\n  }), e && setPrototypeOf(t, e);\n}\nmodule.exports = _inherits, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _isNativeFunction(t) {\n  try {\n    return -1 !== Function.toString.call(t).indexOf(\"[native code]\");\n  } catch (n) {\n    return \"function\" == typeof t;\n  }\n}\nmodule.exports = _isNativeFunction, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _isNativeReflectConstruct() {\n  try {\n    var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n  } catch (t) {}\n  return (module.exports = _isNativeReflectConstruct = function _isNativeReflectConstruct() {\n    return !!t;\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports)();\n}\nmodule.exports = _isNativeReflectConstruct, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _objectWithoutPropertiesLoose(r, e) {\n  if (null == r) return {};\n  var t = {};\n  for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n    if (e.includes(n)) continue;\n    t[n] = r[n];\n  }\n  return t;\n}\nmodule.exports = _objectWithoutPropertiesLoose, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nvar assertThisInitialized = require(\"./assertThisInitialized.js\");\nfunction _possibleConstructorReturn(t, e) {\n  if (e && (\"object\" == _typeof(e) || \"function\" == typeof e)) return e;\n  if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\");\n  return assertThisInitialized(t);\n}\nmodule.exports = _possibleConstructorReturn, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _setPrototypeOf(t, e) {\n  return module.exports = _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n    return t.__proto__ = e, t;\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _setPrototypeOf(t, e);\n}\nmodule.exports = _setPrototypeOf, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction toPrimitive(t, r) {\n  if (\"object\" != _typeof(t) || !t) return t;\n  var e = t[Symbol.toPrimitive];\n  if (void 0 !== e) {\n    var i = e.call(t, r || \"default\");\n    if (\"object\" != _typeof(i)) return i;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (\"string\" === r ? String : Number)(t);\n}\nmodule.exports = toPrimitive, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nvar toPrimitive = require(\"./toPrimitive.js\");\nfunction toPropertyKey(t) {\n  var i = toPrimitive(t, \"string\");\n  return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nmodule.exports = toPropertyKey, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _typeof(o) {\n  \"@babel/helpers - typeof\";\n\n  return module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n    return typeof o;\n  } : function (o) {\n    return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var getPrototypeOf = require(\"./getPrototypeOf.js\");\nvar setPrototypeOf = require(\"./setPrototypeOf.js\");\nvar isNativeFunction = require(\"./isNativeFunction.js\");\nvar construct = require(\"./construct.js\");\nfunction _wrapNativeSuper(t) {\n  var r = \"function\" == typeof Map ? new Map() : void 0;\n  return module.exports = _wrapNativeSuper = function _wrapNativeSuper(t) {\n    if (null === t || !isNativeFunction(t)) return t;\n    if (\"function\" != typeof t) throw new TypeError(\"Super expression must either be null or a function\");\n    if (void 0 !== r) {\n      if (r.has(t)) return r.get(t);\n      r.set(t, Wrapper);\n    }\n    function Wrapper() {\n      return construct(t, arguments, getPrototypeOf(this).constructor);\n    }\n    return Wrapper.prototype = Object.create(t.prototype, {\n      constructor: {\n        value: Wrapper,\n        enumerable: !1,\n        writable: !0,\n        configurable: !0\n      }\n    }), setPrototypeOf(Wrapper, t);\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _wrapNativeSuper(t);\n}\nmodule.exports = _wrapNativeSuper, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.T = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","const random = (len) => crypto.getRandomValues(new Uint8Array(len));\n\nlet IDX = 256,\n\tHEX = [];\nfor (; IDX--; ) HEX[IDX] = (IDX + 256).toString(16).substring(1);\n\n/*#__INLINE__*/\nconst to_hex = (arr) => {\n\tlet i = 0,\n\t\toutput = '';\n\t// @ts-ignore\n\tfor (; i < arr.length; i++) output += HEX[arr[i]];\n\treturn output;\n};\n\n/*\nAnatomy of a Traceparent\n\n00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01\n^  ^                                ^                ^ \n|  |                                |                |\n|  |                                |                flags (2 hex)\n|  |                                parent-id (16 hex)\n|  trace-id (32 hex)\nversion (2 hex)\n*/\n\nconst trace_id_size = 16;\nconst parent_id_size = 8;\n\nconst W3C_TRACEPARENT_VERSION = '00';\n\nconst SAMPLED_FLAG = 0b00000001;\n\nconst traceparent = (version, trace_id, parent_id, flags) => ({\n\tversion,\n\ttrace_id,\n\tparent_id,\n\tflags,\n\n\tchild(sampled) {\n\t\treturn traceparent(\n\t\t\tthis.version,\n\t\t\tthis.trace_id,\n\t\t\tto_hex(random(parent_id_size)),\n\t\t\tsampled === undefined\n\t\t\t\t? this.flags\n\t\t\t\t: sampled\n\t\t\t\t\t? this.flags | SAMPLED_FLAG\n\t\t\t\t\t: this.flags & ~SAMPLED_FLAG\n\t\t);\n\t},\n\n\ttoString() {\n\t\tconst flags = this.flags.toString(16).padStart(2, '0');\n\t\treturn `${this.version}-${this.trace_id}-${this.parent_id}-${flags}`;\n\t},\n});\n\nexport function make(sampled) {\n\tconst total_size = trace_id_size + parent_id_size;\n\tconst id = random(total_size);\n\n\treturn traceparent(\n\t\tW3C_TRACEPARENT_VERSION,\n\t\tto_hex(id.slice(0, trace_id_size)),\n\t\tto_hex(id.slice(trace_id_size, total_size)),\n\t\tsampled ? SAMPLED_FLAG : 0b00000000\n\t);\n}\n\nexport function parse(value) {\n\tif (value.length > 55) return null;\n\tconst segs = value.split('-');\n\treturn traceparent(segs[0], segs[1], segs[2], parseInt(segs[3], 16));\n}\n\n// ~> Utils\n\nexport function is_sampled(id) {\n\treturn !!(id.flags & SAMPLED_FLAG);\n}\n","const config = {\n\tdebug: false,\n\tenableTrace: false,\n\tenableCounter: false,\n\tenableGauge: false,\n\tenableHistogram: false,\n\tenableInteractions: false,\n\tenableTrack: false,\n\tenableMousemoveInteractions: false,\n\tenableScrollInteractions: false,\n\tenableKeypressInteractions: false,\n\tenableClickInteractions: false,\n};\n\nexport const set = (key, value) => (config[key] = value);\nexport const get = (key) => config[key];\n\n/*\n\tinteractionScrollElements: []\n*/\n","export const EXCEPTION_TYPE = 'exception.type';\nexport const EXCEPTION_MESSAGE = 'exception.message';\nexport const EXCEPTION_STACKTRACE = 'exception.stacktrace';\n","import { parse, make } from './tctx';\n\nconst metaEl = Array.from(document.getElementsByTagName('meta')).find(\n\t(e) => e.getAttribute('name') === 'traceparent'\n);\nconst traceparent = metaEl && metaEl.content ? parse(metaEl.content) : make();\n\nexport const defaultParentId = traceparent.parent_id;\nexport const defaultTraceId = traceparent.trace_id;\nexport const defaultTraceFlag = traceparent.flags;\nexport const defaultTraceParent = traceparent.toString();\nexport const createSpanId = () => make().parent_id;\nexport const createTraceId = () => make().trace_id;\nexport const createTraceParentHeader = (spanId, traceId) =>\n\t`${traceparent.version}-${traceId}-${spanId}-${traceparent.flags.toString(16).padStart(2, '0')}`;\n","let user = {};\n\nexport const set = (id, attributes = {}) => {\n\tuser = { ...attributes, id };\n};\n\nexport const get = () => ({ ...user });\n","let page = {};\n\nexport const set = (id, attributes = {}) => {\n\tpage = {\n\t\t...attributes,\n\t\tid: id || location.href.replace(location.origin, ''),\n\t};\n};\n\nexport const get = () => ({ ...page });\n","let application = {};\n\nexport const set = (name, version, attributes = {}) => {\n\tapplication = { ...attributes, name, version };\n};\n\nexport const get = () => ({ ...application });\n","import { get as getUser } from './user';\nimport { get as getPage } from './page';\nimport { get as getApplication } from './application';\n\nexport default function getItemMetadata() {\n\treturn {\n\t\tapplication: getApplication(),\n\t\tuser: getUser(),\n\t\tpage: getPage(),\n\t};\n}\n","export const SPAN_KIND = {\n\t// Unspecified. Do NOT use as default.\n\t// Implementations MAY assume SpanKind to be INTERNAL when receiving UNSPECIFIED.\n\tUNSPECIFIED: 0,\n\n\t// Indicates that the span represents an internal operation within an application,\n\t// as opposed to an operation happening at the boundaries. Default value.\n\tINTERNAL: 1,\n\n\t// Indicates that the span covers server-side handling of an RPC or other\n\t// remote network request.\n\tSERVER: 2,\n\n\t// Indicates that the span describes a request to some remote service.\n\tCLIENT: 3,\n\n\t// Indicates that the span describes a producer sending a message to a broker.\n\t// Unlike CLIENT and SERVER, there is often no direct critical path latency relationship\n\t// between producer and consumer spans. A PRODUCER span ends when the message was accepted\n\t// by the broker while the logical processing of the message might span a much longer time.\n\tPRODUCER: 4,\n\n\t// Indicates that the span describes consumer receiving a message from a broker.\n\t// Like the PRODUCER kind, there is often no direct critical path latency relationship\n\t// between producer and consumer spans.\n\tCONSUMER: 5,\n};\n","// Invalid span\nexport const INVALID_TRACE_ID = '00000000000000000000000000000000';\nexport const INVALID_SPAN_ID = '0000000000000000';\n","export function sanitizeAttributes(attributes) {\n\tconst sanitizeAttributes = {};\n\n\tif (typeof attributes !== 'object' || attributes == null) {\n\t\treturn sanitizeAttributes;\n\t}\n\n\tfor (const [key, val] of Object.entries(attributes)) {\n\t\tif (!isValidAttributeKey(key)) {\n\t\t\tconsole.warn(`Invalid attribute key: ${key}`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!isValidAttributeValue(val)) {\n\t\t\tconsole.warn(`Invalid attribute value set for key: ${key}`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (Array.isArray(val)) {\n\t\t\tsanitizeAttributes[key] = val.slice();\n\t\t} else {\n\t\t\tsanitizeAttributes[key] = val;\n\t\t}\n\t}\n\n\treturn sanitizeAttributes;\n}\n\nexport function isValidAttributeKey(key) {\n\treturn typeof key === 'string' && key.length > 0;\n}\n\nexport function isValidAttributeValue(val) {\n\tif (val == null) {\n\t\treturn true;\n\t}\n\n\tif (Array.isArray(val)) {\n\t\treturn val.every((e) => e == null || isValidPrimitiveAttributeValue(e));\n\t}\n\n\treturn isValidPrimitiveAttributeValue(val);\n}\n\nexport function isValidPrimitiveAttributeValue(val) {\n\treturn (\n\t\ttypeof val === 'string' ||\n\t\ttypeof val === 'number' ||\n\t\ttypeof val === 'boolean'\n\t);\n}\n","import { get as getConfigValue } from './config';\nimport {\n\tEXCEPTION_TYPE,\n\tEXCEPTION_MESSAGE,\n\tEXCEPTION_STACKTRACE,\n} from './attributes';\nimport { createSpanId, createTraceId, defaultTraceParent } from './traceparent';\nimport getItemMetadata from './getItemMetadata';\nimport { SPAN_KIND } from './spanKind';\nimport { INVALID_SPAN_ID, INVALID_TRACE_ID } from './constants';\nimport {\n\tisValidAttributeKey,\n\tisValidAttributeValue,\n\tsanitizeAttributes,\n} from './attributeValidator';\n\nconst noop = () => null;\nconst getCurrentTime = () => performance.timeOrigin + performance.now();\n\nexport default function createTracer(exporter) {\n\treturn function trace(name, options = {}) {\n\t\tif (getConfigValue('enableTrace')) {\n\t\t\tconst {\n\t\t\t\tattributes = {},\n\t\t\t\tlinks = [],\n\t\t\t\tparentSpan,\n\t\t\t\tevents = [],\n\t\t\t\tkind = SPAN_KIND.INTERNAL,\n\t\t\t} = options;\n\t\t\tconst parentSpanId = parentSpan ? parentSpan.id : undefined;\n\t\t\tconst traceId = parentSpan\n\t\t\t\t? parentSpan.traceId\n\t\t\t\t: options.traceId || createTraceId();\n\t\t\tconst { page, user, application } = getItemMetadata();\n\t\t\tlet _ended = false;\n\t\t\treturn {\n\t\t\t\ttype: 'trace',\n\t\t\t\tid: createSpanId(),\n\t\t\t\ttraceId,\n\t\t\t\tlinks,\n\t\t\t\tevents,\n\t\t\t\tstatus: 0,\n\t\t\t\tattributes: sanitizeAttributes(attributes),\n\t\t\t\tapplication,\n\t\t\t\tuser,\n\t\t\t\tpage,\n\t\t\t\tname,\n\t\t\t\tdocumentTraceParent: defaultTraceParent,\n\t\t\t\tstartTime: getCurrentTime(),\n\t\t\t\tparentSpanId,\n\t\t\t\tendTime: null,\n\t\t\t\tduration: null,\n\t\t\t\tkind,\n\t\t\t\tsetStatus(status) {\n\t\t\t\t\tif (_ended) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.status = status;\n\t\t\t\t},\n\t\t\t\taddEvent(event, attributes, now = performance.now()) {\n\t\t\t\t\tif (_ended) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.events.push({ name: event, attributes, time: now });\n\t\t\t\t},\n\t\t\t\tend() {\n\t\t\t\t\tif (_ended) {\n\t\t\t\t\t\tconsole.warn('Trying to end an ended span');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t_ended = true;\n\t\t\t\t\tthis.endTime = getCurrentTime();\n\t\t\t\t\tthis.duration = this.endTime - this.startTime;\n\t\t\t\t\texporter(this);\n\t\t\t\t},\n\t\t\t\trecordException(exception, now = Date.now()) {\n\t\t\t\t\tif (_ended) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst attributes = {};\n\t\t\t\t\tif (typeof exception === 'string') {\n\t\t\t\t\t\tattributes[EXCEPTION_MESSAGE] = exception;\n\t\t\t\t\t} else if (exception) {\n\t\t\t\t\t\tif (exception.code) {\n\t\t\t\t\t\t\tattributes[EXCEPTION_TYPE] =\n\t\t\t\t\t\t\t\texception.code.toString();\n\t\t\t\t\t\t} else if (exception.name) {\n\t\t\t\t\t\t\tattributes[EXCEPTION_TYPE] = exception.name;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (exception.message) {\n\t\t\t\t\t\t\tattributes[EXCEPTION_MESSAGE] = exception.message;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (exception.stack) {\n\t\t\t\t\t\t\tattributes[EXCEPTION_STACKTRACE] = exception.stack;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// these are minimum requirements from spec\n\t\t\t\t\tif (\n\t\t\t\t\t\tattributes[EXCEPTION_TYPE] ||\n\t\t\t\t\t\tattributes[EXCEPTION_MESSAGE]\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.addEvent('exception', attributes, now);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`Failed to record an exception ${exception}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsetAttribute(key, value) {\n\t\t\t\t\tif (_ended) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t// https://opentelemetry.io/docs/concepts/signals/traces/#attributes\n\t\t\t\t\tif (!isValidAttributeKey(key)) {\n\t\t\t\t\t\tconsole.warn(`Invalid attribute key: ${key}`);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (!isValidAttributeValue(value)) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`Invalid attribute value set for key: ${key}`\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.attributes[key] = value;\n\t\t\t\t},\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tid: INVALID_SPAN_ID,\n\t\t\t\ttraceId: INVALID_TRACE_ID,\n\t\t\t\tlinks: [],\n\t\t\t\tevents: [],\n\t\t\t\tattributes: {},\n\t\t\t\tstatus: 0,\n\t\t\t\tname,\n\t\t\t\tstartTime: null,\n\t\t\t\tendTime: null,\n\t\t\t\tparentSpanId: null,\n\t\t\t\tsetStatus: noop,\n\t\t\t\taddEvent: noop,\n\t\t\t\tend: noop,\n\t\t\t\trecordException: noop,\n\t\t\t\tsetAttribute: noop,\n\t\t\t};\n\t\t}\n\t};\n}\n","import { defaultTraceParent, createTraceId } from './traceparent';\nimport { get as getConfigValue } from './config';\nimport getItemMetadata from './getItemMetadata';\n\nexport default function createTracker(exporter) {\n\treturn function track(name, options = {}) {\n\t\tif (!getConfigValue('enableTrack')) return;\n\n\t\tconst { attributes, time = Date.now(), traceId } = options;\n\t\tconst { page, user, application } = getItemMetadata();\n\t\tconst event = {\n\t\t\tname,\n\t\t\ttype: 'usage',\n\t\t\tattributes,\n\t\t\tapplication,\n\t\t\tuser,\n\t\t\tpage,\n\t\t\ttimestamp: time,\n\t\t\ttraceId: traceId || createTraceId(),\n\t\t\tdocumentTraceParent: defaultTraceParent,\n\t\t};\n\n\t\texporter(event);\n\t};\n}\n","import { defaultTraceParent, createTraceId } from './traceparent';\nimport { make } from './tctx';\nimport { get as getConfigValue } from './config';\nimport getItemMetadata from './getItemMetadata';\n\nconst isEnabled = (type) => {\n\tswitch (type) {\n\t\tcase 'counter':\n\t\t\treturn getConfigValue('enableCounter');\n\t\t\tbreak;\n\t\tcase 'gauge':\n\t\t\treturn getConfigValue('enableGauge');\n\t\t\tbreak;\n\t\tcase 'histogram':\n\t\t\treturn getConfigValue('enableHistogram');\n\t\t\tbreak;\n\t}\n};\n\nconst createMetric = (name, options, type, cb) => {\n\tconst id = make().parent_id;\n\n\treturn function metric(value, attributes) {\n\t\tif (!isEnabled(type)) return;\n\n\t\tif (attributes)\n\t\t\toptions.attributes = { ...options.attributes, ...attributes };\n\n\t\tcb({\n\t\t\t...options,\n\t\t\tid,\n\t\t\tname,\n\t\t\ttype,\n\t\t\tvalue,\n\t\t\ttraceId: options.traceId || createTraceId(),\n\t\t});\n\t};\n};\n\nconst applyAppUserAttributes = (metric) => {\n\tif (!metric.attributes) metric.attributes = {};\n\n\tconst { page, application, user } = getItemMetadata();\n\n\tmetric.timestamp = Date.now();\n\tmetric.application = application;\n\tmetric.user = user;\n\tmetric.page = page;\n\tmetric.documentTraceParent = defaultTraceParent;\n\n\treturn metric;\n};\n\nexport default function createMetrics(exporter) {\n\tconst metricCallback = (metric) => exporter(applyAppUserAttributes(metric));\n\n\treturn {\n\t\tcreateCounter(name, options = {}) {\n\t\t\treturn createMetric(name, options, 'counter', metricCallback);\n\t\t},\n\t\tcreateGauge(name, options = {}) {\n\t\t\treturn createMetric(name, options, 'gauge', metricCallback);\n\t\t},\n\t\tcreateHistogram(name, options = {}) {\n\t\t\treturn createMetric(name, options, 'histogram', metricCallback);\n\t\t},\n\t};\n}\n","import { defaultTraceParent, createTraceId } from './traceparent';\nimport { get as getConfigValue } from './config';\nimport getItemMetadata from './getItemMetadata';\n\nconst observedScrollElements = new Set();\nobservedScrollElements.add(window);\n\nconst isEnabled = (type) => {\n\tif (!getConfigValue('enableInteractions')) return false;\n\n\tswitch (type) {\n\t\tcase 'move':\n\t\t\treturn getConfigValue('enableMousemoveInteractions');\n\t\tcase 'scroll':\n\t\t\treturn getConfigValue('enableScrollInteractions');\n\t\tcase 'keypress':\n\t\t\treturn getConfigValue('enableKeypressInteractions');\n\t\tcase 'click':\n\t\t\treturn getConfigValue('enableClickInteractions');\n\t}\n};\n\nexport default function initInteractionsTracker(exporter) {\n\tif (!getConfigValue('enableInteractions')) return false;\n\tconst movementInterval = 100;\n\tconst resizeInterval = 100;\n\tconst scrollInterval = 100;\n\n\tlet lastResize = 0;\n\tlet windowWidth = window.innerWidth;\n\tlet windowHeight = window.innerHeight;\n\tlet pageWidth = document.documentElement.scrollWidth;\n\tlet pageHeight = document.documentElement.scrollHeight;\n\n\twindow.addEventListener('resize', () => {\n\t\tconst now = Date.now();\n\t\tif (now > lastResize + resizeInterval) {\n\t\t\twindowWidth = window.innerWidth;\n\t\t\twindowHeight = window.innerHeight;\n\t\t\tpageWidth = document.documentElement.scrollWidth;\n\t\t\tpageHeight = document.documentElement.scrollHeight;\n\t\t\tlastResize = now;\n\t\t}\n\t});\n\n\tconst createEvent = (name, e) => {\n\t\tconst { clientX, clientY, pageX, pageY, screenX, screenY, target } = e;\n\t\tconst { page, user, application } = getItemMetadata();\n\n\t\treturn {\n\t\t\tattributes: {\n\t\t\t\tclientX,\n\t\t\t\tclientY,\n\t\t\t\tpageX,\n\t\t\t\tpageY,\n\t\t\t\tscreenX,\n\t\t\t\tscreenY,\n\t\t\t\ttarget: target.tagName.toLowerCase(),\n\t\t\t\twindowWidth,\n\t\t\t\twindowHeight,\n\t\t\t\tpageWidth,\n\t\t\t\tpageHeight,\n\t\t\t\tscrollTop: name === 'scroll' ? target.scrollTop : undefined,\n\t\t\t},\n\t\t\tname,\n\t\t\tapplication,\n\t\t\tuser,\n\t\t\tpage,\n\t\t\ttype: 'interaction',\n\t\t\ttimestamp: Date.now(),\n\t\t\ttraceId: createTraceId(),\n\t\t\tdocumentTraceParent: defaultTraceParent,\n\t\t};\n\t};\n\n\tobservedScrollElements.forEach((el) => {\n\t\tlet lastScroll = 0;\n\t\tel.addEventListener('scroll', (e) => {\n\t\t\tif (!isEnabled('scroll')) return;\n\t\t\tconst now = Date.now();\n\t\t\tif (now > lastScroll + scrollInterval) {\n\t\t\t\tconst event = createEvent('scroll', e);\n\t\t\t\tlastScroll = now;\n\t\t\t\texporter(event);\n\t\t\t}\n\t\t});\n\t});\n\n\tlet lastMovement = 0;\n\tdocument.addEventListener('mousemove', (e) => {\n\t\tif (!isEnabled('move')) return;\n\t\tconst now = Date.now();\n\t\tif (now > lastMovement + movementInterval) {\n\t\t\tconst event = createEvent('mousemove', e);\n\t\t\tlastMovement = now;\n\t\t\texporter(event);\n\t\t}\n\t});\n\n\tdocument.addEventListener('click', (e) => {\n\t\tif (!isEnabled('click')) return;\n\t\tconst event = createEvent('click', e);\n\t\texporter(event);\n\t});\n\n\tdocument.addEventListener('keypress', (e) => {\n\t\tif (!isEnabled('keypress')) return;\n\t\tconst event = createEvent('keypress', e);\n\t\texporter(event);\n\t});\n}\n","// const observers = new Set();\n// export default observers;\n\nconst globalKey = 'now.__SNANALYTICS_OBSERVER_SET__';\nconst globalObj = typeof window !== 'undefined' ? window : globalThis;\n\nif (!globalObj[globalKey]) {\n\tglobalObj[globalKey] = new Set();\n}\n\nconst observers = globalObj[globalKey];\n\nexport default observers;\n","const values = {\n\tevents: [],\n\tflushed: false,\n};\n\nexport const set = (key, value) => (values[key] = value);\n\nexport const get = (key) => values[key];\n","import { get as getConfigValue } from './config';\nimport observers from './observers';\nimport { get } from './queuedEvents';\n\nconst notifyTraceSubscriber = ({\n\ttype,\n\tid,\n\ttraceId,\n\tlinks,\n\tevents,\n\tstatus,\n\tattributes,\n\tapplication,\n\tuser,\n\tpage,\n\tname,\n\tdocumentTraceParent,\n\tstartTime,\n\tparentSpanId,\n\tendTime,\n\tduration,\n\tkind,\n}) => {\n\tobservers.forEach((observer) =>\n\t\tobserver({\n\t\t\ttype,\n\t\t\tid,\n\t\t\ttraceId,\n\t\t\tlinks,\n\t\t\tevents,\n\t\t\tstatus,\n\t\t\tattributes,\n\t\t\tapplication,\n\t\t\tuser,\n\t\t\tpage,\n\t\t\tname,\n\t\t\tdocumentTraceParent,\n\t\t\tstartTime,\n\t\t\tparentSpanId,\n\t\t\tendTime,\n\t\t\tduration,\n\t\t\tkind,\n\t\t})\n\t);\n};\n\nexport default function exporter(event) {\n\tconst debug = getConfigValue('debug');\n\n\tif (debug) console.dir(event);\n\n\tif (event.type === 'trace') {\n\t\tnotifyTraceSubscriber(event);\n\t\treturn;\n\t}\n\n\tobservers.forEach((observer) => observer(event));\n}\n","import { set as setConfigValue } from './config';\nimport createTracer from './createTracer';\nimport createTracker from './createTracker';\nimport createMetrics from './createMetrics';\nimport { set as setPage } from './page';\nimport initInteractionsTracker from './initInteractionsTracker';\nimport exporter from './exporter';\n\nexport { setPage as page };\n\nexport default function createAnalyticsApi(apiConfig) {\n\tfor (const k in apiConfig) setConfigValue(k, apiConfig[k]);\n\n\tsetPage();\n\n\tinitInteractionsTracker(exporter);\n\treturn {\n\t\ttrace: createTracer(exporter),\n\t\ttrack: createTracker(exporter),\n\t\tmetrics: createMetrics(exporter),\n\t};\n}\n","import observers from './observers';\n\nexport default function addObserver(observer) {\n\tobservers.add(observer);\n\treturn () => observers.delete(observer);\n}\n","import { get, set } from './queuedEvents';\n\nexport default function getQueuedEvents() {\n\tconst queuedEvents = [...get('events')];\n\n\tset('flushed', true);\n\tset('events', []);\n\n\treturn queuedEvents;\n}\n","import { INVALID_SPAN_ID, INVALID_TRACE_ID } from './constants';\n\nconst VALID_TRACE_ID_REGEX = /^([0-9a-f]{32})$/i;\nconst VALID_SPAN_ID_REGEX = /^[0-9a-f]{16}$/i;\n\nexport function isValidTraceId(traceId) {\n\treturn VALID_TRACE_ID_REGEX.test(traceId) && traceId !== INVALID_TRACE_ID;\n}\n\nexport function isValidSpanId(spanId) {\n\treturn VALID_SPAN_ID_REGEX.test(spanId) && spanId !== INVALID_SPAN_ID;\n}\n\nexport function isSpanContextValid(spanContext) {\n\treturn (\n\t\tisValidTraceId(spanContext.traceId) && isValidSpanId(spanContext.spanId)\n\t);\n}\n","import {\n\tcreateAnalyticsApi,\n\tsetUser,\n\tgetUser,\n\tsetPage,\n\tgetPage,\n\tsetConfigValue,\n\tgetConfigValue,\n\tonEvent,\n\tcreateTraceParent,\n\tcreateTraceId,\n\tcreateTraceParentHeader,\n\tgetQueuedEvents,\n\tsetApplication,\n\tgetApplication,\n\tisSpanContextValid,\n\tisValidSpanId,\n\tisValidTraceId,\n} from '@servicenow/ui-analytics-core';\n\nconst {\n\ttrace,\n\ttrack,\n\tmetrics: { createCounter, createGauge, createHistogram },\n} = createAnalyticsApi();\n\nexport { trace };\nexport { track };\nexport { createCounter };\nexport { createGauge };\nexport { createHistogram };\nexport { setUser };\nexport { getUser };\nexport { setPage };\nexport { getPage };\nexport { setConfigValue };\nexport { getConfigValue };\nexport { onEvent };\nexport { createTraceParent };\nexport { createTraceId };\nexport { createTraceParentHeader };\nexport { getQueuedEvents };\nexport { setApplication };\nexport { getApplication };\nexport { isSpanContextValid };\nexport { isValidSpanId };\nexport { isValidTraceId };\n","export var LogLevel;\n(function (LogLevel) {\n\tLogLevel[(LogLevel['debug'] = 0)] = 'debug';\n\tLogLevel[(LogLevel['info'] = 1)] = 'info';\n\tLogLevel[(LogLevel['warn'] = 2)] = 'warn';\n\tLogLevel[(LogLevel['error'] = 3)] = 'error';\n})(LogLevel || (LogLevel = {}));\nexport var TrackingLevel;\n(function (TrackingLevel) {\n\tTrackingLevel['Disabled'] = 'Disabled';\n\tTrackingLevel['Basic'] = 'Basic';\n\tTrackingLevel['Full'] = 'Full';\n\tTrackingLevel['Essential'] = 'Essential';\n})(TrackingLevel || (TrackingLevel = {}));\nexport var UXCollectionMode;\n(function (UXCollectionMode) {\n\tUXCollectionMode['Both'] = 'Both';\n\tUXCollectionMode['Valk'] = 'Valk';\n\tUXCollectionMode['Legacy'] = 'Legacy';\n})(UXCollectionMode || (UXCollectionMode = {}));\n","/**\n * Check if the given argument is `undefined`\n */\nexport const isUndefined = (value) => typeof value === 'undefined';\n/**\n * Check if the given argument is not `undefined`\n */\nexport const isDefined = (value) => !isUndefined(value);\n/**\n * Checks if the given argument is null or undefined\n */\nexport const isNullOrUndefined = (value) =>\n\tisUndefined(value) || value === null;\n/**\n * Checks if the given argument is string\n */\nexport const isString = (value) => typeof value === 'string';\n/**\n * Checks if the given argument is a string and is also not all whitespace\n */\nexport const isNonEmptyString = (value) =>\n\tisString(value) && Boolean(value.trim());\n/**\n * Checks if the given argument is a number. NaN is not considered as a number\n */\nexport const isNumber = (value) =>\n\ttypeof value === 'number' && !Number.isNaN(value);\n/**\n * Checks if the given argument is an integer. Uses `isNumber` and a modulo check to eliminate floats\n */\nexport const isInteger = (value) => isNumber(value) && value % 1 === 0;\n/**\n * Checks if the given argument is a positive integer.\n */\nexport const isPositiveInteger = (value, allowZero = false) =>\n\tisInteger(value) && (value > 0 || (allowZero && value === 0));\n/**\n * Checks if the given argument is a boolean\n */\nexport const isBoolean = (value) => typeof value === 'boolean';\n/**\n * Checks if the given argument is an instance of a date\n */\nexport const isDate = (value) => value instanceof Date;\n/**\n * Checks if the given argument is a plain object. Returns false for function and array\n */\nexport const isObject = function (value) {\n\treturn value !== null && typeof value === 'object' && !Array.isArray(value);\n};\n/**\n * Checks if the given argument is an array\n */\nexport const isArray = (value) => Array.isArray(value);\n/**\n * Checks if the given argument is a function\n */\nexport const isFunction = (value) => typeof value === 'function';\n/**\n * Checks if the given argument is a promise\n */\nexport const isPromise = (value) =>\n\t!!value && isFunction(value.then) && isFunction(value.catch);\n/**\n * Checks if `value` is an actual value of the enum `enumClass`\n */\nexport const isEnum = (enumClass, value) =>\n\tObject.values(enumClass).includes(value);\n","// See: https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\n// Important to call this method at the end of each constructor of a class that extends Error\nfunction setSelfPrototype(obj, className) {\n\t// Set the prototype explicitly.\n\tObject.setPrototypeOf(obj, className.prototype);\n\tobj.name = obj.constructor.name;\n}\n/**\n * Base error with `SNAnalytics` name at the beginning of the message\n */\nexport class SNError extends Error {\n\tconstructor(message) {\n\t\tsuper(`[SNAnalytics] ${message}`);\n\t\tsetSelfPrototype(this, SNError);\n\t}\n}\n/**\n * Used for a custom TypeError\n */\nexport class SNTypeError extends SNError {\n\tconstructor(message) {\n\t\tsuper(message);\n\t\tsetSelfPrototype(this, SNTypeError);\n\t}\n}\n/**\n * Used for server calls errors.\n * Holds the http error code on `errorCode` property.\n */\nexport class HttpError extends SNError {\n\tconstructor(errorCode) {\n\t\tsuper(`Server call failed: ${errorCode}`);\n\t\tsetSelfPrototype(this, HttpError);\n\t\tthis.errorCode = errorCode;\n\t}\n}\n","/**\n * Returns a new string without trailing slashes\n */\nimport Consts from '../consts';\n\nexport const removeTrailingSlash = (value) => value.replace(/\\/+$/, '');\n\nconst getRandomHexadecimal = () =>\n\tConsts.inBrowser && window.crypto\n\t\t? window.crypto.getRandomValues(new Uint8Array(1))[0] & 15 // Use crypto whenever possible\n\t\t: (Math.random() * 16) | 0; // Fallback to Math.random\n// https://stackoverflow.com/a/2117523\nconst uuidV4 = () =>\n\t[1e7, 1e3, 4e3, 8e3, 1e11]\n\t\t.join('-')\n\t\t.replace(/[018]/g, (c) =>\n\t\t\t(Number(c) ^ (getRandomHexadecimal() >> (Number(c) / 4))).toString(\n\t\t\t\t16\n\t\t\t)\n\t\t);\n\n/**\n * Get new guid without dashes and ensure lowercase\n */\nexport const getGuid = () => uuidV4().replace(/-/g, '').toLowerCase();\n","import { isNonEmptyString } from './validators';\nimport { LogLevel, TrackingLevel } from './types';\nimport { SNTypeError } from './errors';\nimport { removeTrailingSlash } from './utils/string-utils';\n\nexport default class Consts {\n\tstatic set inBrowser(value) {\n\t\tthis.inBrowserWindow = value;\n\t}\n\tstatic get inBrowser() {\n\t\treturn this.inBrowserWindow;\n\t}\n\tstatic set baseUrl(url) {\n\t\tif (!isNonEmptyString(url)) {\n\t\t\tthrow new SNTypeError('Server endpoint cannot be empty');\n\t\t}\n\t\tthis.baseServerUrl = removeTrailingSlash(url);\n\t}\n\tstatic get baseUrl() {\n\t\treturn this.baseServerUrl;\n\t}\n}\nConsts.instanceDomainName = '';\n// Read `process.env.*` defined on webpack plugin `EnvironmentPlugin` at `webpack.{common|dev|prod}.ts` files\nConsts.baseServerUrl = 'https://api-appsee.service-now.com';\n// `process.env.NODE_ENV` is defined when using `mode` in webpack config (value is `mode`)\nConsts.IS_PRODUCTION = true;\nConsts.inBrowserWindow =\n\t(typeof window !== 'undefined' && typeof document !== 'undefined') ||\n\t(typeof globalThis !== 'undefined' &&\n\t\ttypeof globalThis.window !== 'undefined');\nConsts.VERSION = '3.2.6-janus.2';\nConsts.DEFAULT_CLIENT_ID = '0';\nConsts.DEFAULT_LOG_LEVEL = Consts.IS_PRODUCTION\n\t? LogLevel.error\n\t: LogLevel.debug;\nConsts.DEFAULT_TRACKING_CONSENT = TrackingLevel.Disabled;\nConsts.MAX_METRIC_CALL_ATTEMPTS = 2;\nConsts.SYSTEM_PROPERTY_PREFIX = 'SN_';\nConsts.LOGGER_PREFIX = '[SNAnalytics]';\n","import { isNumber, isString } from '../validators';\n/**\n * Returns true is `obj` has no entries\n */\nexport const isEmptyObject = (obj) => Object.keys(obj).length === 0;\n/**\n * Returns a subset of obj without the entries that have falsy values\n */\nexport const removeFalsyEntries = (obj) =>\n\tObject.fromEntries(\n\t\tObject.entries(obj).filter(([, /* key */ value]) => Boolean(value))\n\t);\n/**\n * Creates an object with the same values as `obj` and keys generated by\n * running each own enumerable string keyed property of object through the callback.\n * @param obj Object to map\n * @param fn The function `fn` is called one time for each element in the object and returns a ney key.\n */\nexport const mapKeys = (obj, fn) =>\n\tObject.fromEntries(\n\t\tObject.entries(obj).map(([key, value]) => [fn(value, key), value])\n\t);\n/**\n * Creates an object with the same keys as `obj` and values generated by\n * running each own enumerable string keyed property of object through the callback.\n * @param obj Object to map\n * @param fn The function `fn` is called one time for each element in the object and returns a new value.\n */\nexport const mapValues = (obj, fn) =>\n\tObject.fromEntries(\n\t\tObject.entries(obj).map(([key, value]) => [key, fn(value, key)])\n\t);\n/**\n * Returns a valid value of `enumObj` if it exists or `undefined` if it's not\n * @param keyOrValue Key or value of `enumObj`\n * @param enumObj Enum class\n */\nexport const tryGetEnumValue = (keyOrValue, enumObj, ignoreCase = false) => {\n\ttry {\n\t\t// Build mappings from key to value and from value to value\n\t\t// Use `Map` and not `object` since Map allow a key to be numeric\n\t\tconst mapKeyToValue = new Map();\n\t\tconst mapValueToValue = new Map();\n\t\tObject.entries(enumObj).forEach(([key, value]) => {\n\t\t\t// Filter out reverse mapped numeric values so we won't get mapping from value to key as well\n\t\t\tif (!isNumber(parseInt(key, 10))) {\n\t\t\t\tmapKeyToValue.set(ignoreCase ? key.toLowerCase() : key, value);\n\t\t\t\tmapValueToValue.set(\n\t\t\t\t\tignoreCase && isString(value) ? value.toLowerCase() : value,\n\t\t\t\t\tvalue\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t\tconst searchKeyOrValue =\n\t\t\tignoreCase && isString(keyOrValue)\n\t\t\t\t? keyOrValue.toLowerCase()\n\t\t\t\t: keyOrValue;\n\t\treturn (\n\t\t\tmapKeyToValue.get(searchKeyOrValue) ??\n\t\t\tmapValueToValue.get(searchKeyOrValue)\n\t\t);\n\t} catch {\n\t\treturn undefined;\n\t}\n};\n/**\n * Check if value is valid or not. If it's valid returns the value, else returns the default value\n * @param value Value to validate\n * @param defaultValue Valid default value\n * @param validator Validator function that accepts the value and return a boolean indicating if valid\n */\nexport const getValueOrDefault = (value, defaultValue, validator) =>\n\tvalidator(value) ? value : defaultValue;\n/**\n * For each key of `defaultObj` validates the value of `obj`. If the value is not valid replace it with default value\n * @param obj Object to validate\n * @param defaultObj Object with valid default values\n * @param validatorObj Object with validators. Each key has a validator function that returns true if the value is valid\n */\nexport const getValuesOrDefaults = (obj, defaultObj, validatorObj) =>\n\tmapValues(defaultObj, (defaultValue, key) =>\n\t\tgetValueOrDefault(obj[key], defaultValue, validatorObj[key])\n\t);\n","import Consts from './consts';\nimport { LogLevel } from './types';\nimport { isUndefined } from './validators';\nimport { tryGetEnumValue } from './utils/object-utils';\n/**\n * Utility class for logging\n */\nclass Logger {\n\tconstructor() {\n\t\t/**\n\t\t * Mapping between log level and the the methods it enables.\n\t\t * Every log level also supports lower levels' methods (i.e. level 1 supports `debug` and `info`)\n\t\t */\n\n\t\tthis.logMethods = {\n\t\t\t0: ['debug'],\n\t\t\t1: ['info'],\n\t\t\t2: ['warn'],\n\t\t\t3: ['error'],\n\t\t};\n\t\tthis.handleLogLevel(Consts.DEFAULT_LOG_LEVEL);\n\t\ttry {\n\t\t\tif (Consts.inBrowser) {\n\t\t\t\t// Only for supported browsers: change of log level will be implemented on every tab\n\t\t\t\tthis.channel = new BroadcastChannel('SNAnalytics.Logger');\n\t\t\t\tthis.channel.onmessage = this.onBroadcastMessage.bind(this);\n\t\t\t}\n\t\t} catch {\n\t\t\tthis.debug('Broadcast channel is not supported');\n\t\t}\n\t}\n\t// Not using arrow function so `Catch` decorator will have proper context.\n\t// Since it's an not arrow function, handler needs to be be bounded so `this` will be the Logger instance\n\tonBroadcastMessage(ev) {\n\t\tthis.handleLogLevel(ev.data.logLevel);\n\t}\n\tnotify(logLevel) {\n\t\t// Notify potential other tabs that log level was changed\n\t\treturn this.channel?.postMessage({ logLevel });\n\t}\n\t/**\n\t * Overrides the logger methods according to the log level\n\t * @param logLevel Accepts LogLevel numeric values or string keys\n\t * @param notify If true, will try notify other tabs about the log level change\n\t */\n\thandleLogLevel(logLevel, notify = false) {\n\t\t// Validate that logLevel is either key or a value\n\t\tconst validLogLevel = tryGetEnumValue(logLevel, LogLevel, true);\n\t\tif (isUndefined(validLogLevel)) {\n\t\t\tthis.warn('Ignoring invalid log level:', logLevel);\n\t\t\treturn;\n\t\t}\n\t\t// Same log level - do nothing\n\t\tif (this.logLevel === validLogLevel) {\n\t\t\treturn;\n\t\t}\n\t\t// Override stubs\n\t\tfor (const [level, methods] of Object.entries(this.logMethods)) {\n\t\t\tfor (const method of methods) {\n\t\t\t\t// Enable the methods according to log level\n\t\t\t\tthis[method] =\n\t\t\t\t\tparseInt(level, 10) >= validLogLevel\n\t\t\t\t\t\t? console[method].bind(console, Consts.LOGGER_PREFIX) // new bound console method\n\t\t\t\t\t\t: () => {};\n\t\t\t}\n\t\t}\n\t\tif (notify) {\n\t\t\tthis.notify(validLogLevel);\n\t\t}\n\t\t// Save the new log level\n\t\tthis.logLevel = validLogLevel;\n\t}\n\tsetDebugLevel(logLevel) {\n\t\tthis.handleLogLevel(logLevel, true);\n\t}\n\t// Log method stubs, signature is same as console's (even kept their name for good measures).\n\t// These methods will be overridden every log level change\n\t// The comment '/* istanbul ignore next */' is used to remove those lines from coverage report\n\t/* istanbul ignore next */\n\tdebug(message, ...optionalParams) {}\n\t/* istanbul ignore next */\n\tinfo(message, ...optionalParams) {}\n\t/* istanbul ignore next */\n\twarn(message, ...optionalParams) {}\n\t/* istanbul ignore next */\n\terror(message, ...optionalParams) {}\n}\nexport default new Logger();\n","/**\n * Returns the ISO representation of time\n */\nexport const toISOString = (time) => new Date(time).toISOString();\n/**\n * Returns the date as a string on format 'dd/MM/yyyy HH:mm:ss'\n */\nexport const toDateString = (date) =>\n\tdate.toLocaleString('en-GB', { timeZone: 'UTC' }).replace(/,/g, '');\n/**\n * Get now time as a number\n */\nexport const getTime = () => new Date().getTime();\nlet lastTime = getTime();\n/**\n * Get unique now time as a number\n */\nexport const getUniqueTime = () => {\n\tconst now = getTime();\n\tlastTime = lastTime >= now ? lastTime + 1 : now;\n\treturn lastTime;\n};\n","import {\n\tisString,\n\tisInteger,\n\tisBoolean,\n\tisEnum,\n\tisPositiveInteger,\n\tisNullOrUndefined,\n} from '../../common/validators';\nimport { LogLevel } from '../../common/types';\nimport Consts from '../../common/consts';\nimport { getValuesOrDefaults } from '../../common/utils/object-utils';\nimport { getTime } from '../../common/utils/date-utils';\nimport { getGuid } from '../../common/utils/string-utils';\n\nconst DEFAULT_CONFIG_RESPONSE = {\n\tClientId: Consts.DEFAULT_CLIENT_ID,\n\tSessionId: '',\n\tLogLevel: undefined,\n\tMaxDataPointsPerHeartbeat: 1000,\n\tHeartbeatInterval: 15 * 1000,\n\tIdleTimeout: 30 * 60 * 1000,\n\tSessionTimeout: 4 * 60 * 60 * 1000,\n\tRecordMetadata: true,\n\tRequestId: '',\n\tAnalyticsChannelType: '',\n\tAnalyticsChannelNumber: -1,\n\tInstanceName: '',\n\tConfigReceivedTime: 0,\n\tConfigReloadTime: 0,\n\tSessionIdCreatedTime: 0,\n\tAppUserId: '',\n\tIgnorePerformanceData: false,\n\tIsGettingConfiguration: false,\n\tuxToken: '',\n\tg_ck: null,\n};\nconst CONFIG_RESPONSE_VALIDATOR = {\n\tClientId: isString,\n\tSessionId: isString,\n\tLogLevel: isEnum.bind(null, LogLevel),\n\tMaxDataPointsPerHeartbeat: isPositiveInteger,\n\tHeartbeatInterval: isPositiveInteger,\n\tIdleTimeout: isPositiveInteger,\n\tSessionTimeout: isPositiveInteger,\n\tAnalyticsChannelType: isString,\n\tAnalyticsChannelNumber: isInteger,\n\tInstanceName: isString,\n\tConfigReloadTime: isPositiveInteger,\n\tRecordMetadata: isBoolean,\n\tRequestId: isString,\n\tConfigReceivedTime: isInteger,\n\tSessionIdCreatedTime: isInteger,\n\tAppUserId: isString,\n\tIgnorePerformanceData: isBoolean,\n\tIsGettingConfiguration: isBoolean,\n\tuxToken: isString,\n\tg_ck: isString,\n};\nexport default class ConfigurationProvider {\n\tconstructor(store, apiKey, appUserIdProvider) {\n\t\tthis.store = store;\n\t\tthis.apiKey = apiKey;\n\t\tthis.appUserIdProvider = appUserIdProvider;\n\t\t// Try load configuration that may be on session storage (after refresh, navigation back, etc.)\n\t\tthis.configuration = this.buildConfiguration();\n\t\tthis.resetSessionIfNeeded(false);\n\t\t// Bind the method to the instance of the class\n\t\tthis.observeConfigurationChange =\n\t\t\tthis.observeConfigurationChange.bind(this);\n\t\t// Register the event listener\n\t\tif (Consts.inBrowser)\n\t\t\twindow.addEventListener('storage', this.observeConfigurationChange);\n\t}\n\t/**\n\t * Return a new valid full configuration using defaults config values if needed\n\t */\n\tbuildConfiguration() {\n\t\tconst config = {\n\t\t\t...getValuesOrDefaults(\n\t\t\t\tthis.store.get('config' /* StoreKey.Configuration */) || {},\n\t\t\t\tDEFAULT_CONFIG_RESPONSE,\n\t\t\t\tCONFIG_RESPONSE_VALIDATOR\n\t\t\t),\n\t\t\tLastServerResponseTime: isInteger(\n\t\t\t\tthis.store.get('srt' /* StoreKey.ServerResponseTime */)\n\t\t\t)\n\t\t\t\t? this.store.get('srt' /* StoreKey.ServerResponseTime */)\n\t\t\t\t: getTime(),\n\t\t\tApiKey: this.apiKey,\n\t\t\tLastDatapointQueuedTime: isInteger(\n\t\t\t\tthis.store.get('config' /* StoreKey.Configuration */)\n\t\t\t\t\t?.LastDatapointQueuedTime\n\t\t\t)\n\t\t\t\t? this.store.get('config' /* StoreKey.Configuration */)\n\t\t\t\t\t\t?.LastDatapointQueuedTime\n\t\t\t\t: getTime(),\n\t\t};\n\t\tif (config.SessionId === undefined || config.SessionId.length !== 32) {\n\t\t\tconfig.SessionId = getGuid();\n\t\t\tconfig.SessionIdCreatedTime = getTime();\n\t\t}\n\t\t//g_ck is unique for a glide session, it changes as soon as a glide session is over\n\t\tif (\n\t\t\tconfig.g_ck === undefined ||\n\t\t\tconfig.g_ck === null ||\n\t\t\tconfig.g_ck === ''\n\t\t)\n\t\t\tconfig.g_ck = window.g_ck;\n\t\tthis.store.remove('config' /* StoreKey.Configuration */);\n\t\tthis.store.set('config' /* StoreKey.Configuration */, config);\n\t\treturn config;\n\t}\n\tisIdleSessionTimedOut() {\n\t\treturn (\n\t\t\tgetTime() - this.configuration.LastDatapointQueuedTime >\n\t\t\tthis.configuration.IdleTimeout\n\t\t);\n\t}\n\tisSessionTimedOut() {\n\t\treturn (\n\t\t\tgetTime() - this.configuration.SessionIdCreatedTime >=\n\t\t\tthis.configuration.SessionTimeout\n\t\t);\n\t}\n\tisInvalidSession() {\n\t\treturn (\n\t\t\tthis.configuration.SessionId === undefined ||\n\t\t\tthis.configuration.SessionId.length !== 32 ||\n\t\t\tthis.configuration.g_ck === null ||\n\t\t\tthis.isIdleSessionTimedOut() ||\n\t\t\tthis.isSessionTimedOut()\n\t\t);\n\t}\n\tresetSessionIfNeeded(shouldForceReset) {\n\t\t// If there is session id, we have a valid session running that could get a Timeout\n\t\tif (this.isInvalidSession() || shouldForceReset) {\n\t\t\tthis.resetSession();\n\t\t}\n\t}\n\tisInvalidConfiguration() {\n\t\treturn (\n\t\t\tgetTime() - this.configuration.ConfigReceivedTime >\n\t\t\tthis.configuration.ConfigReloadTime\n\t\t);\n\t}\n\treloadConfigurationIfNeeded() {\n\t\treturn this.isInvalidConfiguration();\n\t}\n\t/**\n\t * Return the value of a configuration key\n\t * @param key Configuration key\n\t */\n\tget(key) {\n\t\treturn this.configuration[key];\n\t}\n\t/**\n\t * Reset the session id and last server response time.\n\t */\n\tresetSession() {\n\t\tconst config = this.store.get('config' /* StoreKey.Configuration */)\n\t\t\t? this.store.get('config' /* StoreKey.Configuration */)\n\t\t\t: this.configuration;\n\t\tconfig.LastServerResponseTime = getTime();\n\t\tconfig.SessionId = getGuid();\n\t\tconfig.g_ck = window.g_ck;\n\t\tconfig.SessionIdCreatedTime = getTime();\n\t\tthis.store.remove('config' /* StoreKey.Configuration */);\n\t\tthis.store.set('config' /* StoreKey.Configuration */, config);\n\t\tthis.configuration = config;\n\t}\n\t/**\n\t * Handle start of a new session in configuration data\n\t * @param requestId Create a new config for the request id sent\n\t */\n\tstartNewConfiguration(requestId) {\n\t\t// Set these fields to be applied when config is received\n\t\tif (this.configuration) {\n\t\t\tthis.configuration.IsGettingConfiguration = true;\n\t\t\tthis.configuration.RequestId = requestId;\n\t\t\tthis.configuration.AppUserId = this.appUserIdProvider.get();\n\t\t\tconst instanceConfigCompleted = {\n\t\t\t\tIsGettingConfiguration:\n\t\t\t\t\tthis.configuration.IsGettingConfiguration,\n\t\t\t\tRequestId: this.configuration.RequestId,\n\t\t\t\tAppUserId: this.configuration.AppUserId,\n\t\t\t};\n\t\t\tif (this.store.get('config' /* StoreKey.Configuration */)) {\n\t\t\t\tconst updatedConfig = Object.assign(\n\t\t\t\t\tthis.store.get('config' /* StoreKey.Configuration */),\n\t\t\t\t\tinstanceConfigCompleted\n\t\t\t\t);\n\t\t\t\tthis.store.set(\n\t\t\t\t\t'config' /* StoreKey.Configuration */,\n\t\t\t\t\tupdatedConfig\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\t/**\n\t * Validate the config response received from the server\n\t * @returns true if valid config\n\t */\n\tisValidConfigResponse(config) {\n\t\tconst mandatoryKeys = [\n\t\t\t'HeartbeatInterval',\n\t\t\t'SessionTimeout',\n\t\t\t'MaxDataPointsPerHeartbeat',\n\t\t];\n\t\t// Make sure all mandatory fields exist\n\t\tfor (const key of mandatoryKeys) {\n\t\t\tif (!(key in config)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * Saves a new config response and construct a new configuration from it\n\t * @param config New config response\n\t */\n\tfillWithJson(config) {\n\t\tconst newConfig = {\n\t\t\t...config,\n\t\t\tRequestId: this.configuration.RequestId,\n\t\t\tAppUserId: this.configuration.AppUserId,\n\t\t\tConfigReceivedTime: getTime(),\n\t\t};\n\t\tthis.store.set('config' /* StoreKey.Configuration */, newConfig);\n\t\tthis.configuration = this.store.get(\n\t\t\t'config' /* StoreKey.Configuration */\n\t\t);\n\t}\n\t/**\n\t * Saves current time as the last successful interaction with server\n\t */\n\tupdateServerResponseTime() {\n\t\tconst time = getTime();\n\t\tthis.configuration.LastServerResponseTime = time;\n\t\tthis.store.set('srt' /* StoreKey.ServerResponseTime */, time);\n\t}\n\t/**\n\t * Delete all relevant data exist on configuration\n\t */\n\tdeleteData() {\n\t\tthis.store.remove('srt' /* StoreKey.ServerResponseTime */);\n\t\tthis.store.remove('config' /* StoreKey.Configuration */);\n\t\tthis.configuration = this.buildConfiguration();\n\t}\n\t/**\n\t * Delete session data if exist on configuration\n\t */\n\tdeleteSessionData(sessionId) {\n\t\tif (sessionId === this.configuration.SessionId) {\n\t\t\tthis.deleteData();\n\t\t}\n\t}\n\t/**\n\t * Update Last DataPoint Queued Time in configuration object in memory.\n\t * Debounce logic is WIP and commented out because of issues.\n\t */\n\tupdateLastDatapointQueuedTime() {\n\t\tif (this.configuration) {\n\t\t\tthis.configuration.LastDatapointQueuedTime = getTime();\n\t\t\tconst updatedQueuedTime = {\n\t\t\t\tLastDatapointQueuedTime:\n\t\t\t\t\tthis.configuration.LastDatapointQueuedTime,\n\t\t\t};\n\t\t\tif (this.store.get('config' /* StoreKey.Configuration */)) {\n\t\t\t\tconst updatedConfig = Object.assign(\n\t\t\t\t\tthis.store.get('config' /* StoreKey.Configuration */),\n\t\t\t\t\tupdatedQueuedTime\n\t\t\t\t);\n\t\t\t\tthis.store.set(\n\t\t\t\t\t'config' /* StoreKey.Configuration */,\n\t\t\t\t\tupdatedConfig\n\t\t\t\t);\n\t\t\t}\n\t\t\t// this.updateConfigurationInLocalStorage();\n\t\t\t// this.configuration.LastDatapointQueuedTime = getTime();\n\t\t\t// // Debounce the localStorage update\n\t\t\t// if (this.debounceTimeout !== null) {\n\t\t\t//     clearTimeout(this.debounceTimeout);\n\t\t\t// }\n\t\t\t// this.debounceTimeout = setTimeout(() => {\n\t\t\t//     // Update configuration in localStorage\n\t\t\t//     this.updateConfigurationInLocalStorage();\n\t\t\t// }, this.DEBOUNCE_DELAY) as any; // Cast to any due to type incompatibility\n\t\t}\n\t}\n\t/**\n\t * Update InstanceConfigCallCompleted status in configuration object in memory.\n\t * Debounce logic is WIP and commented out because of issues.\n\t */\n\tupdateInstanceConfigCallInProgress(isInProgress) {\n\t\tif (this.configuration) {\n\t\t\tthis.configuration.IsGettingConfiguration = isInProgress;\n\t\t\tconst instanceConfigCompleted = {\n\t\t\t\tIsGettingConfiguration:\n\t\t\t\t\tthis.configuration.IsGettingConfiguration,\n\t\t\t};\n\t\t\tif (this.store.get('config' /* StoreKey.Configuration */)) {\n\t\t\t\tconst updatedConfig = Object.assign(\n\t\t\t\t\tthis.store.get('config' /* StoreKey.Configuration */),\n\t\t\t\t\tinstanceConfigCompleted\n\t\t\t\t);\n\t\t\t\tthis.store.set(\n\t\t\t\t\t'config' /* StoreKey.Configuration */,\n\t\t\t\t\tupdatedConfig\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\tgetMergedConfigurationWithConfigResponse(configResponse) {\n\t\tconst mergedConfiguration = Object.assign(\n\t\t\tthis.configuration,\n\t\t\tconfigResponse\n\t\t);\n\t\tmergedConfiguration.ConfigReloadTime = Number(\n\t\t\tthis.getValidConfigReloadTime(\n\t\t\t\tNumber(mergedConfiguration.ConfigReloadTime)\n\t\t\t)\n\t\t);\n\t\tmergedConfiguration.HeartbeatInterval = Number(\n\t\t\tmergedConfiguration.HeartbeatInterval\n\t\t);\n\t\tmergedConfiguration.IgnorePerformanceData =\n\t\t\tString(mergedConfiguration.IgnorePerformanceData).toLowerCase() ===\n\t\t\t'true';\n\t\tmergedConfiguration.RecordMetadata =\n\t\t\tString(mergedConfiguration.RecordMetadata).toLowerCase() === 'true';\n\t\tmergedConfiguration.IdleTimeout = Number(\n\t\t\tmergedConfiguration.IdleTimeout\n\t\t);\n\t\tmergedConfiguration.SessionTimeout = Number(\n\t\t\tmergedConfiguration.SessionTimeout\n\t\t);\n\t\tmergedConfiguration.MaxDataPointsPerHeartbeat = Number(\n\t\t\tmergedConfiguration.MaxDataPointsPerHeartbeat\n\t\t);\n\t\tmergedConfiguration.AnalyticsChannelType = String(\n\t\t\tmergedConfiguration.AnalyticsChannelType\n\t\t);\n\t\tmergedConfiguration.AnalyticsChannelNumber = Number(\n\t\t\tmergedConfiguration.AnalyticsChannelNumber\n\t\t);\n\t\tmergedConfiguration.InstanceName = String(\n\t\t\tmergedConfiguration.InstanceName\n\t\t);\n\t\treturn mergedConfiguration;\n\t}\n\tgetValidConfigReloadTime(milliseconds) {\n\t\tconst oneDayInMilliseconds = 24 * 60 * 60 * 1000; // 1 day in milliseconds\n\t\tconst oneHourInMilliseconds = 60 * 1000; // 1 hour in milliseconds\n\t\tif (\n\t\t\tisNullOrUndefined(milliseconds) ||\n\t\t\t!isInteger(milliseconds) ||\n\t\t\tmilliseconds >= oneDayInMilliseconds\n\t\t) {\n\t\t\treturn oneDayInMilliseconds; // Is null or undefined or Not a valid integer or negative value or greater than 1 day\n\t\t}\n\t\tif (milliseconds <= oneHourInMilliseconds) {\n\t\t\treturn oneHourInMilliseconds; // Duration within 1 hour\n\t\t}\n\t\treturn milliseconds; // Valid duration\n\t}\n\tobserveConfigurationChange(event) {\n\t\tif (\n\t\t\tevent.key ===\n\t\t\t\tthis.store.getStoreKey('config' /* StoreKey.Configuration */) &&\n\t\t\tevent.newValue !== null\n\t\t) {\n\t\t\ttry {\n\t\t\t\tthis.configuration = JSON.parse(event.newValue);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn('[Analytics] Failed to parse configuration change event:', error);\n\t\t\t\t// Keep existing configuration if parsing fails\n\t\t\t}\n\t\t}\n\t}\n}\n","/**\n * Hold mapping between full name and short name of `DataPoint`\n */\nexport var DataPointField;\n(function (DataPointField) {\n\tDataPointField['type'] = 't';\n\tDataPointField['timestamp'] = 'd';\n\tDataPointField['name'] = 'n';\n\tDataPointField['properties'] = 'p';\n})(DataPointField || (DataPointField = {}));\n","export function last(array) {\n\treturn array[array.length - 1];\n}\n","import {\n\tisArray,\n\tisNumber,\n\tisDate,\n\tisString,\n\tisBoolean,\n\tisNonEmptyString,\n} from '../validators';\nimport logger from '../logger';\nimport { toDateString } from './date-utils';\nimport Consts from '../consts';\n\nexport const addSystemPropertyPrefix = (key) =>\n\tConsts.SYSTEM_PROPERTY_PREFIX + key;\nexport const isSystemPropertyKey = (key) =>\n\tkey.startsWith(Consts.SYSTEM_PROPERTY_PREFIX);\nconst isValidProperty = (value, allowLists) => {\n\tif (value === null) {\n\t\treturn true;\n\t}\n\tif (isArray(value)) {\n\t\treturn allowLists;\n\t}\n\t// For numbers: Avoiding NAN, Infinity and -Infinity\n\tif (isNumber(value)) {\n\t\treturn value !== Infinity && value !== -Infinity;\n\t}\n\treturn isString(value) || isDate(value) || isBoolean(value);\n};\nconst transformToPropertyValue = (value) => {\n\tif (isDate(value)) {\n\t\treturn toDateString(value);\n\t}\n\t// Boolean is converted to string to comply with iOS\n\tif (isBoolean(value)) {\n\t\treturn value.toString();\n\t}\n\treturn value;\n};\n/**\n * Extract only the valid properties. log the invalid ones as errors\n */\nexport const getValidProperties = (properties, allowLists, allowNulls) => {\n\tconst validProperties = {};\n\tfor (let [key, value] of Object.entries(properties)) {\n\t\t// Ignore property that its key is only spaces\n\t\tif (!isNonEmptyString(key)) {\n\t\t\tlogger.error('Invalid property name:', key);\n\t\t\tcontinue;\n\t\t}\n\t\t// Ignore property that starts with our reserved system prefix\n\t\tif (isSystemPropertyKey(key)) {\n\t\t\tlogger.error('Invalid property prefix for name:', key);\n\t\t\tcontinue;\n\t\t}\n\t\t// Replace undefined with null or empty string, depends on what is allowed\n\t\tvalue = value ?? (allowNulls ? null : '');\n\t\tif (!isValidProperty(value, allowLists)) {\n\t\t\tlogger.error('Invalid value', value, 'for property', key);\n\t\t\tcontinue;\n\t\t}\n\t\tif (isArray(value)) {\n\t\t\tconst validArray = [];\n\t\t\tfor (const item of value) {\n\t\t\t\tif (!isString(item)) {\n\t\t\t\t\tlogger.error('Invalid value', item, 'for list', key);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tvalidArray.push(item);\n\t\t\t}\n\t\t\tvalidProperties[key] = validArray;\n\t\t} else {\n\t\t\tvalidProperties[key] = transformToPropertyValue(value);\n\t\t}\n\t}\n\treturn validProperties;\n};\n","import { DataPointField } from '../entities/data-point';\nimport { getUniqueTime } from '../../common/utils/date-utils';\nimport { last } from '../../common/utils/array-utils';\nimport { isDefined } from '../../common/validators';\nimport { mapKeys, isEmptyObject } from '../../common/utils/object-utils';\nimport { addSystemPropertyPrefix } from '../../common/utils/property-utils';\nimport dataContext from '../../data-context';\n/**\n * DataPoints\n */\nexport default class DataPointsProvider {\n\tconstructor(store, configurationProvider, appContextProvider) {\n\t\tthis.store = store;\n\t\tthis.configurationProvider = configurationProvider;\n\t\tthis.appContextProvider = appContextProvider;\n\t}\n\tremove() {\n\t\tthis.store.remove('data' /* StoreKey.DataPoints */);\n\t}\n\tget() {\n\t\treturn this.store.get('data' /* StoreKey.DataPoints */) || [];\n\t}\n\tset(queue) {\n\t\tif (queue.length) {\n\t\t\tthis.store.set('data' /* StoreKey.DataPoints */, queue);\n\t\t} else {\n\t\t\tthis.remove();\n\t\t}\n\t}\n\t/**\n\t * Create and add a new DataPoint the the queue\n\t * @param type Type of DataPoint to create\n\t * @param name Name identifier of the data point\n\t * @param optionalFields Optional fields to enrich the data point\n\t */\n\tadd(type, name, { properties, systemProperties, timestamp } = {}) {\n\t\t// All DataPoints have this basic mandatory fields\n\t\tconst dataPoint = {\n\t\t\t[DataPointField.type]: type,\n\t\t\t[DataPointField.timestamp]: timestamp ?? getUniqueTime(),\n\t\t\t[DataPointField.name]: name,\n\t\t};\n\t\t// Add system property prefix for each key\n\t\tif (isDefined(systemProperties)) {\n\t\t\tsystemProperties = {\n\t\t\t\t...mapKeys(systemProperties, (_value, key) =>\n\t\t\t\t\taddSystemPropertyPrefix(key)\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\t\t// Merge system props with user props and put system first\n\t\tconst allProperties = { ...systemProperties, ...properties };\n\t\t// Add properties to data point only if there are entries\n\t\tif (!isEmptyObject(allProperties)) {\n\t\t\tdataPoint[DataPointField.properties] = allProperties;\n\t\t}\n\t\t// Push to the last of the queue\n\t\tconst queue = this.get();\n\t\tthis.prepareQueueToInsert(queue);\n\t\tlast(last(queue).ctx).data.push(dataPoint);\n\t\tthis.set(queue);\n\t\tthis.configurationProvider.updateLastDatapointQueuedTime();\n\t}\n\tprepareQueueToInsert(queue) {\n\t\tconst requestId = this.configurationProvider.get('RequestId');\n\t\tconst sessionId = this.configurationProvider.get('SessionId');\n\t\tconst sessionIdCreatedTime = this.configurationProvider.get(\n\t\t\t'SessionIdCreatedTime'\n\t\t);\n\t\tconst appUserId = dataContext.appUserId.get() || '';\n\t\tconst trackingLevel = dataContext.trackingConsent.get();\n\t\tconst configReceivedTime =\n\t\t\tthis.configurationProvider.get('ConfigReceivedTime');\n\t\tconst appContext = this.appContextProvider.get();\n\t\t// Make sure last entry on queue is current session\n\t\t// Check against requestId to handle pre session items as well that don't have sessionId\n\t\tif (!queue.length || last(queue).sid !== sessionId) {\n\t\t\tqueue.push({\n\t\t\t\trid: requestId,\n\t\t\t\tsid: sessionId,\n\t\t\t\tsidt: sessionIdCreatedTime,\n\t\t\t\tauid: appUserId,\n\t\t\t\ttrackinglevel: trackingLevel,\n\t\t\t\ttime: configReceivedTime,\n\t\t\t\tctx: [],\n\t\t\t});\n\t\t}\n\t\tconst lastSessionQueue = last(queue);\n\t\tconst lastAppContextQueue = last(lastSessionQueue.ctx);\n\t\t// Make sure last entry on app context is current app context\n\t\tif (\n\t\t\t!lastSessionQueue.ctx.length ||\n\t\t\tlastAppContextQueue.id !== appContext.id ||\n\t\t\tlastAppContextQueue.name !== appContext.name\n\t\t) {\n\t\t\tlastSessionQueue.ctx.push({\n\t\t\t\tid: appContext.id,\n\t\t\t\tname: appContext.name,\n\t\t\t\tdata: [],\n\t\t\t});\n\t\t}\n\t}\n\t/**\n\t * Delete the first n elements from the DataPoints queue\n\t * @param count Number of elements to delete\n\t */\n\tdeleteByCount(count) {\n\t\tconst queue = this.get();\n\t\t// Remove elements from the first queue item\n\t\tqueue[0]?.ctx[0]?.data?.splice(0, count);\n\t\t// If no data points left, delete the app context\n\t\tif (!queue[0]?.ctx[0]?.data?.length) {\n\t\t\tqueue[0]?.ctx?.shift();\n\t\t}\n\t\t// If no app contexts left, delete the session\n\t\tif (!queue[0]?.ctx?.length) {\n\t\t\tqueue?.shift();\n\t\t}\n\t\tthis.set(queue);\n\t}\n\t/**\n\t * Assign pending pre session items of requestId to provided sessionId\n\t */\n\tassignPreSessionItems(\n\t\trequestId,\n\t\tsessionId,\n\t\tconfigReceivedTime,\n\t\tsessionIdCreatedTime\n\t) {\n\t\tthis.set(\n\t\t\tthis.get().map((row) => {\n\t\t\t\tif (!row.sid && row.rid === requestId) {\n\t\t\t\t\trow.sid = sessionId;\n\t\t\t\t\trow.time = configReceivedTime;\n\t\t\t\t}\n\t\t\t\treturn row;\n\t\t\t})\n\t\t);\n\t}\n\t/**\n\t * Delete pre session items from the queue\n\t * @param requestId If sent, deletes only pre session items for that request id\n\t */\n\tdeletePreSessionItems(requestId) {\n\t\tthis.set(\n\t\t\tthis.get().filter((row) =>\n\t\t\t\trequestId ? row.rid !== requestId : row.sid\n\t\t\t)\n\t\t);\n\t}\n\tdeleteOtherSessions(sessionId) {\n\t\tconst filteredData = this.get().filter((row) => row.sid === sessionId);\n\t\tthis.set(filteredData);\n\t}\n\t/**\n\t * Delete all items related to the session\n\t */\n\tdeleteBySessionId(sessionId) {\n\t\tthis.set(this.get().filter((row) => row.sid !== sessionId));\n\t}\n\t/**\n\t * Return the first n elements from the DataPoints queue\n\t * @param limit Maximum number of elements to return\n\t */\n\tselect(limit, channelType, channelNumber) {\n\t\t// Data points are sent by order, so if the first item in the queue is pending to config\n\t\t// no data points will be selected until it arrives or get deleted\n\t\tconst firstQueueItem = this.get()[0];\n\t\treturn firstQueueItem?.sid\n\t\t\t? {\n\t\t\t\t\tsessionId: firstQueueItem.sid,\n\t\t\t\t\tsessionIdCreatedTime: firstQueueItem.sidt,\n\t\t\t\t\tappUserId: firstQueueItem.auid,\n\t\t\t\t\ttrackingLevel: firstQueueItem.trackinglevel,\n\t\t\t\t\tchannelType,\n\t\t\t\t\tchannelNumber,\n\t\t\t\t\tconfigReceivedTime: firstQueueItem.time,\n\t\t\t\t\tappContextId: firstQueueItem.ctx[0]?.id,\n\t\t\t\t\tappContextName: firstQueueItem.ctx[0]?.name,\n\t\t\t\t\tdataPoints:\n\t\t\t\t\t\tfirstQueueItem.ctx[0]?.data.slice(0, limit) || [],\n\t\t\t\t}\n\t\t\t: undefined;\n\t}\n}\n","export default class NodeStorage {\n\tconstructor() {\n\t\tthis.storage = {};\n\t}\n\tget length() {\n\t\treturn Object.keys(this.storage).length;\n\t}\n\tclear() {\n\t\tthis.storage = {};\n\t}\n\tgetItem(key) {\n\t\treturn key in this.storage ? this.storage[key] : null;\n\t}\n\tkey(index) {\n\t\tconst keys = Object.keys(this.storage);\n\t\treturn keys[index] || null;\n\t}\n\tremoveItem(key) {\n\t\tdelete this.storage[key];\n\t}\n\tsetItem(key, value) {\n\t\tthis.storage[key] = value || '';\n\t}\n}\n","import { SNError } from './errors';\nimport logger from './logger';\nimport { getTime } from './utils/date-utils';\nimport NodeStorage from './node-storage';\nimport Consts from './consts';\n// In order for the lock mechanism to make sense it should be at least 100ms.\n// The reason is that if there is a contention we wait at least 50ms (depends on event looper) and check\n// again the outer lock. In that case, locks beneath 100ms will probably both fail instead of one of them to succeed\nconst MIN_EXPIRY_TIME = 100;\n/**\n * Really fast utility to create random id for obtaining a lock\n */\nconst randomId = () => {\n\tconst randomNumber = Math.random();\n\t// Math random can also return 0, in that case try again\n\treturn randomNumber ? randomNumber.toString(36).slice(2) : randomId();\n};\n/**\n * Delay execution by at least the requested ms using `setTimeout`\n */\nconst delay = (ms = 0) => new Promise((resolve) => setTimeout(resolve, ms));\n/**\n * Enables to obtain a lock across all browser tabs.\n * Implemented with double locking and localStorage.\n */\nexport default class Lock {\n\t// Every lock instance holds a configuration for a specific key\n\tconstructor(key, expiry = 3 * 1000 /* 3 seconds */) {\n\t\tthis.key = key;\n\t\tthis.expiry = expiry;\n\t\tthis.id = randomId();\n\t\tthis.localStorage = Consts.inBrowser\n\t\t\t? window.localStorage\n\t\t\t: new NodeStorage();\n\t\tif (this.expiry < MIN_EXPIRY_TIME) {\n\t\t\tthrow new Error(\n\t\t\t\t`Lock should have a minimum expiry of ${MIN_EXPIRY_TIME}ms`\n\t\t\t);\n\t\t}\n\t}\n\tlockName(suffix) {\n\t\t// return `sn:${this.key}${suffix}`;\n\t\treturn `sn:${this.key}${suffix}`;\n\t}\n\tget outerLock() {\n\t\treturn this.lockName(':X');\n\t}\n\tget innerLock() {\n\t\treturn this.lockName(':Y');\n\t}\n\tasync tryGetLock() {\n\t\tthis.setLockHolder(this.outerLock);\n\t\t// If inner exists, someone has the lock\n\t\tif (this.getLockHolderIdAndRemoveExpired(this.innerLock)) {\n\t\t\treturn false;\n\t\t}\n\t\t// Inner lock was not found, obtain it\n\t\tthis.setLockHolder(this.innerLock);\n\t\t// Without calling setTimeout between setItem and getItem, localStorage is not\n\t\t// updated if another window changes that value in the meantime.\n\t\t// So we must delay here which will cause the localStorage to be updated\n\t\tawait delay();\n\t\t// We have the inner lock, now check again for the outer lock\n\t\tif (this.getLockHolderIdAndRemoveExpired(this.outerLock) === this.id) {\n\t\t\t// We have both outer and inner locks - lock is acquired\n\t\t\treturn true;\n\t\t}\n\t\t// If outer was changed, someone is competing for the inner lock.\n\t\t// Give enough time for critical section, which ensure setItem has happened and check again\n\t\tawait delay(50);\n\t\t// Return if lock is acquired\n\t\treturn this.getLockHolderIdAndRemoveExpired(this.innerLock) === this.id;\n\t}\n\t/**\n\t * Try to acquire a lock.\n\t * Can throw an exception if lock could not be acquired within the expiration time\n\t */\n\tasync acquire() {\n\t\tconst acquireStartTime = getTime();\n\t\t// Try to acquire lock as long as time is not expired\n\t\twhile (getTime() - acquireStartTime < this.expiry) {\n\t\t\tif (await this.tryGetLock()) {\n\t\t\t\tlogger.debug(`Lock '${this.key}' acquired`);\n\t\t\t\treturn {\n\t\t\t\t\trelease: this.release.bind(this),\n\t\t\t\t};\n\t\t\t}\n\t\t\t// Wait for at least 0~25ms and try again\n\t\t\tawait delay(Math.random() * 25);\n\t\t}\n\t\tthrow new SNError(`Lock could not be acquired within ${this.expiry}ms`);\n\t}\n\t/**\n\t * Releases the lock. This function is provided when obtaining the lock.\n\t */\n\trelease() {\n\t\tthis.localStorage.removeItem(this.outerLock);\n\t\tthis.localStorage.removeItem(this.innerLock);\n\t\tlogger.debug(`Lock '${this.key}' released`);\n\t}\n\t/**\n\t * Set this instance as the lock holder\n\t * @param key Lock to set\n\t */\n\tsetLockHolder(key) {\n\t\tconst lock = {\n\t\t\tid: this.id,\n\t\t\texpiresAt: getTime() + this.expiry,\n\t\t};\n\t\tthis.localStorage.setItem(key, JSON.stringify(lock));\n\t}\n\t/**\n\t * Return the holder id of the lock holder.\n\t * If the lock is expired, delete it and return undefined\n\t * @param key Lock to get\n\t */\n\tgetLockHolderIdAndRemoveExpired(key) {\n\t\tconst lock = this.localStorage.getItem(key);\n\t\tif (!lock) return undefined;\n\t\ttry {\n\t\t\tconst lockParsed = JSON.parse(lock);\n\t\t\t// Clear lock if it's expired\n\t\t\tif (getTime() > lockParsed.expiresAt) {\n\t\t\t\tthis.localStorage.removeItem(key);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn lockParsed.id;\n\t\t} catch (error) {\n\t\t\t// If lock data is corrupted, remove it and return undefined\n\t\t\tlogger.warn('Failed to parse lock data, removing corrupted lock:', error);\n\t\t\tthis.localStorage.removeItem(key);\n\t\t\treturn undefined;\n\t\t}\n\t}\n}\n","import Lock from '../../common/lock';\nimport { getGuid } from '../../common/utils/string-utils';\nimport Consts from '../../common/consts';\n\nconst CREATE_BROWSER_ID_LOCK = new Lock('create-browser-id');\nexport default class BrowserIdProvider {\n\tconstructor(store, legacyStore) {\n\t\tthis.store = store;\n\t\tthis.legacyStore = legacyStore;\n\t}\n\t/**\n\t * Get the browser id if it exists. Does not create one if empty.\n\t */\n\tget() {\n\t\treturn this.store.get('browser' /* StoreKey.BrowserId */);\n\t}\n\t/**\n\t * Get the browser id from legacyStore if it exists. Does not create one if empty.\n\t */\n\tgetLegacyBrowserId() {\n\t\treturn this.legacyStore.get('browser' /* StoreKey.BrowserId */);\n\t}\n\t/**\n\t * Returns a promise that resolve to a valid browser id.\n\t * The call is synchronized between all browser tabs to create a new browser id if one does not already exists.\n\t * May throw an error if could not obtain lock.\n\t */\n\tasync getOrCreate() {\n\t\tlet browserId = this.get();\n\t\tif (!Consts.inBrowser) return '0';\n\t\tif (!browserId) {\n\t\t\t// Creation of browser id is synchronized between tabs\n\t\t\tconst lock = await CREATE_BROWSER_ID_LOCK.acquire();\n\t\t\t// Check within the lock that browser id was not created by another tab while obtaining the lock\n\t\t\tbrowserId = this.get();\n\t\t\tif (!browserId) {\n\t\t\t\tconst legacyBrowserId = this.getLegacyBrowserId();\n\t\t\t\tbrowserId = legacyBrowserId || getGuid();\n\t\t\t\tthis.store.set('browser' /* StoreKey.BrowserId */, browserId);\n\t\t\t}\n\t\t\tlock.release();\n\t\t}\n\t\treturn browserId;\n\t}\n}\n","import { getGuid } from '../../common/utils/string-utils';\n\nexport default class TabIdProvider {\n\tconstructor(store) {\n\t\tthis.store = store;\n\t}\n\t/**\n\t * Returns a valid tabId. If not exists creates new one and save it\n\t */\n\tgetOrCreate() {\n\t\tlet tabId = this.store.get('tab' /* StoreKey.TabId */);\n\t\tif (!tabId) {\n\t\t\ttabId = getGuid();\n\t\t\tthis.store.set('tab' /* StoreKey.TabId */, tabId);\n\t\t}\n\t\treturn tabId;\n\t}\n}\n","import { SNError } from '../common/errors';\nimport { isNonEmptyString, isNullOrUndefined } from '../common/validators';\n\nconst STORE_PREFIX = 'sn';\n/**\n * Base class that handles store api for either localStorage or sessionStorage\n */\nexport default class Store {\n\tconstructor(apiKey, storage, disableSerialization = false) {\n\t\tthis.apiKey = apiKey;\n\t\tthis.storage = storage;\n\t\tthis.disableSerialization = disableSerialization;\n\t\tif (!isNonEmptyString(this.apiKey)) {\n\t\t\tthrow new SNError(\n\t\t\t\t'Must supply an API key to initialize a store instance'\n\t\t\t);\n\t\t}\n\t\t// Check for native web storage support\n\t\ttry {\n\t\t\tconst testKey = this.getStoreKey('test');\n\t\t\tthis.storage.setItem(testKey, 'ok');\n\t\t\tthis.storage.removeItem(testKey);\n\t\t} catch {\n\t\t\tthrow new SNError('Web storage is not supported');\n\t\t}\n\t}\n\tgetStoreKey(key) {\n\t\t// return `${STORE_PREFIX}:${this.apiKey}:${key}`;\n\t\treturn `sn:${this.apiKey}:${key}`;\n\t}\n\tserializeItem(value) {\n\t\t// If serialization is disabled then value is not necessary a string\n\t\treturn this.disableSerialization ? value : JSON.stringify(value);\n\t}\n\tdeserializeItem(value) {\n\t\tif (this.disableSerialization) {\n\t\t\treturn value;\n\t\t}\n\t\ttry {\n\t\t\treturn JSON.parse(value);\n\t\t} catch (error) {\n\t\t\t// If data is corrupted, return undefined to trigger default values\n\t\t\tconsole.warn('[Analytics] Failed to deserialize stored data:', error);\n\t\t\treturn undefined;\n\t\t}\n\t}\n\t/**\n\t * Sets the value of the pair identified by key to value,\n\t * creating a new key/value pair if none existed for key previously.\n\t * In case of undefined or null, the value will be removed to avoid deserializing errors\n\t * @param key Store key\n\t * @param value Value to save\n\t */\n\tset(key, value) {\n\t\treturn isNullOrUndefined(value)\n\t\t\t? this.remove(key)\n\t\t\t: this.storage.setItem(\n\t\t\t\t\tthis.getStoreKey(key),\n\t\t\t\t\tthis.serializeItem(value)\n\t\t\t\t);\n\t}\n\t/**\n\t * Returns the current value associated with the given key,\n\t * or undefined if the given key does not exist in the list associated with the object.\n\t * @param key Store key\n\t */\n\tget(key) {\n\t\t// `getItem` returns null if key does not exist. wa want to return undefined and not handle nulls\n\t\t// since `undefined` trigger parameter default value and null overrides it\n\t\tconst result = this.storage.getItem(this.getStoreKey(key));\n\t\treturn result === null ? undefined : this.deserializeItem(result);\n\t}\n\t/**\n\t * Removes the key/value pair with the given key from the list associated with the object,\n\t * if a key/value pair with the given key exists.\n\t * @param key Store key\n\t */\n\tremove(key) {\n\t\tthis.storage.removeItem(this.getStoreKey(key));\n\t}\n}\n","import Store from './store';\nimport Consts from '../common/consts';\nimport NodeStorage from '../common/node-storage';\n/**\n * Store that is available for all window tabs that are from the same origin (using localStorage)\n */\nexport default class LocalStore extends Store {\n\tconstructor(apiKey) {\n\t\tsuper(\n\t\t\tapiKey,\n\t\t\tConsts.inBrowser ? window.localStorage : new NodeStorage()\n\t\t);\n\t}\n}\n","import Store from './store';\nimport Consts from '../common/consts';\nimport NodeStorage from '../common/node-storage';\n/**\n * Store that available only for a window tab (using sessionStorage)\n */\nexport default class SessionStore extends Store {\n\tconstructor(apiKey) {\n\t\t// super(apiKey, window.sessionStorage);\n\t\tsuper(\n\t\t\tapiKey,\n\t\t\tConsts.inBrowser ? window.sessionStorage : new NodeStorage()\n\t\t);\n\t}\n}\n","import logger from '../common/logger';\nimport Store from './store';\nimport Consts from '../common/consts';\n\nclass MemoryStorage {\n\tconstructor() {\n\t\tthis.store = new Map();\n\t}\n\tget length() {\n\t\treturn this.store.size;\n\t}\n\tkey(index) {\n\t\treturn Array.from(this.store.keys())[index] ?? null;\n\t}\n\tclear() {\n\t\tthis.store.clear();\n\t}\n\tgetItem(key) {\n\t\treturn this.store.get(key) ?? null;\n\t}\n\tremoveItem(key) {\n\t\tthis.store.delete(key);\n\t}\n\tsetItem(key, value) {\n\t\tthis.store.set(key, value);\n\t}\n\tgetAllEntries() {\n\t\treturn Array.from(this.store.entries());\n\t}\n\tloadEntries(backup) {\n\t\tif (!backup) return;\n\t\tlogger.info('Loading backup data to store');\n\t\tfor (const entry of backup) {\n\t\t\tthis.store.set(entry[0], entry[1]);\n\t\t}\n\t}\n}\n// Similar to other storages create single instance to be used\nconst memoryStorage = new MemoryStorage();\n/**\n * Store that available only using DOM memory\n */\nexport default class MemoryStore extends Store {\n\tconstructor(apiKey, backupStore) {\n\t\tsuper(apiKey, memoryStorage, true);\n\t\tthis.backupStore = backupStore;\n\t\tthis.loadBackup();\n\t\tthis.registerBackupBeforeUnload();\n\t}\n\tloadBackup() {\n\t\ttry {\n\t\t\t// Load backup from backup store and remove it once it is loaded\n\t\t\tmemoryStorage.loadEntries(\n\t\t\t\tthis.backupStore.get('all' /* StoreKey.MemoryBackup */)\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tlogger.error('Unable to load backup from session storage', error);\n\t\t}\n\t\tthis.backupStore.remove('all' /* StoreKey.MemoryBackup */);\n\t}\n\tregisterBackupBeforeUnload() {\n\t\tconst handler = () => {\n\t\t\ttry {\n\t\t\t\t// Just before window is unloading, save the current snapshot of memory storage on session storage\n\t\t\t\tthis.backupStore.set(\n\t\t\t\t\t'all' /* StoreKey.MemoryBackup */,\n\t\t\t\t\tmemoryStorage.getAllEntries()\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error('Unable to save backup on unload', error);\n\t\t\t}\n\t\t};\n\t\t// Adding the event listener for saving data on the window's capture phase\n\t\t// Using both beforeunload and unload in case one of them gets removed\n\t\t['beforeunload', 'unload'].forEach((e) => {\n\t\t\tif (Consts.inBrowser) window.addEventListener(e, handler, true);\n\t\t});\n\t}\n}\n","export const createBasicProvider = (store, key, defaultValue) => ({\n\tset: (value) => store.set(key, value),\n\tget: () => store.get(key) ?? defaultValue,\n\tremove: () => store.remove(key),\n});\n","import ConfigurationProvider from './model/providers/configuration-provider';\nimport DataPointsProvider from './model/providers/data-points-provider';\nimport BrowserIdProvider from './model/providers/browser-id-provider';\nimport TabIdProvider from './model/providers/tab-id-provider';\nimport LocalStore from './database/local-store';\nimport SessionStore from './database/session-store';\nimport MemoryStore from './database/memory-store';\nimport { SNError } from './common/errors';\nimport Consts from './common/consts';\nimport { createBasicProvider } from './model/providers/basic-provider';\n/**\n * Singleton class that encapsulates storage usages and all the different providers.\n * Must call `setKeys` once before any other usage.\n */\nclass DataContext {\n\tvalidate(provider) {\n\t\tif (!provider) {\n\t\t\tconsole.warn('Need to call setKeys with a valid apiKey');\n\t\t}\n\t\treturn provider;\n\t}\n\tsetKeys(apiKey, legacyApiKey) {\n\t\t// Local stores and providers - Data persists until explicitly deleted.\n\t\t// Changes made are saved and available for all current and future visits to the site\n\t\tconst localStore = new LocalStore(apiKey);\n\t\tconst legacyLocalStore = new LocalStore(legacyApiKey);\n\t\tthis.appUserIdProvider = createBasicProvider(\n\t\t\tlocalStore,\n\t\t\t'user' /* StoreKey.AppUserId */\n\t\t);\n\t\tthis.browserIdProvider = new BrowserIdProvider(\n\t\t\tlocalStore,\n\t\t\tlegacyLocalStore\n\t\t);\n\t\tthis.clientIdProvider = createBasicProvider(\n\t\t\tlocalStore,\n\t\t\t'client' /* StoreKey.ClientId */,\n\t\t\tConsts.DEFAULT_CLIENT_ID\n\t\t);\n\t\tthis.trackingConsentProvider = createBasicProvider(\n\t\t\tlocalStore,\n\t\t\t'consent' /* StoreKey.TrackingConsent */,\n\t\t\tConsts.DEFAULT_TRACKING_CONSENT\n\t\t);\n\t\tthis.configurationProvider = new ConfigurationProvider(\n\t\t\tlocalStore,\n\t\t\tapiKey,\n\t\t\tthis.appUserIdProvider\n\t\t);\n\t\t// Session store and providers - Changes made are saved and available for the current page\n\t\t// in that tab until it is closed. Once it is closed, the stored data is deleted.\n\t\t// Persist over page refresh, navigation in and out from the page, close and reopen of tab.\n\t\tconst sessionStore = new SessionStore(apiKey);\n\t\t// Memory store and providers - Changes made are saved and available for the window until it is unloaded\n\t\tconst memoryStore = new MemoryStore(apiKey, sessionStore);\n\t\tthis.tabIdProvider = new TabIdProvider(memoryStore);\n\t\tthis.currentPageProvider = createBasicProvider(\n\t\t\tmemoryStore,\n\t\t\t'page' /* StoreKey.CurrentPage */,\n\t\t\t''\n\t\t);\n\t\tthis.domainProvider = createBasicProvider(\n\t\t\tmemoryStore,\n\t\t\t'domain' /* StoreKey.Domain */,\n\t\t\t{}\n\t\t);\n\t\tthis.appContextProvider = createBasicProvider(\n\t\t\tmemoryStore,\n\t\t\t'app' /* StoreKey.AppContext */,\n\t\t\t{}\n\t\t);\n\t\tthis.dataPointsProvider = new DataPointsProvider(\n\t\t\tmemoryStore,\n\t\t\tthis.configurationProvider,\n\t\t\tthis.appContextProvider\n\t\t);\n\t}\n\tget appContext() {\n\t\treturn this.validate(this.appContextProvider);\n\t}\n\tget appUserId() {\n\t\treturn this.validate(this.appUserIdProvider);\n\t}\n\tget browserId() {\n\t\treturn this.validate(this.browserIdProvider);\n\t}\n\tget clientId() {\n\t\treturn this.validate(this.clientIdProvider);\n\t}\n\tget configuration() {\n\t\treturn this.validate(this.configurationProvider);\n\t}\n\tget currentPage() {\n\t\treturn this.validate(this.currentPageProvider);\n\t}\n\tget dataPoints() {\n\t\treturn this.validate(this.dataPointsProvider);\n\t}\n\tget domain() {\n\t\treturn this.validate(this.domainProvider);\n\t}\n\tget tabId() {\n\t\treturn this.validate(this.tabIdProvider);\n\t}\n\tget trackingConsent() {\n\t\treturn this.validate(this.trackingConsentProvider);\n\t}\n\t/**\n\t * Reset session id and lastresponsetime\n\t */\n\tresetSession() {\n\t\tthis.configuration.resetSession();\n\t}\n}\nexport default new DataContext();\n","import {\n\tisObject,\n\tisDefined,\n\tisNonEmptyString,\n\tisString,\n} from '../common/validators';\nimport { SNTypeError } from '../common/errors';\nimport dataContext from '../data-context';\nimport { getValidProperties } from '../common/utils/property-utils';\nimport logger from '../common/logger';\n/**\n * Responsible for recording events and their properties\n */\nexport default class EventRecorder {\n\tadd(name, properties, type) {\n\t\tif (!isNonEmptyString(name)) {\n\t\t\tthrow new SNTypeError(\"Invalid event name: ''\");\n\t\t}\n\t\tif (isDefined(properties)) {\n\t\t\tif (isObject(properties)) {\n\t\t\t\tproperties = getValidProperties(properties, false, false);\n\t\t\t} else {\n\t\t\t\tproperties = undefined;\n\t\t\t\tlogger.error('Invalid event properties for event', name);\n\t\t\t}\n\t\t}\n\t\tconst systemProperties = {\n\t\t\tPage: dataContext.currentPage.get(),\n\t\t};\n\t\tif (isDefined(type)) {\n\t\t\tif (isString(type)) {\n\t\t\t\tsystemProperties.Type = type;\n\t\t\t} else {\n\t\t\t\tlogger.error('Invalid type', type, 'for event', name);\n\t\t\t}\n\t\t}\n\t\tdataContext.dataPoints.add(1 /* DataPointType.Event */, name, {\n\t\t\tproperties,\n\t\t\tsystemProperties,\n\t\t});\n\t}\n\taddChat(name, properties) {\n\t\tif (!isNonEmptyString(name)) {\n\t\t\tthrow new SNTypeError(\"Invalid event name: ''\");\n\t\t}\n\n\t\tconst conversationId = isObject(properties)\n\t\t\t? properties['Conversation id']\n\t\t\t: undefined;\n\n\t\tif (isDefined(properties)) {\n\t\t\tif (isObject(properties)) {\n\t\t\t\tproperties = getValidProperties(properties, false, false);\n\t\t\t} else {\n\t\t\t\tproperties = undefined;\n\t\t\t\tlogger.warn('Invalid event properties for event', name);\n\t\t\t}\n\t\t}\n\t\tconst systemProperties = {\n\t\t\tPage: dataContext.currentPage.get(),\n\t\t};\n\t\tif (isNonEmptyString(conversationId)) {\n\t\t\tsystemProperties.ConversationId = conversationId;\n\t\t}\n\t\tdataContext.dataPoints.add(4 /* DataPointType.Chat */, name, {\n\t\t\tproperties,\n\t\t\tsystemProperties,\n\t\t});\n\t}\n\taddConsentChange(newConsent, oldConsent) {\n\t\tthis.add('SNAnalyticsTrackingTriggered', {\n\t\t\tValue: newConsent,\n\t\t\tPreviousValue: oldConsent,\n\t\t});\n\t}\n}\n","import { isString, isDefined, isNonEmptyString } from '../common/validators';\nimport { SNTypeError } from '../common/errors';\nimport logger from '../common/logger';\nimport dataContext from '../data-context';\n\nconst MAX_DESCRIPTION_LENGTH = 100;\n/**\n * Responsible for recording page names\n */\nexport default class PageRecorder {\n\tstart(name, description) {\n\t\t// Don't mess with undefined or null name\n\t\tname = name ?? '';\n\t\tif (!isString(name)) {\n\t\t\tthrow new SNTypeError('Page name must be a string');\n\t\t}\n\t\tconst systemProperties = {};\n\t\tif (isDefined(description)) {\n\t\t\tif (!isNonEmptyString(description)) {\n\t\t\t\tlogger.error('Ignoring empty page description');\n\t\t\t} else if (description.length > MAX_DESCRIPTION_LENGTH) {\n\t\t\t\tlogger.error(\n\t\t\t\t\t`Ignoring description too long (greater than ${MAX_DESCRIPTION_LENGTH})`\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tsystemProperties.Description = description;\n\t\t\t}\n\t\t}\n\t\tdataContext?.currentPage?.set(name);\n\t\tdataContext?.dataPoints?.add(0 /* DataPointType.Page */, name, {\n\t\t\tsystemProperties,\n\t\t});\n\t}\n}\n","import {\n\tisString,\n\tisNonEmptyString,\n\tisNumber,\n\tisObject,\n} from '../common/validators';\nimport { SNTypeError } from '../common/errors';\nimport logger from '../common/logger';\nimport dataContext from '../data-context';\nimport {\n\tgetValidProperties,\n\tisSystemPropertyKey,\n} from '../common/utils/property-utils';\n/**\n * Responsible for recording users and their properties\n */\nexport default class UserRecorder {\n\tgetAppUserIdOrNull() {\n\t\treturn dataContext.appUserId.get() || null;\n\t}\n\tsetAppUserId(appUserId) {\n\t\t// Replace undefined appUserId with null since User dataPoint name cannot be undefined\n\t\tdataContext.dataPoints.add(\n\t\t\t2 /* DataPointType.User */,\n\t\t\tappUserId || null\n\t\t);\n\t}\n\tremoveProperty(name) {\n\t\tthis.setProperty(name, null);\n\t}\n\tsetProperty(name, value) {\n\t\tthis.setProperties({ [name]: value });\n\t}\n\tsetProperties(properties) {\n\t\tif (!isObject(properties)) {\n\t\t\tlogger.error('Invalid user properties');\n\t\t\treturn;\n\t\t}\n\t\tproperties = getValidProperties(properties, true, true);\n\t\tdataContext.dataPoints.add(\n\t\t\t2 /* DataPointType.User */,\n\t\t\tthis.getAppUserIdOrNull(),\n\t\t\t{ properties }\n\t\t);\n\t}\n\tincProperty(name, value) {\n\t\tif (!isNumber(value)) {\n\t\t\tthrow new SNTypeError('Property value must be a number');\n\t\t}\n\t\tif (!value) {\n\t\t\tlogger.debug('Ignoring inc user property by zero');\n\t\t\treturn;\n\t\t}\n\t\tthis.operationToProperty(name, value, '$inc' /* Operator.Inc */);\n\t}\n\tappendToProperty(name, value) {\n\t\tif (!isString(value)) {\n\t\t\tthrow new SNTypeError('Property value must be a string');\n\t\t}\n\t\tthis.operationToProperty(\n\t\t\tname,\n\t\t\t[value],\n\t\t\t'$appendToList' /* Operator.AppendToList */\n\t\t);\n\t}\n\toperationToProperty(name, value, operation) {\n\t\tif (!isNonEmptyString(name)) {\n\t\t\tthrow new SNTypeError('Property name must be a string');\n\t\t}\n\t\tif (isSystemPropertyKey(name)) {\n\t\t\tthrow new SNTypeError('Property name has invalid prefix');\n\t\t}\n\t\tdataContext.dataPoints.add(\n\t\t\t2 /* DataPointType.User */,\n\t\t\tthis.getAppUserIdOrNull(),\n\t\t\t{\n\t\t\t\tproperties: {\n\t\t\t\t\t[name]: {\n\t\t\t\t\t\t['op' /* Property.Op */]: operation,\n\t\t\t\t\t\t['val' /* Property.Val */]: value,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t);\n\t}\n}\n","import logger from '../common/logger';\nimport {\n\tisNonEmptyString,\n\tisNullOrUndefined,\n\tisNumber,\n\tisPositiveInteger,\n\tisString,\n} from '../common/validators';\nimport dataContext from '../data-context';\n\nconst MAX_DURATION = 4 * 60 * 60 * 1000;\nconst MAX_KEY_LENGTH = 255;\nconst MAX_TRACE_TYPE_LENGTH = 100;\nconst MAX_PROP_KEY_LENGTH = 255;\nconst MAX_PROP_VALUE_LENGTH = 255;\nconst MAX_PROPS_COUNT = 20;\nconst NO_DURATION = -1;\nfunction fixDuration(duration) {\n\tif (MAX_DURATION < duration) {\n\t\tlogger.warn(\n\t\t\t'Duration exceeded maximum limit, it has been trimmed to ',\n\t\t\tMAX_DURATION,\n\t\t\t'milliseconds'\n\t\t);\n\t\treturn MAX_DURATION;\n\t}\n\tconst roundedDuration = Math.round(duration);\n\tif (roundedDuration !== duration) {\n\t\tlogger.warn(\n\t\t\t'Performance duration',\n\t\t\tduration,\n\t\t\t'was given in decimal and it was rounded to',\n\t\t\troundedDuration\n\t\t);\n\t\treturn roundedDuration;\n\t}\n\treturn duration;\n}\nfunction fixLength(value, max) {\n\tif (value.length > max) {\n\t\tconst trimmed = value.substring(0, max);\n\t\tlogger.warn(\n\t\t\t'Maximum string length is',\n\t\t\tmax,\n\t\t\t'but length is',\n\t\t\tvalue.length,\n\t\t\t'. The string',\n\t\t\tvalue,\n\t\t\t'will be trimmed to',\n\t\t\ttrimmed\n\t\t);\n\t\treturn trimmed;\n\t}\n\treturn value;\n}\nclass PerformanceTraceImpl {\n\tconstructor(key, type, startTime, duration = NO_DURATION, properties = {}) {\n\t\tthis.key = key;\n\t\tthis.type = type;\n\t\tthis.startTime = startTime;\n\t\tthis.duration = duration;\n\t\tthis.properties = properties;\n\t\tthis.key = fixLength(key, MAX_KEY_LENGTH);\n\t\tthis.type = fixLength(type, MAX_TRACE_TYPE_LENGTH);\n\t}\n\tget traceEnded() {\n\t\treturn this.duration !== NO_DURATION;\n\t}\n\tsend() {\n\t\tif (dataContext.configuration.get('IgnorePerformanceData')) {\n\t\t\tlogger.info('Ignoring performance traces according to config');\n\t\t\treturn;\n\t\t}\n\t\tconst systemProperties = {\n\t\t\tDuration: this.duration,\n\t\t\tTraceType: this.type,\n\t\t};\n\t\tdataContext.dataPoints.add(\n\t\t\t3 /* DataPointType.PerformanceTrace */,\n\t\t\tthis.key,\n\t\t\t{\n\t\t\t\tproperties: this.properties,\n\t\t\t\tsystemProperties,\n\t\t\t\ttimestamp: this.startTime,\n\t\t\t}\n\t\t);\n\t}\n\tend() {\n\t\tif (this.traceEnded) {\n\t\t\tlogger.warn('Trace already ended');\n\t\t\treturn;\n\t\t}\n\t\tlogger.info(\n\t\t\t'End Performance Trace:',\n\t\t\tthis.key,\n\t\t\t'-',\n\t\t\tthis.type,\n\t\t\t'-',\n\t\t\tthis.duration,\n\t\t\t'-',\n\t\t\tthis.properties\n\t\t);\n\t\tthis.duration = fixDuration(Date.now() - this.startTime);\n\t\tthis.send();\n\t}\n\tsetProperty(key, value) {\n\t\tif (this.traceEnded) {\n\t\t\tlogger.warn('Ignoring set property since trace already ended');\n\t\t\treturn;\n\t\t}\n\t\tif (!isNonEmptyString(key)) {\n\t\t\tlogger.error('Invalid performance key', key);\n\t\t\treturn;\n\t\t}\n\t\tif (isNullOrUndefined(value)) {\n\t\t\tthis.removeProperty(key);\n\t\t\treturn;\n\t\t}\n\t\tif (!isString(value)) {\n\t\t\tlogger.error(\n\t\t\t\t'Invalid performance value',\n\t\t\t\tvalue,\n\t\t\t\t'for property with key',\n\t\t\t\tkey\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tkey = fixLength(key, MAX_PROP_KEY_LENGTH);\n\t\tvalue = fixLength(value, MAX_PROP_VALUE_LENGTH);\n\t\tif (\n\t\t\tObject.keys(this.properties).length >= MAX_PROPS_COUNT &&\n\t\t\t!(key in this.properties)\n\t\t) {\n\t\t\tlogger.error(\n\t\t\t\t'Ignoring property',\n\t\t\t\tkey,\n\t\t\t\t'since each trace is limited to',\n\t\t\t\tMAX_PROPS_COUNT,\n\t\t\t\t'properties'\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tlogger.info('Setting performance property:', key, 'with value:', value);\n\t\tthis.properties[key] = value;\n\t}\n\tsetProperties(properties) {\n\t\tif (this.traceEnded) {\n\t\t\tlogger.warn('Ignoring set properties since trace already ended');\n\t\t\treturn;\n\t\t}\n\t\tfor (const [key] of Object.entries(properties)) {\n\t\t\tthis.setProperty(key, properties[key]);\n\t\t}\n\t}\n\tremoveProperty(key) {\n\t\tif (this.traceEnded) {\n\t\t\tlogger.warn('Ignoring remove property since trace already ended');\n\t\t\treturn;\n\t\t}\n\t\tkey = fixLength(key, MAX_PROP_KEY_LENGTH);\n\t\tdelete this.properties[key];\n\t}\n}\n/**\n * Responsible for recording performance traces\n */\nexport default class PerformanceTraceRecorder {\n\tstart(key, type) {\n\t\tif (!this.validateTrace(key, type)) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn new PerformanceTraceImpl(key, type, Date.now());\n\t}\n\tadd(key, type, durationMS, properties, startTime) {\n\t\tif (!this.validateTrace(key, type)) {\n\t\t\treturn;\n\t\t}\n\t\tif (!isNumber(durationMS) || durationMS < 0) {\n\t\t\tlogger.error('Invalid durationMS for performance trace');\n\t\t\treturn;\n\t\t}\n\t\tdurationMS = fixDuration(durationMS);\n\t\tstartTime =\n\t\t\tstartTime instanceof Date\n\t\t\t\t? startTime.getTime()\n\t\t\t\t: (startTime ?? Date.now() - durationMS);\n\t\tif (!isPositiveInteger(startTime, true)) {\n\t\t\tlogger.error('Invalid startTime for performance trace');\n\t\t\treturn;\n\t\t}\n\t\tconst trace = new PerformanceTraceImpl(\n\t\t\tkey,\n\t\t\ttype,\n\t\t\tstartTime,\n\t\t\tdurationMS,\n\t\t\tproperties\n\t\t);\n\t\ttrace.send();\n\t}\n\tvalidateTrace(key, type) {\n\t\tif (!isNonEmptyString(key)) {\n\t\t\tlogger.warn('Invalid key for performance trace');\n\t\t\treturn false;\n\t\t}\n\t\tif (!isNonEmptyString(type)) {\n\t\t\tlogger.warn('Invalid type for performance trace');\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n}\n","import EventRecorder from './event-recorder';\nimport PageRecorder from './page-recorder';\nimport UserRecorder from './user-recorder';\nimport PerformanceTraceRecorder from './performance-recorder';\n/**\n * Top level recorder that is used to aggregate all the dedicated recorders\n */\nexport default class MetadataRecorder {\n\tconstructor() {\n\t\tthis.eventRecorder = new EventRecorder();\n\t\tthis.pageRecorder = new PageRecorder();\n\t\tthis.userRecorder = new UserRecorder();\n\t\tthis.performanceRecorder = new PerformanceTraceRecorder();\n\t}\n\tget event() {\n\t\treturn this.eventRecorder;\n\t}\n\tget page() {\n\t\treturn this.pageRecorder;\n\t}\n\tget user() {\n\t\treturn this.userRecorder;\n\t}\n\tget performance() {\n\t\treturn this.performanceRecorder;\n\t}\n}\n","import Consts from './consts';\n/**\n * Utility class for environment variables\n */\nexport default class Environment {\n\tstatic getScreenDimension() {\n\t\tconst { height, width } = Consts.inBrowser\n\t\t\t? window.screen\n\t\t\t: { height: 0, width: 0 };\n\t\treturn { height: height || 0, width: width || 0 };\n\t}\n\tstatic getSystemLocale() {\n\t\tif (Consts.inBrowser) {\n\t\t\treturn window.navigator.language.toLowerCase();\n\t\t}\n\t\treturn process.env.LANG;\n\t}\n\tstatic getClientTimezone() {\n\t\treturn Intl.DateTimeFormat().resolvedOptions().timeZone;\n\t}\n\tstatic getTimezoneOffset() {\n\t\t// For Israel which is GMT + 2 with DST on currently:\n\t\tconst offset = new Date().getTimezoneOffset();\n\t\treturn offset; // -180\n\t}\n}\n","import Consts from '../common/consts';\nimport logger from '../common/logger';\nimport { HttpError } from '../common/errors';\n\nconst omit = (obj, keys) => {\n\tconst retVal = {};\n\n\tfor (const k in obj) {\n\t\tif (!keys.includes(k)) retVal[k] = obj[k];\n\t}\n\treturn retVal;\n};\nexport default async function universalFetch(url, options, timeout) {\n\tlet response;\n\tlet requestTimeoutId = 0;\n\tif (Consts.inBrowser) {\n\t\t// Use `AbortController` to stop the request upon timeout\n\t\tconst controller = new AbortController();\n\t\tconst { signal } = controller;\n\t\tconst fetchPromise = fetch(url, { ...options });\n\t\trequestTimeoutId = window.setTimeout(\n\t\t\t() => controller.abort(),\n\t\t\toptions.timeout\n\t\t);\n\t\tresponse = await fetchPromise;\n\t} else {\n\t\tconst axios = (await import('axios')).default;\n\t\ttry {\n\t\t\tresponse = await axios(url, {\n\t\t\t\t// ...omit(options, ['mode', 'cache', 'referrer']),\n\t\t\t\tdata: options.body,\n\t\t\t\theaders: options.headers,\n\t\t\t\tmethod: options.method,\n\t\t\t\twithCredentials: true,\n\t\t\t\ttimeout: timeout, // Remove unwanted options\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tlogger.error(error);\n\t\t\treturn Promise.reject({ error: new HttpError() });\n\t\t}\n\t}\n\ttry {\n\t\tconst responseBody = Consts.inBrowser\n\t\t\t? await response.json()\n\t\t\t: response.data.result;\n\t\tconst isResponseOk = Consts.inBrowser\n\t\t\t? response.ok\n\t\t\t: response.statusText === 'OK';\n\t\tconst responseStatusCode = response.status;\n\t\treturn Promise.resolve({\n\t\t\theaders: response.headers,\n\t\t\tdata: responseBody,\n\t\t\tok: isResponseOk,\n\t\t\tstatus: responseStatusCode,\n\t\t\terror: null,\n\t\t});\n\t} catch (error) {\n\t\t// Problem with parsing the response into JSON\n\t\tlogger.warn(\n\t\t\t`Server call to '${url}' failed. Response is`,\n\t\t\tConsts.inBrowser ? response.status : response.statusCode,\n\t\t\terror\n\t\t);\n\t\t// noinspection ES6MissingAwait\n\t\treturn Promise.reject({ error: new HttpError() });\n\t} finally {\n\t\tclearTimeout(requestTimeoutId);\n\t}\n}\n","import logger from '../common/logger';\nimport dataContext from '../data-context';\nimport Consts from '../common/consts';\nimport { HttpError } from '../common/errors';\nimport { removeFalsyEntries } from '../common/utils/object-utils';\nimport { getTime } from '../common/utils/date-utils';\nimport universalFetch from './fetch';\nimport Environment from '../common/environment';\n\nconst rejectWithError = (status) => {\n\tif (status === 401) {\n\t\t// noinspection ES6MissingAwait\n\t\treturn Promise.reject(\n\t\t\tnew HttpError(2 /* ErrorCode.MetricAuthTokenInvalidOrExpired */)\n\t\t);\n\t}\n\tif (status >= 400 && status < 500) {\n\t\t// noinspection ES6MissingAwait\n\t\treturn Promise.reject(\n\t\t\tnew HttpError(3 /* ErrorCode.MetricBadRequest */)\n\t\t);\n\t}\n\tif (status >= 500) {\n\t\t// noinspection ES6MissingAwait\n\t\treturn Promise.reject(\n\t\t\tnew HttpError(4 /* ErrorCode.MetricServerError */)\n\t\t);\n\t}\n\treturn Promise.reject(new HttpError());\n};\nconst getHttpHeaders = async () =>\n\t// If for some reason data is empty, remove it so \"undefined\" string won't be passed.\n\t// It could happen, for example, if right before this statement localStorage is cleared by the user.\n\t// The server will fail requests with missing headers\n\tremoveFalsyEntries({\n\t\t'X-Transaction-Source': Consts.inBrowser\n\t\t\t? window.transaction_source\n\t\t\t: false,\n\t\t'X-UserToken': Consts.inBrowser ? window.g_ck : false,\n\t});\nconst getMetricAPIHttpHeaders = async () => {\n\t// If for some reason data is empty, remove it so \"undefined\" string won't be passed.\n\t// It could happen, for example, if right before this statement localStorage is cleared by the user.\n\t// The server will fail requests with missing headers\n\tconst snOriginHeader =\n\t\tConsts.instanceDomainName && Consts.instanceDomainName !== ''\n\t\t\t? { 'X-SN-Origin': 'https://' + Consts.instanceDomainName }\n\t\t\t: {};\n\treturn removeFalsyEntries({\n\t\tVersion: Consts.VERSION,\n\t\tAPIKey: dataContext.configuration.get('ApiKey'),\n\t\tBrowserId: await dataContext.browserId.getOrCreate(),\n\t\t// X-AppSysId is only for anonymous or un-authenticated users.\n\t\tAppsysid:\n\t\t\tdataContext.configuration.get('ApiKey')?.split(':')[1] &&\n\t\t\t!dataContext.appUserId.get()\n\t\t\t\t? dataContext.configuration.get('ApiKey')?.split(':')[1]\n\t\t\t\t: '',\n\t\tInstancename: dataContext.configuration.get('InstanceName')\n\t\t\t? dataContext.configuration.get('InstanceName')\n\t\t\t: '',\n\t\tUserid: dataContext.configuration.get('AppUserId')\n\t\t\t? dataContext.configuration.get('AppUserId')\n\t\t\t: '',\n\t\t...snOriginHeader,\n\t});\n};\n/**\n * Make a server request using POST. Headers are automatically filled.\n * @param endpoint Request endpoint\n * @param body JSON representing the request body\n * @param timeout Timeout for the request in milliseconds\n */\nexport const postData = async (endpoint, body, headers, timeout) => {\n\ttry {\n\t\tconst time = getTime();\n\t\tconst { data, ok, status, error } = await universalFetch(\n\t\t\tendpoint,\n\t\t\t{\n\t\t\t\tbody: JSON.stringify(body),\n\t\t\t\tmethod: 'POST',\n\t\t\t\tmode:\n\t\t\t\t\tConsts.instanceDomainName &&\n\t\t\t\t\tConsts.instanceDomainName !== ''\n\t\t\t\t\t\t? 'cors'\n\t\t\t\t\t\t: 'same-origin',\n\t\t\t\tcache: 'no-cache',\n\t\t\t\treferrer: 'no-referrer',\n\t\t\t\tcredentials: 'include',\n\t\t\t\theaders: {\n\t\t\t\t\t...headers,\n\t\t\t\t\t...(await getMetricAPIHttpHeaders()),\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t},\n\t\t\t},\n\t\t\ttimeout\n\t\t);\n\t\tlogger.debug(\n\t\t\t`Profiler: '${endpoint}' request took`,\n\t\t\tgetTime() - time,\n\t\t\t'ms'\n\t\t);\n\t\tif (error) {\n\t\t\treturn Promise.reject(error);\n\t\t}\n\t\tif (ok) {\n\t\t\treturn Promise.resolve(data);\n\t\t}\n\t\treturn rejectWithError(status);\n\t} catch (error) {\n\t\treturn Promise.reject(new HttpError());\n\t}\n};\nexport const getData = async (endpoint, timeout) => {\n\ttry {\n\t\tconst time = getTime();\n\t\tlet parsedStoredData = {};\n\t\ttry {\n\t\t\tconst storedData = Consts.inBrowser\n\t\t\t\t? sessionStorage.getItem('AppRegistrationMetadata')\n\t\t\t\t: '{}';\n\t\t\tparsedStoredData = storedData ? JSON.parse(storedData) : {};\n\t\t} catch (error) {\n\t\t\tlogger.warn('Failed to retrieve or parse app registration metadata from sessionStorage:', error);\n\t\t\t// Use empty object as fallback if sessionStorage is unavailable or cleared\n\t\t}\n\t\tconst domain = dataContext.domain.get();\n\t\tconst Appsysid =\n\t\t\tdataContext.configuration.get('ApiKey')?.split(':').slice(-1)[0] ||\n\t\t\t'' ||\n\t\t\t'';\n\t\tconst appRegistrationMetadata =\n\t\t\tparsedStoredData && parsedStoredData[Appsysid]\n\t\t\t\t? parsedStoredData[Appsysid]\n\t\t\t\t: {};\n\t\tconst snOriginHeader =\n\t\t\tConsts.instanceDomainName && Consts.instanceDomainName !== ''\n\t\t\t\t? { 'X-SN-Origin': Consts.instanceDomainName }\n\t\t\t\t: {};\n\t\tconst { headers, data, ok, status, error } = await universalFetch(\n\t\t\tendpoint,\n\t\t\t{\n\t\t\t\tmethod: 'GET',\n\t\t\t\tcredentials: 'include',\n\t\t\t\theaders: {\n\t\t\t\t\t...(await getHttpHeaders()),\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAppsysid,\n\t\t\t\t\tBrowserid: await dataContext.browserId.getOrCreate(),\n\t\t\t\t\tAppUserId: dataContext.appUserId.get(),\n\t\t\t\t\tSessionId: dataContext.configuration.get('SessionId'),\n\t\t\t\t\tScreenHeight: Environment.getScreenDimension().height,\n\t\t\t\t\tScreenWidth: Environment.getScreenDimension().width,\n\t\t\t\t\tDomainId: domain?.id,\n\t\t\t\t\tSystemLocale: Environment.getSystemLocale(),\n\t\t\t\t\tClientTimezone: Environment.getClientTimezone(),\n\t\t\t\t\tClientTimezoneOffset: Environment.getTimezoneOffset(),\n\t\t\t\t\tTabId: dataContext.tabId.getOrCreate(),\n\t\t\t\t\tTrackingLevel: dataContext.trackingConsent.get(),\n\t\t\t\t\tName: appRegistrationMetadata?.name || '',\n\t\t\t\t\tChanneltype: appRegistrationMetadata?.channelType || '',\n\t\t\t\t\tTablename: appRegistrationMetadata?.tableName || '',\n\t\t\t\t\t...snOriginHeader,\n\t\t\t\t},\n\t\t\t},\n\t\t\ttimeout\n\t\t);\n\t\tlogger.debug(\n\t\t\t`Profiler: '${endpoint}' request took`,\n\t\t\tgetTime() - time,\n\t\t\t'ms'\n\t\t);\n\t\tif (error) {\n\t\t\treturn Promise.reject(error);\n\t\t}\n\t\tif (ok) {\n\t\t\treturn Promise.resolve({ data: data?.result || data, headers });\n\t\t}\n\t\treturn rejectWithError(status);\n\t} catch (error) {\n\t\treturn Promise.reject(new HttpError());\n\t}\n};\n","export function decorateMethod(target, methodName, ...decorators) {\n\tconst descriptor = Object.getOwnPropertyDescriptor(\n\t\ttarget.prototype,\n\t\tmethodName\n\t);\n\tif (!descriptor) return;\n\tlet newDescriptor = descriptor;\n\tfor (const decorator of decorators.reverse()) {\n\t\tnewDescriptor =\n\t\t\tdecorator(target.prototype, methodName, newDescriptor) ||\n\t\t\tnewDescriptor;\n\t}\n\tObject.defineProperty(target.prototype, methodName, newDescriptor);\n}\n","import logger from '../common/logger';\n\nexport function CatchAll(target, name, descriptor) {\n\tconst originalMethod = descriptor.value;\n\tdescriptor.value = function (...args) {\n\t\ttry {\n\t\t\treturn originalMethod.apply(this, args);\n\t\t} catch (error) {\n\t\t\tlogger.error(`Error in ${name}:`, error);\n\t\t}\n\t};\n\treturn descriptor;\n}\n\nexport function CatchAllAndReturn(defaultValue) {\n\treturn function (target, name, descriptor) {\n\t\tconst originalMethod = descriptor.value;\n\t\tdescriptor.value = function (...args) {\n\t\t\ttry {\n\t\t\t\treturn originalMethod.apply(this, args);\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(`Error in ${name}:`, error);\n\t\t\t\treturn defaultValue;\n\t\t\t}\n\t\t};\n\t\treturn descriptor;\n\t};\n}\n","import dataContext from '../data-context';\nimport Environment from '../common/environment';\nimport { postData, getData } from './server-proxy';\nimport { getTime, toISOString } from '../common/utils/date-utils';\nimport logger from '../common/logger';\nimport Consts from '../common/consts';\nimport { decorateMethod } from '../decorator/utils';\nimport { CatchAllAndReturn } from '../decorator/common';\n\nconst goodResponse = () => ({ ok: true });\nconst badResponse = (errorCode, data) => ({\n\tok: false,\n\terrorCode,\n\tdata,\n});\nconst getUrl = (path) => {\n\tlet url = '';\n\tif (Consts.instanceDomainName) {\n\t\turl = 'https://' + Consts.instanceDomainName + path;\n\t} else url = path;\n\treturn url;\n};\nconst getToken = (cookies) => {\n\tconst [key, token] = (\n\t\tcookies.find((cookie) => cookie.trim().startsWith('UX-Token=')) || ''\n\t).split('=');\n\treturn token;\n};\nconst SERVER_REQUEST_TIMEOUT = 60 * 1000; // 1 minute\n/**\n * Class with static members that handles the SDK network activities\n */\nclass Networker {\n\t/**\n\t * Get configuration from server and saves it\n\t */\n\tstatic async getConfiguration(requestId) {\n\t\tconst { height, width } = Environment.getScreenDimension();\n\t\tconst domain = dataContext.domain.get();\n\t\t// Get Analytics Configuration from Instance\n\t\tconst { data: configData, headers } = await getData(\n\t\t\tgetUrl('/api/now/analytics/config'),\n\t\t\tSERVER_REQUEST_TIMEOUT\n\t\t);\n\t\tconst response = {\n\t\t\t...JSON.parse(configData),\n\t\t\tRequestId: requestId,\n\t\t\tuxToken: !Consts.inBrowser ? getToken(headers['set-cookie']) : null,\n\t\t};\n\t\tif (!dataContext.configuration.isValidConfigResponse(response)) {\n\t\t\tlogger.warn(\n\t\t\t\t'Configuration response for request id',\n\t\t\t\trequestId,\n\t\t\t\t'is not valid:',\n\t\t\t\tresponse\n\t\t\t);\n\t\t\treturn badResponse();\n\t\t}\n\t\tconst mergedConfiguration =\n\t\t\tdataContext.configuration.getMergedConfigurationWithConfigResponse(\n\t\t\t\tresponse\n\t\t\t);\n\t\t// Check that while configuration request was going on, no new config got called\n\t\tif (requestId !== dataContext.configuration.get('RequestId')) {\n\t\t\tlogger.warn(\n\t\t\t\t'Ignoring old configuration with request id',\n\t\t\t\trequestId,\n\t\t\t\t'and session id',\n\t\t\t\tmergedConfiguration.SessionId\n\t\t\t);\n\t\t\treturn badResponse(\n\t\t\t\t1 /* ErrorCode.ConfigurationNotFound */,\n\t\t\t\tmergedConfiguration.SessionId\n\t\t\t);\n\t\t}\n\t\tdataContext.configuration.fillWithJson(mergedConfiguration);\n\t\tdataContext.configuration.updateServerResponseTime();\n\t\tlogger.debug(\n\t\t\t'Networker got valid configuration response',\n\t\t\tmergedConfiguration\n\t\t);\n\t\treturn goodResponse();\n\t}\n\t/**\n\t * Send heartbeat data to the server\n\t */\n\tstatic async sendMetric(dataPointsResult) {\n\t\ttry {\n\t\tconst { height, width } = Environment.getScreenDimension();\n\t\tconst domain = dataContext.domain.get();\n\t\tconst serverData = Consts.inBrowser\n\t\t\t? {}\n\t\t\t: {\n\t\t\t\t\tCookie: `UX-Token=${dataContext.configuration.get('uxToken')}`,\n\t\t\t\t\tOrigin: getUrl(''),\n\t\t\t\t};\n\t\tawait postData(\n\t\t\tgetUrl('/uxa/now/web/metric'),\n\t\t\t{\n\t\t\t\tSessionId: dataPointsResult.sessionId,\n\t\t\t\tSessionIdCreatedTime: dataPointsResult.sessionIdCreatedTime,\n\t\t\t\tDataPoints: dataPointsResult.dataPoints,\n\t\t\t\tChannelType:\n\t\t\t\t\t\tdataPointsResult.channelNumber &&\n\t\t\t\t\t\tdataPointsResult.channelNumber !== -1\n\t\t\t\t\t\t? dataPointsResult.channelNumber\n\t\t\t\t\t\t: dataPointsResult.channelType,\n\t\t\t\tScreenHeight: height,\n\t\t\t\tScreenWidth: width,\n\t\t\t\tSystemLocale: Environment.getSystemLocale(),\n\t\t\t\tClientTimezone: Environment.getClientTimezone(),\n\t\t\t\tClientTimezoneOffset: Environment.getTimezoneOffset(),\n\t\t\t\tAppUserId: dataPointsResult.appUserId,\n\t\t\t\tTabId: dataContext.tabId.getOrCreate(),\n\t\t\t\tClientTime: toISOString(getTime()),\n\t\t\t\tDomainId: domain?.id,\n\t\t\t\tDomainName: domain?.name,\n\t\t\t\tTrackingLevel: dataPointsResult.trackingLevel,\n\t\t\t\tAppContextId: dataPointsResult.appContextId,\n\t\t\t\tAppContextName: dataPointsResult.appContextName,\n\t\t\t\t\tAppSysId: dataContext.configuration\n\t\t\t\t\t\t.get('ApiKey')\n\t\t\t\t\t\t?.split(':')\n\t\t\t\t\t\t.slice(-1)[0],\n\t\t\t},\n\t\t\t{ ...serverData },\n\t\t\tSERVER_REQUEST_TIMEOUT\n\t\t);\n\t\t\t// Update time if metric was successful\n\t\tdataContext.configuration.updateServerResponseTime();\n\t\tlogger.debug('Networker sent metric');\n\t\treturn goodResponse();\n\t\t} catch (error) {\n\t\t\treturn error.errorCode\n\t\t\t\t? badResponse(error.errorCode)\n\t\t\t\t: badResponse();\n\t\t}\n\t}\n\t/**\n\t * Get AnalyticsGatewayAuthToken from Instance and Update in Configuration\n\t */\n\tstatic async getToken(endpoint) {\n\t\t// Get Analytics Configuration from Instance\n\t\tconst { data: analyticsGatewayAuthToken } = await getData(\n\t\t\tgetUrl(endpoint),\n\t\t\tSERVER_REQUEST_TIMEOUT\n\t\t);\n\t\tlogger.debug('Updated Analytics AnalyticsGatewayAuthToken');\n\t\treturn analyticsGatewayAuthToken;\n\t}\n\t/**\n\t * Send a request to the server to delete user data\n\t */\n\tstatic async deleteUserData(appUserId) {\n\t\tawait postData(\n\t\t\tgetUrl('delete-data'),\n\t\t\t{ AppUserId: appUserId },\n\t\t\t{},\n\t\t\tSERVER_REQUEST_TIMEOUT\n\t\t);\n\t\tlogger.debug('Networker deleted user');\n\t\treturn goodResponse();\n\t}\n}\n\n// Decorate methods with Catch logic\ndecorateMethod(Networker, 'getConfiguration', CatchAllAndReturn({ ok: false }));\ndecorateMethod(Networker, 'sendMetric', CatchAllAndReturn({ ok: false }));\ndecorateMethod(Networker, 'getToken', CatchAllAndReturn(''));\ndecorateMethod(Networker, 'deleteUserData', CatchAllAndReturn({ ok: false }));\n\nexport default Networker;\n","import logger from './common/logger';\nimport dataContext from './data-context';\nimport Networker from './network/networker';\nimport Consts from './common/consts';\n/**\n * Handles sending data points to the server using metrics\n */\nexport default class MetricManager {\n\tconstructor(configurationLifecycleManager) {\n\t\tthis.configurationLifecycleManager = configurationLifecycleManager;\n\t\tthis.metricTimeoutId = 0;\n\t\tthis.metricErrorCounter = 0;\n\t}\n\t/**\n\t * Start the metric calls\n\t * The function is idempotent so it can be called also to ensure metrics are started\n\t */\n\tstartMetrics() {\n\t\tif (this.metricTimeoutId) {\n\t\t\treturn;\n\t\t}\n\t\tlogger.info('Starting metrics');\n\t\t// Calls metric, wait for it to finish, and start a new metric call\n\t\t// Metrics are sent one at the time in order to successfully handle the DataPoints queue\n\t\tconst metric = async () => {\n\t\t\ttry {\n\t\t\t\tif (\n\t\t\t\t\tdataContext.configuration.get('IsGettingConfiguration') ===\n\t\t\t\t\t\tfalse &&\n\t\t\t\t\tdataContext.configuration.get('AnalyticsChannelNumber') !==\n\t\t\t\t\t\t-1 &&\n\t\t\t\t\tdocument.readyState === 'complete'\n\t\t\t\t) {\n\t\t\t\t\tawait this.sendMetric();\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\t// Catch failed metric so a new one could start\n\t\t\t\tlogger.warn('Metric failed', error);\n\t\t\t}\n\t\t\t// Start a new timer for metric\n\t\t\tthis.metricTimeoutId = Number(\n\t\t\t\tsetTimeout(\n\t\t\t\t\tmetric,\n\t\t\t\t\tdataContext.configuration.get('HeartbeatInterval')\n\t\t\t\t)\n\t\t\t);\n\t\t};\n\t\t// Make the first metric call without waiting an interval.\n\t\t// We want to make sure we send everything we got immediately upon refresh or after getting configuration\n\t\tthis.metricTimeoutId = Number(setTimeout(metric));\n\t}\n\t/**\n\t * Stop the metric calls\n\t * The function is idempotent so it can be called also to ensure metrics are stopped\n\t */\n\tstopMetrics() {\n\t\tlogger.info('Stop metrics');\n\t\tclearTimeout(this.metricTimeoutId);\n\t\tthis.metricTimeoutId = 0;\n\t}\n\t// noinspection JSMethodCanBeStatic\n\t/**\n\t * Prepare the metric, sends it, and delete data that was successfully sent to the server\n\t */\n\tasync sendMetric() {\n\t\t// Save the first n records from the dataPoints queue.\n\t\t// Queue only adds elements to the end of the queue and never prepend so when\n\t\t// we have response from server we can safely delete this first n elements.\n\t\tconst dataPointsResult = dataContext.dataPoints.select(\n\t\t\tdataContext.configuration.get('MaxDataPointsPerHeartbeat'),\n\t\t\tdataContext.configuration.get('AnalyticsChannelType'),\n\t\t\tdataContext.configuration.get('AnalyticsChannelNumber')\n\t\t);\n\t\tif (!dataPointsResult?.dataPoints.length) {\n\t\t\tlogger.debug('Metric skipped: No data points to send');\n\t\t\treturn;\n\t\t}\n\t\t// Send metric data\n\t\tlogger.info('Send metric:', dataPointsResult);\n\t\tconst response = await Networker.sendMetric(dataPointsResult);\n\t\t// Delete the data points that were received by the server\n\t\tif (response.ok) {\n\t\t\tlogger.info('Metric sent successfully');\n\t\t\tdataContext.dataPoints.deleteByCount(\n\t\t\t\tdataPointsResult.dataPoints.length\n\t\t\t);\n\t\t\tthis.metricErrorCounter = 0;\n\t\t\t// If metric was failed because the session ended (not found), delete its data points\n\t\t\t// Check we have more attempts for sending\n\t\t} else if (this.metricErrorCounter < Consts.MAX_METRIC_CALL_ATTEMPTS) {\n\t\t\tthis.metricErrorCounter++;\n\t\t\tlogger.info(\n\t\t\t\t`Metric failed for a session ${dataPointsResult.sessionId},`,\n\t\t\t\t`trying again: (attempt ${this.metricErrorCounter}/${Consts.MAX_METRIC_CALL_ATTEMPTS})`\n\t\t\t);\n\t\t\tif (response?.errorCode === 3 /* ErrorCode.MetricBadRequest */) {\n\t\t\t\t// No action on bad request error, add event should correct the configuration if required.\n\t\t\t\tlogger.info(\n\t\t\t\t\t`MetricBadRequest: Metric API failed for the session, SDK should not fall in this state: ${dataPointsResult.sessionId},`,\n\t\t\t\t\t`total datapoints deleted: (${dataPointsResult.dataPoints.length})`\n\t\t\t\t);\n\t\t\t\tdataContext.dataPoints.deleteByCount(\n\t\t\t\t\tdataPointsResult.dataPoints.length\n\t\t\t\t);\n\t\t\t\tthis.metricErrorCounter = 0;\n\t\t\t}\n\t\t\tif (response?.errorCode === 4 /* ErrorCode.MetricServerError */) {\n\t\t\t\t// No action on server error, set the retry counter to max.\n\t\t\t\tlogger.info(\n\t\t\t\t\t`MetricServerError: Metric API failed for the session, Gateway returned Server Error: ${dataPointsResult.sessionId},`,\n\t\t\t\t\t`total datapoints deleted: (${dataPointsResult.dataPoints.length})`\n\t\t\t\t);\n\t\t\t\tdataContext.dataPoints.deleteByCount(\n\t\t\t\t\tdataPointsResult.dataPoints.length\n\t\t\t\t);\n\t\t\t\tthis.metricErrorCounter = 0;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tresponse?.errorCode ===\n\t\t\t\t2 /* ErrorCode.MetricAuthTokenInvalidOrExpired */\n\t\t\t) {\n\t\t\t\t// Send metric data\n\t\t\t\tlogger.info(\n\t\t\t\t\t'MetricAuthTokenInvalidOrExpired: Configuration refresh started - ',\n\t\t\t\t\tdataPointsResult.sessionId\n\t\t\t\t);\n\t\t\t\tawait this.configurationLifecycleManager.startNewConfiguration();\n\t\t\t\tlogger.info(\n\t\t\t\t\t'MetricAuthTokenInvalidOrExpired: Configuration refresh completed - ',\n\t\t\t\t\tdataPointsResult.sessionId\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tlogger.info(\n\t\t\t\t`Metric failed for a session ${dataPointsResult.sessionId},`,\n\t\t\t\t`total datapoints deleted: (${dataPointsResult.dataPoints.length})`\n\t\t\t);\n\t\t\tdataContext.dataPoints.deleteByCount(\n\t\t\t\tdataPointsResult.dataPoints.length\n\t\t\t);\n\t\t\tthis.metricErrorCounter = 0;\n\t\t}\n\t}\n}\n","import dataContext from './data-context';\nimport logger from './common/logger';\nimport { getGuid } from './common/utils/string-utils';\nimport MetadataRecorder from './recorders/metadata-recorder';\nimport Consts from './common/consts';\nimport { isDefined } from './common/validators';\nimport Networker from './network/networker';\n\nexport var ConfigurationState;\n(function (ConfigurationState) {\n\t/**\n\t * Created and haven't get config response yet\n\t */\n\tConfigurationState[(ConfigurationState['Created'] = 0)] = 'Created';\n\t/**\n\t * Got config and alive\n\t */\n\tConfigurationState[(ConfigurationState['Started'] = 1)] = 'Started';\n\t/**\n\t * Config was ended\n\t */\n\tConfigurationState[(ConfigurationState['Ended'] = 2)] = 'Ended';\n})(ConfigurationState || (ConfigurationState = {}));\n/**\n * Determines what is the state of the current session been tracked\n */\nexport default class ConfigurationLifecycleManager {\n\tconstructor() {\n\t\tthis.isGettingCurrSessionConfig = false;\n\t\tthis.metadataRecorder = new MetadataRecorder();\n\t}\n\tgetIsGettingCurrSessionConfig() {\n\t\treturn this.isGettingCurrSessionConfig;\n\t}\n\tsetIsGettingConfiguration(requestId, isGettingConfiguration) {\n\t\t// Check that request id is latest to avoid changing state of\n\t\t// curr session because received old config before new one arrived\n\t\tif (requestId === dataContext.configuration.get('RequestId')) {\n\t\t\tthis.isGettingCurrSessionConfig = isGettingConfiguration;\n\t\t}\n\t}\n\t// Missing User Id from the below two variables means it is an anonymous user\n\t// and the config refresh decision will be taken further by configReloadTime variable\n\t// and not by this function.\n\t// In all other scenarios this function will return the comparison value between these two variables.\n\tisUserChanged() {\n\t\tif (\n\t\t\t(dataContext.configuration.get('AppUserId') === undefined ||\n\t\t\t\tdataContext.configuration.get('AppUserId') === '') &&\n\t\t\t(dataContext.appUserId.get() === undefined ||\n\t\t\t\tdataContext.appUserId.get() === '')\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\treturn (\n\t\t\tdataContext.configuration.get('AppUserId') !==\n\t\t\tdataContext.appUserId.get()\n\t\t);\n\t}\n\treloadConfigurationIfNeeded() {\n\t\treturn dataContext.configuration.reloadConfigurationIfNeeded();\n\t}\n\tgetCurrentState() {\n\t\t// If user is changed from some authenticated user to anonymous user, session is immediately considered terminated\n\t\tif (!this.isGettingCurrSessionConfig && this.isUserChanged()) {\n\t\t\tlogger.debug(\n\t\t\t\t`Configuration Lifecycle: User switched from ${dataContext.configuration.get('AppUserId')} to ${dataContext.appUserId.get()} , Configuration needs reload.`\n\t\t\t);\n\t\t\treturn ConfigurationState.Ended;\n\t\t}\n\t\tif (\n\t\t\t!this.isGettingCurrSessionConfig &&\n\t\t\tthis.reloadConfigurationIfNeeded()\n\t\t) {\n\t\t\tlogger.debug('Configuration Lifecycle: Configuration needs reload');\n\t\t\treturn ConfigurationState.Ended;\n\t\t}\n\t\treturn ConfigurationState.Started;\n\t}\n\tasync startNewConfiguration() {\n\t\tconst requestId = getGuid();\n\t\tlogger.info('Starting new configuration with request id', requestId);\n\t\tdataContext.configuration.startNewConfiguration(requestId);\n\t\tthis.setIsGettingConfiguration(requestId, true);\n\t\tconst response = await Networker.getConfiguration(requestId);\n\t\tthis.setIsGettingConfiguration(requestId, false);\n\t\tdataContext.configuration.updateInstanceConfigCallInProgress(false);\n\t\tif (response.ok) {\n\t\t\tthis.gotConfiguration(requestId);\n\t\t} else {\n\t\t\tlogger.warn('Got bad config response for request id', requestId);\n\t\t\tdataContext.dataPoints.deletePreSessionItems(requestId);\n\t\t}\n\t}\n\tgotConfiguration(requestId) {\n\t\tlogger.info(\n\t\t\t'Got session id:',\n\t\t\tdataContext.configuration.get('SessionId')\n\t\t);\n\t\t// Need to assign all pre session items so they could be sent on heartbeats\n\t\tdataContext.dataPoints.assignPreSessionItems(\n\t\t\trequestId,\n\t\t\tdataContext.configuration.get('SessionId'),\n\t\t\tdataContext.configuration.get('ConfigReceivedTime'),\n\t\t\tdataContext.configuration.get('SessionIdCreatedTime')\n\t\t);\n\t\tconst logLevel = dataContext.configuration.get('LogLevel');\n\t\tif (isDefined(logLevel)) {\n\t\t\t// Log level on development mode should be stronger than what we get from server response\n\t\t\tif (Consts.IS_PRODUCTION) {\n\t\t\t\tlogger.setDebugLevel(logLevel);\n\t\t\t} else {\n\t\t\t\tlogger.warn(\n\t\t\t\t\t'Log level can be changed from config response only in production'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\t// Make sure client id is updated\n\t\tdataContext.clientId.set(dataContext.configuration.get('ClientId'));\n\t\tif (dataContext.configuration.get('RecordMetadata')) {\n\t\t\t// Send the user id on the first heartbeat\n\t\t\tthis.metadataRecorder.user.setAppUserId(\n\t\t\t\tdataContext.configuration.get('AppUserId')\n\t\t\t);\n\t\t} else {\n\t\t\t// Don't stop the session and let it run in order to make sure a new session will start only after timeout\n\t\t\tlogger.info(\n\t\t\t\t'Record metadata is false so no data points will be collected'\n\t\t\t);\n\t\t}\n\t}\n}\n","import dataContext from './data-context';\n/**\n * Determines what is the state of the current session been tracked\n */\nexport default class SessionLifecycleManager {\n\tconstructor() {\n\t\tthis.isGettingCurrSessionConfig = false;\n\t}\n\tresetSessionIfNeeded(shouldForceReset) {\n\t\t// If there is session id, we have a valid session running that could get a Timeout\n\t\tdataContext.configuration.resetSessionIfNeeded(shouldForceReset);\n\t}\n\tstopSession(deleteDataPoints = false) {\n\t\t// If needed, delete data points before config so we can extract session id\n\t\tif (deleteDataPoints) {\n\t\t\tdataContext.dataPoints.deleteBySessionId(\n\t\t\t\tdataContext.configuration.get('SessionId')\n\t\t\t);\n\t\t}\n\t}\n}\n","import { SNTypeError } from '../errors';\nimport { isNullOrUndefined, isString } from '../validators';\n\nexport function normalizeAppUserId(appUserId) {\n\t// Ensure the value sent is null, undefined or string\n\tif (!isNullOrUndefined(appUserId) && !isString(appUserId)) {\n\t\tthrow new SNTypeError('User id must be a non empty string');\n\t}\n\t// Making sure empty string counts as anonymous\n\treturn appUserId || undefined;\n}\n","import { SNError } from '../common/errors';\nimport logger from '../common/logger';\n\nexport function StartSession(target, name, descriptor) {\n\tconst originalMethod = descriptor.value;\n\tdescriptor.value = function startSessionDescriptor(...args) {\n\t\ttry {\n\t\t\tthis.startNewSessionIfNeeded();\n\t\t} catch (error) {\n\t\t\tlogger.warn(`startNewSessionIfNeeded failed in ${name}:`, error);\n\t\t}\n\t\t// Always call the original method\n\t\treturn originalMethod.apply(this, args);\n\t};\n\treturn descriptor;\n}\n\nexport function EnsureWired(target, name, descriptor) {\n\tconst originalMethod = descriptor.value;\n\tdescriptor.value = function ensureWiredDescriptor(...args) {\n\t\tif (this.isWired) {\n\t\t\treturn originalMethod.apply(this, args);\n\t\t}\n\t\tthrow new SNError('Must call SNAnalytics.start beforehand');\n\t};\n\treturn descriptor;\n}\n","import { TrackingLevel } from './common/types';\nimport logger from './common/logger';\nimport dataContext from './data-context';\nimport MetadataRecorder from './recorders/metadata-recorder';\nimport MetricManager from './metric-manager';\nimport ConfigurationLifecycleManager, {\n\tConfigurationState,\n} from './configuration-lifecycle-manager';\nimport SessionLifecycleManager from './session-lifecycle-manager';\nimport Consts from './common/consts';\nimport {\n\tisBoolean,\n\tisDefined,\n\tisNonEmptyString,\n\tisObject,\n\tisString,\n\tisUndefined,\n} from './common/validators';\nimport { SNTypeError, SNError } from './common/errors';\nimport Networker from './network/networker';\nimport { tryGetEnumValue } from './common/utils/object-utils';\nimport { normalizeAppUserId } from './common/utils/user-utils';\nimport { CatchAll, CatchAllAndReturn } from './decorator/common';\nimport { StartSession, EnsureWired } from './decorator/session';\nimport { decorateMethod } from './decorator/utils';\n/**\n * A singleton class that handles high level SDK behavior and session lifetime\n */\nclass Manager {\n\tconstructor() {\n\t\tthis.isWired = false;\n\t\tthis.configurationLifecycleManager =\n\t\t\tnew ConfigurationLifecycleManager();\n\t\tthis.sessionLifecycleManager = new SessionLifecycleManager();\n\t\tthis.metricManager = new MetricManager(\n\t\t\tthis.configurationLifecycleManager\n\t\t);\n\t\tthis.metadataRecorder = new MetadataRecorder();\n\t\tthis.isConfigCallInProgress = false;\n\t\t// #endregion\n\t}\n\t// #region Public\n\t// Don't catch errors here\n\tstart(apiKey, options) {\n\t\tconst legacyApiKey = apiKey;\n\t\tif (!isNonEmptyString(apiKey)) {\n\t\t\tthrow new SNTypeError(\n\t\t\t\t'\"apiKey\" must be a string and cannot be empty'\n\t\t\t);\n\t\t}\n\t\tif (!options?.saveAppContext && options?.appContextId) {\n\t\t\tconst parts = apiKey.split(':');\n\t\t\t// Case where there is exactly one part (no colons)\n\t\t\tif (parts.length === 1) {\n\t\t\t\t// Replace the entire key with appContextId if provided\n\t\t\t\tapiKey = options.appContextId;\n\t\t\t}\n\t\t\t// Case where there are exactly 2 or 3 parts (one or two colons)\n\t\t\t// We don't expect 3 parts but adding just to handle any such scenario.\n\t\t\tif (parts.length === 2 || parts.length === 3) {\n\t\t\t\t// Replace the last part with appContextId if provided\n\t\t\t\tparts[parts.length - 1] = options.appContextId;\n\t\t\t\tapiKey = parts.join(':'); // Return the modified key\n\t\t\t}\n\t\t} else if (options?.saveAppContext) {\n\t\t\t// For ui-builder app context id, web analytics sends saveAppContext true because sdk\n\t\t\t// is already started with actual uuid app sys id and string ui-builder is also already\n\t\t\t// started in legacy sdk.\n\t\t\t// The flow should just returne from here without doing anything.\n\t\t\treturn;\n\t\t} else {\n\t\t\t// No modifications in ApiKey for service portal\n\t\t}\n\t\tlogger.info('Start session - API Key:', apiKey, ', Options:', options);\n\t\t// Starting from Yokohama to support UX Metrics:\n\t\t// Wiring is allowed only once if the apiKey received is same. If different then it will start a new wiring.\n\t\tif (\n\t\t\tthis.isWired &&\n\t\t\tapiKey === dataContext.configuration.get('ApiKey')\n\t\t) {\n\t\t\t// Set settings if sent\n\t\t\tif (isObject(options)) {\n\t\t\t\tif (isDefined(options?.instanceDomainName)) {\n\t\t\t\t\tConsts.instanceDomainName = options?.instanceDomainName;\n\t\t\t\t}\n\t\t\t\t// Set user id before config\n\t\t\t\tif (\n\t\t\t\t\tisDefined(dataContext.appUserId.get()) ||\n\t\t\t\t\tisDefined(options.userId)\n\t\t\t\t) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlogger.info('Set user id before config');\n\t\t\t\t\t\t// Normalize will throw an error if not valid\n\t\t\t\t\t\tconst appUserId = normalizeAppUserId(options.userId);\n\t\t\t\t\t\tif (dataContext.appUserId.get() !== appUserId) {\n\t\t\t\t\t\t\tthis.sessionLifecycleManager.resetSessionIfNeeded(\n\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tthis.startNewSessionIfNeeded();\n\t\t\t\t\t\t\tdataContext.dataPoints.deleteOtherSessions(\n\t\t\t\t\t\t\t\tdataContext.configuration.get('SessionId')\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdataContext.appUserId.set(appUserId);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t// Not throw an error but still log it as one\n\t\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t\terror instanceof Error ? error.message : error\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// added because for anonymous user we don't want the user id to be sent again.\n\t\t\t\t\t// and we want to remove from local storage.\n\t\t\t\t\tdataContext.appUserId.remove();\n\t\t\t\t}\n\t\t\t\tthis.saveDomain(options);\n\t\t\t\tthis.saveAppContext(options);\n\t\t\t\t// Important!\n\t\t\t\t// Tracking consent setting should be the last settings to be set since it\n\t\t\t\t// may start the session in case the consent is changed to Basic or Full\n\t\t\t\tif (isDefined(options.trackingConsent)) {\n\t\t\t\t\tthis.setTrackingConsent(options.trackingConsent);\n\t\t\t\t}\n\t\t\t}\n\t\t\tlogger.info('SDK is already wired and running');\n\n\t\t\t// check if new config call needs to go\n\t\t\tthis.startNewSessionIfNeeded();\n\t\t\treturn;\n\t\t}\n\t\tif (isDefined(options)) {\n\t\t\tif (!isObject(options)) {\n\t\t\t\tthrow new SNTypeError('\"options\" must be an object');\n\t\t\t}\n\t\t\tif (isDefined(options?.instanceDomainName)) {\n\t\t\t\tConsts.instanceDomainName = options.instanceDomainName;\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\tthis.wire(apiKey, legacyApiKey);\n\t\t} catch (error) {\n\t\t\tlogger.error('SDK wiring failed', error);\n\t\t\tthis.unwire();\n\t\t\treturn;\n\t\t}\n\t\t// Set settings if sent\n\t\tif (isObject(options)) {\n\t\t\t// Set user id before config\n\t\t\tif (\n\t\t\t\tisDefined(dataContext.appUserId.get()) ||\n\t\t\t\tisDefined(options.userId)\n\t\t\t) {\n\t\t\t\ttry {\n\t\t\t\t\tlogger.info('Set user id before config');\n\t\t\t\t\t// Normalize will throw an error if not valid\n\t\t\t\t\tconst appUserId = normalizeAppUserId(options.userId);\n\t\t\t\t\tif (dataContext.appUserId.get() !== appUserId) {\n\t\t\t\t\t\tthis.sessionLifecycleManager.resetSessionIfNeeded(true);\n\t\t\t\t\t\t// need to start new config call as reset session changes session id and backend needs to\n\t\t\t\t\t\tthis.startNewSessionIfNeeded();\n\t\t\t\t\t\tdataContext.dataPoints.deleteOtherSessions(\n\t\t\t\t\t\t\tdataContext.configuration.get('SessionId')\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tdataContext.appUserId.set(appUserId);\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Not throw an error but still log it as one\n\t\t\t\t\tlogger.error(\n\t\t\t\t\t\terror instanceof Error ? error.message : error\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// added because for anonymous user we don't want the user id to be sent again.\n\t\t\t\t// and we want to remove from local storage.\n\t\t\t\tdataContext.appUserId.remove();\n\t\t\t}\n\t\t\tthis.saveDomain(options);\n\t\t\tthis.saveAppContext(options);\n\t\t\t// Important!\n\t\t\t// Tracking consent setting should be the last settings to be set since it\n\t\t\t// may start the session in case the consent is changed to Basic or Full\n\t\t\tif (isDefined(options.trackingConsent)) {\n\t\t\t\tthis.setTrackingConsent(options.trackingConsent);\n\t\t\t}\n\t\t}\n\t\tthis.startNewSessionIfNeeded();\n\t}\n\n\tstartPage(name, description) {\n\t\tlogger.info('Start page - Name:', name, ', Description:', description);\n\t\tthis.metadataRecorder.page.start(name, description);\n\t}\n\taddEvent(name, properties, type) {\n\t\tlogger.info(\n\t\t\t'Add event - Name:',\n\t\t\tname,\n\t\t\t', Properties:',\n\t\t\tproperties,\n\t\t\t', Type:',\n\t\t\ttype\n\t\t);\n\t\tthis.metadataRecorder.event.add(name, properties, type);\n\t}\n\taddChatEvent(name, properties) {\n\t\tthis.metadataRecorder.event.addChat(name, properties);\n\t}\n\tsetUserId(id) {\n\t\tif (!this.validateSdkReady()) return;\n\t\tlogger.info('Set user id:', id);\n\t\tconst appUserId = normalizeAppUserId(id);\n\t\tdataContext.appUserId.set(appUserId);\n\t\t// Changing user id should triggers new session\n\t\tthis.startNewSessionIfNeeded();\n\t}\n\tsetUserProperty(name, value) {\n\t\tlogger.info('Set user property:', name, '-', value);\n\t\tthis.metadataRecorder.user.setProperty(name, value);\n\t}\n\tsetUserProperties(properties) {\n\t\tlogger.info('Set user properties:', properties);\n\t\tthis.metadataRecorder.user.setProperties(properties);\n\t}\n\tremoveUserProperty(name) {\n\t\tlogger.info('Remove user property:', name);\n\t\tthis.metadataRecorder.user.removeProperty(name);\n\t}\n\tincUserProperty(name, value) {\n\t\tlogger.info('Increment user property:', name, '-', value);\n\t\tthis.metadataRecorder.user.incProperty(name, value);\n\t}\n\tappendToUserProperty(name, value) {\n\t\tlogger.info('Append to user property:', name, '-', value);\n\t\tthis.metadataRecorder.user.appendToProperty(name, value);\n\t}\n\tstartPerformanceTrace(key, type) {\n\t\tlogger.info('Started Performance Trace:', key, '-', type);\n\t\treturn this.metadataRecorder.performance.start(key, type);\n\t}\n\taddPerformanceTrace(key, type, duration, properties, startTime) {\n\t\tlogger.info('Added Performance Trace:', key, '-', type);\n\t\tthis.metadataRecorder.performance.add(\n\t\t\tkey,\n\t\t\ttype,\n\t\t\tduration,\n\t\t\tproperties,\n\t\t\tstartTime\n\t\t);\n\t}\n\tsetTrackingConsent(trackingLevel) {\n\t\tlogger.info('Set tracking consent level to:', trackingLevel);\n\t\tlet newConsent = tryGetEnumValue(trackingLevel, TrackingLevel, true);\n\t\tif (!isDefined(newConsent)) {\n\t\t\tif (isBoolean(trackingLevel)) {\n\t\t\t\t// Support old versions when tracking was boolean\n\t\t\t\tnewConsent = trackingLevel\n\t\t\t\t\t? TrackingLevel.Full\n\t\t\t\t\t: TrackingLevel.Disabled;\n\t\t\t\tlogger.warn('Boolean tracking consent level is deprecated');\n\t\t\t} else {\n\t\t\t\tthrow new SNError(\n\t\t\t\t\t`Tracking consent Level must be one of: ${Object.keys(TrackingLevel).join(' | ')}`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst oldConsent = dataContext.trackingConsent.get();\n\t\t// Same consent - do nothing\n\t\tif (newConsent === oldConsent) {\n\t\t\tlogger.info('Tracking consent level is the same:', newConsent);\n\t\t\treturn;\n\t\t}\n\t\tdataContext.trackingConsent.set(newConsent);\n\t\tlogger.info('Tracking consent level is now:', newConsent);\n\t\tconst configCurrentState =\n\t\t\tthis.configurationLifecycleManager.getCurrentState();\n\t\tif (\n\t\t\tnewConsent === TrackingLevel.Basic ||\n\t\t\tnewConsent === TrackingLevel.Full ||\n\t\t\tnewConsent === TrackingLevel.Essential\n\t\t) {\n\t\t\t// Enable: Start a new session if needed and add event\n\t\t\tif (this.startNewSessionIfNeeded()) {\n\t\t\t\tthis.sessionLifecycleManager.resetSessionIfNeeded(true);\n\t\t\t\tthis.metadataRecorder.event.addConsentChange(\n\t\t\t\t\tnewConsent,\n\t\t\t\t\toldConsent\n\t\t\t\t);\n\t\t\t}\n\t\t} else if (\n\t\t\tconfigCurrentState === ConfigurationState.Created ||\n\t\t\tconfigCurrentState === ConfigurationState.Started\n\t\t) {\n\t\t\t// Disabled: Add an event with tracking disabled as the last data point of the session\n\t\t\tthis.metadataRecorder.event.addConsentChange(\n\t\t\t\tnewConsent,\n\t\t\t\toldConsent\n\t\t\t);\n\t\t\t// this.stopSession();\n\t\t} else {\n\t\t\t// If consent is Disabled and session is not alive, we have nothing to do\n\t\t}\n\t}\n\tgetTrackingConsent() {\n\t\tlogger.info('Get tracking consent');\n\t\treturn dataContext.trackingConsent.get();\n\t}\n\tasync deleteCurrentUserData() {\n\t\tlogger.info('Deleting current user data');\n\t\tthis.setTrackingConsent(TrackingLevel.Disabled);\n\t\tconst clientId = dataContext.clientId.get();\n\t\tif (!clientId || clientId === Consts.DEFAULT_CLIENT_ID) {\n\t\t\t// ClientId was not found - return true. The caller should not be notified about\n\t\t\t// this as it cannot do anything (retrying would yield the same result).\n\t\t\tlogger.warn('SNAnalytics was never started on the device');\n\t\t\treturn true;\n\t\t}\n\t\tconst appUserId = dataContext.appUserId.get();\n\t\tconst response = await Networker.deleteUserData(appUserId);\n\t\tif (!response.ok) {\n\t\t\tthrow new SNError(`Server could not delete user ${appUserId}`);\n\t\t}\n\t\tdataContext.appUserId.remove();\n\t\tthis.stopSession(true);\n\t\treturn true;\n\t}\n\tsetDebugLevel(logLevel) {\n\t\tlogger.info('Set debug level:', logLevel);\n\t\tlogger.setDebugLevel(logLevel);\n\t}\n\t// #endregion\n\t// #region Decorators\n\t/**\n\t * Decorator for Manager endpoints that should make sure that there is a session started\n\t */\n\tStartSession(target, name, descriptor) {\n\t\tconst originalMethod = descriptor.value; // references the method being decorated\n\t\t// Not using arrow function so this will be bound to the caller, which is the Manager instance\n\t\t// since callers can only be within this class\n\t\tdescriptor.value = function startSessionDescriptor(...args) {\n\t\t\t// If should record, call original method. Otherwise do nothing.\n\t\t\treturn this.startNewSessionIfNeeded()\n\t\t\t\t? originalMethod.apply(this, args)\n\t\t\t\t: undefined;\n\t\t};\n\t\treturn descriptor;\n\t}\n\t/**\n\t * Static getter to `StartSession` function in order to use the decorator\n\t * with `` instead of `@Manager.prototype.StartSession`\n\t */\n\tstatic get StartSession() {\n\t\treturn Manager.prototype.StartSession;\n\t}\n\t/**\n\t * Decorator for Manager endpoints that should make sure that we are wired\n\t */\n\tEnsureWired(target, name, descriptor) {\n\t\tconst originalMethod = descriptor.value; // references the method being decorated\n\t\t// Not using arrow function so this will be bound to the caller, which is the Manager instance\n\t\t// since callers can only be within this class\n\t\tdescriptor.value = function ensureWiredDescriptor(...args) {\n\t\t\tif (this.isWired) {\n\t\t\t\treturn originalMethod.apply(this, args);\n\t\t\t}\n\t\t\tthrow new SNError('Must call SNAnalytics.start beforehand');\n\t\t};\n\t\treturn descriptor;\n\t}\n\t/**\n\t * Static getter to `EnsureWired` function in order to use the decorator\n\t * with `` instead of `@Manager.prototype.EnsureWired`\n\t */\n\tstatic get EnsureWired() {\n\t\treturn Manager.prototype.EnsureWired;\n\t}\n\t// #endregion\n\t// #region Private\n\tvalidateSdkReady() {\n\t\t// Make sure SDK is wired\n\t\tif (!this.isWired) {\n\t\t\tlogger.warn('Must call SNAnalytics.start beforehand');\n\t\t\treturn false;\n\t\t}\n\t\tconst consent = dataContext.trackingConsent.get();\n\t\tif (consent === TrackingLevel.Disabled) {\n\t\t\tlogger.warn('No tracking consent given');\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * Start a new session if needed. Returns a boolean that indicates if should record.\n\t * This method is the entry point for all API methods that create DataPoints\n\t */\n\tstartNewSessionIfNeeded() {\n\t\ttry {\n\t\t\tif (!this.validateSdkReady()) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst sessionState =\n\t\t\t\tthis.configurationLifecycleManager.getCurrentState();\n\t\t\tconst changedGlideSession = this.checkGlideSessionHasChanged();\n\t\t\tif (changedGlideSession) {\n\t\t\t\tthis.sessionLifecycleManager.resetSessionIfNeeded(true);\n\t\t\t}\n\t\t\t// Session is not alive and there is no an ongoing request => create new session.\n\t\t\telse this.sessionLifecycleManager.resetSessionIfNeeded(false);\n\t\t\tif (\n\t\t\t\tsessionState === ConfigurationState.Ended ||\n\t\t\t\tchangedGlideSession\n\t\t\t) {\n\t\t\t\t// Return without waiting for config response so pre-config items will be gathered according to default configuration\n\t\t\t\t// startNewConfiguration is wrapped in setTimeout\n\t\t\t\t// and if already a config call is in progress, the flow should return from here.\n\t\t\t\tif (this.isConfigCallInProgress) {\n\t\t\t\t\treturn dataContext.configuration.get('RecordMetadata');\n\t\t\t\t}\n\t\t\t\tthis.isConfigCallInProgress = true;\n\t\t\t\tdataContext.configuration.updateInstanceConfigCallInProgress(\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t\t// Don't await this to allow data points to be gathered while waiting for server response\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (\n\t\t\t\t\t\t!this.configurationLifecycleManager.getIsGettingCurrSessionConfig()\n\t\t\t\t\t)\n\t\t\t\t\t\tthis.startNewConfiguration();\n\t\t\t\t\tdataContext.configuration.updateInstanceConfigCallInProgress(\n\t\t\t\t\t\tfalse\n\t\t\t\t\t);\n\t\t\t\t\tthis.isConfigCallInProgress = false;\n\t\t\t\t}, 5000);\n\t\t\t}\n\t\t\t// Return without waiting for config response so pre-session items will be gathered according to default configuration\n\t\t\treturn dataContext.configuration.get('RecordMetadata');\n\t\t} catch (error) {\n\t\t\tlogger.error('Could not start a session:', error);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tcheckGlideSessionHasChanged() {\n\t\tconst currentGCK = window.g_ck;\n\t\tconst sessionGCK = dataContext.configuration.get('g_ck');\n\t\treturn sessionGCK !== currentGCK;\n\t}\n\n\t/**\n\t * Initialize stores, register to event listeners, etc.\n\t */\n\twire(apiKey, legacyApiKey) {\n\t\tlogger.info('Wiring SDK...');\n\t\t// Set keys must be the very first thing that wire does! without it dataContext is not available\n\t\tdataContext.setKeys(apiKey, legacyApiKey);\n\t\t// Delete all pre session items since no config will ever arrive for them\n\t\tdataContext.dataPoints.deletePreSessionItems();\n\t\t// Metrics works as long as the SDK is wired\n\t\tthis.metricManager.startMetrics();\n\t\tthis.isWired = true;\n\t\tlogger.info('SDK is Wired');\n\t}\n\tunwire() {\n\t\tthis.isWired = false;\n\t\tthis.metricManager.stopMetrics();\n\t}\n\tstopSession(deleteDataPoints = false) {\n\t\t// If needed, delete data points before config so we can extract session id\n\t\tif (deleteDataPoints) {\n\t\t\tdataContext.dataPoints.deleteBySessionId(\n\t\t\t\tdataContext.configuration.get('SessionId')\n\t\t\t);\n\t\t}\n\t\tdataContext.configuration.deleteData();\n\t}\n\tasync startNewConfiguration() {\n\t\tthis.configurationLifecycleManager.startNewConfiguration();\n\t}\n\tsaveDomain(options) {\n\t\tif (isUndefined(options.domainId) && isUndefined(options.domainName)) {\n\t\t\tdataContext.domain.remove();\n\t\t\treturn;\n\t\t}\n\t\tif (isDefined(options.domainId) && !isString(options.domainId)) {\n\t\t\tthrow new SNTypeError('\"domainId\" must be string');\n\t\t}\n\t\tif (isDefined(options.domainName) && !isString(options.domainName)) {\n\t\t\tthrow new SNTypeError('\"domainName\" must be string');\n\t\t}\n\t\tdataContext.domain.set({\n\t\t\tid: options.domainId,\n\t\t\tname: options.domainName,\n\t\t});\n\t}\n\tsaveAppContext(options) {\n\t\tif (\n\t\t\tisUndefined(options.appContextId) &&\n\t\t\tisUndefined(options.appContextName)\n\t\t) {\n\t\t\tdataContext.appContext.remove();\n\t\t\treturn;\n\t\t}\n\t\tif (\n\t\t\tisDefined(options.appContextId) &&\n\t\t\t!isString(options.appContextId)\n\t\t) {\n\t\t\tthrow new SNTypeError('\"appContextId\" must be string');\n\t\t}\n\t\tif (\n\t\t\tisDefined(options.appContextName) &&\n\t\t\t!isString(options.appContextName)\n\t\t) {\n\t\t\tthrow new SNTypeError('\"appContextName\" must be string');\n\t\t}\n\t\tdataContext.appContext.set({\n\t\t\tid: options.appContextId,\n\t\t\tname: options.appContextName,\n\t\t});\n\t}\n}\n\ndecorateMethod(Manager, 'addEvent', CatchAll, StartSession);\ndecorateMethod(Manager, 'setUserId', CatchAll);\ndecorateMethod(Manager, 'setUserProperty', CatchAll, StartSession);\ndecorateMethod(Manager, 'setUserProperties', CatchAll, StartSession);\ndecorateMethod(Manager, 'removeUserProperty', CatchAll, StartSession);\ndecorateMethod(Manager, 'incUserProperty', CatchAll, StartSession);\ndecorateMethod(Manager, 'appendToUserProperty', CatchAll, StartSession);\ndecorateMethod(Manager, 'startPerformanceTrace', CatchAll, StartSession);\ndecorateMethod(Manager, 'addPerformanceTrace', CatchAll, StartSession);\n\ndecorateMethod(Manager, 'setTrackingConsent', CatchAll, EnsureWired);\ndecorateMethod(\n\tManager,\n\t'getTrackingConsent',\n\tCatchAllAndReturn(TrackingLevel.Disabled),\n\tEnsureWired\n);\ndecorateMethod(\n\tManager,\n\t'deleteCurrentUserData',\n\tCatchAllAndReturn(false),\n\tEnsureWired\n);\n\ndecorateMethod(Manager, 'setDebugLevel', CatchAll);\ndecorateMethod(Manager, 'unwire', CatchAll);\ndecorateMethod(Manager, 'startNewConfiguration', CatchAll);\n\nexport default new Manager();\n","import manager from './manager';\n/**\n * SNAnalytics SDK\n */\nexport default class SNAnalytics {\n\t/**\n\t * Starts the SNAnalytics agent for tracking the current session's data.\n\t * @param apiKey The API key of the current app\n\t * @param apiAuth The API Auth of the account's instance\n\t * @param options Optional settings object for initialization\n\t */\n\tstatic start(apiKey, apiAuth, options) {\n\t\tmanager.start(apiKey, options);\n\t}\n\t/**\n\t * Mark the appearance starting time of a new page.\n\t * @param name The name of the page (e.g. \"welcome_page\").\n\t * @param description Optional description for the page (e.g. \"Welcome Page\").\n\t */\n\tstatic startPage(name, description) {\n\t\tmanager.startPage(name, description);\n\t}\n\t/**\n\t * Add a timed application event (such as: user reached a specific level or page).\n\t * @param name The name of the event (e.g. \"InAppPurchase\").\n\t * @param properties Optional key-value pairs with custom properties for the event.\n\t *                   Properties can only be Number, String, Boolean, or Date.\n\t *                   Property key cannot start with 'SN_' which is saved for the system.\n\t * @param type Optional The type of the event (e.g. \"transaction\")\n\t */\n\tstatic addEvent(name, properties, type) {\n\t\tmanager.addEvent(name, properties, type);\n\t}\n\t/**\n\t * Add a chat event. Sends a T=4 (Chat) data point.\n\t * @param name The name of the chat event (e.g. \"Chat initiated\").\n\t * @param properties Optional key-value pairs with custom properties for the event.\n\t *                   Properties can only be Number, String, Boolean, or Date.\n\t *                   Property key cannot start with 'SN_' which is saved for the system.\n\t */\n\tstatic addChatEvent(name, properties) {\n\t\tmanager.addChatEvent(name, properties);\n\t}\n\t/**\n\t * Sets the application specific user identifier. New user Id triggers new session\n\t * @param id The application-specific user identifier\n\t */\n\tstatic setUserId(id) {\n\t\tmanager.setUserId(id);\n\t}\n\t/**\n\t * Sets a single property for the current user, please call `setUserId(String)` to set the current user.\n\t * @param name The name of the property to set. Cannot start with 'SN_'.\n\t * @param value The value of the property to set\n\t */\n\tstatic setUserProperty(name, value) {\n\t\tmanager.setUserProperty(name, value);\n\t}\n\t/**\n\t * Sets properties for the current user, please call `setUserId(String)` to set the current user.\n\t * @param properties The properties of the user.\n\t *                   Property key cannot start with 'SN_' which is saved for the system.\n\t */\n\tstatic setUserProperties(properties) {\n\t\tmanager.setUserProperties(properties);\n\t}\n\t/**\n\t * Unsets a single property value\n\t * @param name The name of the property to unset. Cannot start with 'SN_'.\n\t */\n\tstatic removeUserProperty(name) {\n\t\tmanager.removeUserProperty(name);\n\t}\n\t/**\n\t * Increments a user property value\n\t * @param name The name of the user property. Cannot start with 'SN_'.\n\t * @param value The value to increment / decrement by\n\t */\n\tstatic incUserProperty(name, value) {\n\t\tmanager.incUserProperty(name, value);\n\t}\n\t/**\n\t * Adds an item to the user property list\n\t * @param name The name of the user property. Cannot start with 'SN_'.\n\t * @param value The item to add to the list\n\t */\n\tstatic appendToUserProperty(name, value) {\n\t\tmanager.appendToUserProperty(name, value);\n\t}\n\t/**\n\t * Returns a started performance trace with current time (millis) as starting point.\n\t * use `Trace.end()` to end the performance trace.\n\t * @param key Trace's key\n\t * @param type Trace's type\n\t */\n\tstatic startPerformanceTrace(key, type) {\n\t\treturn manager.startPerformanceTrace(key, type);\n\t}\n\t/**\n\t * Add a manual performance trace\n\t * @param key Trace's key\n\t * @param type Trace's type\n\t * @param durationMS Duration in milliseconds\n\t * @param properties Optional key-value pairs with custom properties for the event.\n\t *                   Properties can only be Strings.\n\t *                   Property key cannot start with 'SN_' which is saved for the system.\n\t * @param startTime Optional date or time from epoch to mention when the trace was started. Default is now.\n\t */\n\tstatic addPerformanceTrace(key, type, durationMS, properties, startTime) {\n\t\tmanager.addPerformanceTrace(\n\t\t\tkey,\n\t\t\ttype,\n\t\t\tdurationMS,\n\t\t\tproperties,\n\t\t\tstartTime\n\t\t);\n\t}\n\t/**\n\t * Set whether to allow analytics tracking in the current browser (default is 'Disabled').\n\t * Possible values are:\n\t * - Full - Full analytics tracking\n\t * - Basic - Basic metrics without identifying information on the user\n\t * - Disabled - Tracking is turned off\n\t * @param trackingLevel Analytics tracking consent level\n\t */\n\tstatic setTrackingConsent(trackingLevel) {\n\t\tmanager.setTrackingConsent(trackingLevel);\n\t}\n\t/**\n\t * @return The analytics tracking consent status.\n\t */\n\tstatic getTrackingConsent() {\n\t\treturn manager.getTrackingConsent();\n\t}\n\t/**\n\t * Delete all local and remote data for the current user. This method also unsets the current active user,\n\t * and opts out this browser from future tracking.\n\t *\n\t * @return A promise resolves to boolean value stating whether deletion was successful.\n\t * Failure may occur in case the SNAnalytics servers cannot be\n\t * reached (in case there is no connectivity) - and the method should be retried.\n\t */\n\tstatic async deleteCurrentUserData() {\n\t\treturn manager.deleteCurrentUserData();\n\t}\n\t/**\n\t * Set debug level of the SDK to the console.\n\t * @param logLevel The debug level desired. Possible values are 'debug', 'info', 'warn', or 'error'.\n\t */\n\tstatic setDebugLevel(logLevel) {\n\t\tmanager.setDebugLevel(logLevel);\n\t}\n}\n","import { setConfigValue, getConfigValue } from '@servicenow/ui-analytics-api';\n\nconst config = {\n\tenableExporter: false,\n\texporterInterval: 5000,\n\tsumCounter: true,\n\tlastValueOnlyGauage: true,\n\taugmentPage: (page) => page,\n\tcollecterUrl: '/api/now/trace',\n\tenableCollection: false,\n\tlegacyConfig: {},\n\tlegacy: false,\n};\n\nexport const set = (key, value) => {\n\tif (config[key] !== undefined) config[key] = value;\n\telse setConfigValue(key, value);\n};\n\nexport const get = (key) =>\n\tconfig[key] !== undefined ? config[key] : getConfigValue(key);\n","export const UXF_DIRECT_LOAD_COMPLETE = 'UXF_DIRECT_LOAD_COMPLETE';\nexport const UXF_USER_NAV_LOAD_COMPLETE = 'UXF_USER_NAV_LOAD_COMPLETE';\nexport const SELECT_MENU_ITEM = 'Select Menu Item';\nexport const EXPERIENCE_START = 'EXPERIENCE_START';\nexport const USER_NAVIGATE = 'USER_NAVIGATE';\nexport const $PERF_DATA = '$PERF-DATA';\n\n// removing this breaks processMark even though it\n// isn't referenced anywhere in the code ¯\\_(ツ)_/¯\nexport const COMP_SN_POLARIS_NAME = 'SN-POLARIS-MENU';\n\nexport const EVENT_MAPPING = {\n\t[EXPERIENCE_START]: 'Page Navigate',\n\t[USER_NAVIGATE]: 'Page Navigate',\n};\n","import {\n\t$PERF_DATA,\n\tUXF_DIRECT_LOAD_COMPLETE,\n\tUXF_USER_NAV_LOAD_COMPLETE,\n} from './legacy/events';\n\nexport const SUB = 'sub';\nexport const RECORD = 'record';\nexport const CLASSIC = 'classic';\nexport const URLMASKSTRING = '***';\nexport const PARAMS_SEPARATOR = '/params/';\nexport const SUB_SEPARATOR = '/sub/';\nexport const CLASSIC_URL_PARAMS = [\n\t'sysparm_query',\n\t'sysparm_view',\n\t'sysparm_userpref_module',\n\t'sys_id',\n\t'sysparm_record_target',\n\t'sysparm_dashboard',\n];\nexport const NAME = 'appsee';\nexport const UNIFIED_NAVIGATION_APP = 'Unified Navigation App';\nexport const NEXT_EXPERIENCE_CHANNEL_ID = 'a84adaf4c700201072b211d4d8c260b7';\nexport const TRACKING_CONSENT = Object.freeze({\n\tfull: 'Full',\n\tbasic: 'Basic',\n\tdisabled: 'Disabled',\n\tmissing: 'Needed',\n\tessential: 'Essential',\n});\n\nexport const ALLOWED_PERF_EVENTS = [\n\t$PERF_DATA,\n\tUXF_DIRECT_LOAD_COMPLETE,\n\tUXF_USER_NAV_LOAD_COMPLETE,\n];\n\nexport const UXF_METADATA_EVENTS = ['EXPERIENCE_START', 'USER_NAVIGATE'];\nexport const ANALYTICS_SET_APPLICATION_OPTIONS =\n\t'analyticsSetApplicationOptions';\n","import { ALLOWED_PERF_EVENTS, UXF_METADATA_EVENTS } from '../constants';\n\nexport default function addEvent(markReceived, sdk) {\n\tconst {\n\t\tattributes: { options = {}, event },\n\t} = markReceived;\n\t// performance trace are handled in uxf and again are dependent on custom marks, hence still this needs to be kept\n\tif (markReceived.attributes?.__type__ === 'addPerformanceTrace') {\n\t\t// service portal addPerformanceTrace\n\t\tdelete markReceived.attributes.__type__;\n\t\tsdk.addPerformanceTrace(...markReceived.attributes.arguments);\n\t} else if (markReceived.attributes?.__type__ === 'addEvent') {\n\t\t// service portal addEvent\n\t\tdelete markReceived.attributes.__type__;\n\t\tsdk.addEvent(...markReceived.attributes.arguments);\n\t} else if (markReceived.attributes?.__type__ === 'addChatEvent') {\n\t\t// service portal addEvent\n\t\tdelete markReceived.attributes.__type__;\n\t\tsdk.addChatEvent(...markReceived.attributes.arguments);\n\t} else {\n\t\t// logic to remove some of the perf events added directly from uxf\n\t\t// this code should ideally be in uxf, but now currently is handled here\n\t\t// perf and uxf metadata events are handled in ux-metrics, hence no need of ingestion\n\t\tif (\n\t\t\tALLOWED_PERF_EVENTS.includes(event) ||\n\t\t\tUXF_METADATA_EVENTS.includes(event)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tsdk.addEvent(event, options);\n\t}\n}\n","export function isMobileBridgeAvailable() {\n\treturn (\n\t\ttypeof window !== 'undefined' &&\n\t\twindow.SNMobileAnalytics &&\n\t\ttypeof window.SNMobileAnalytics === 'object'\n\t);\n}\n\nexport function isMobileBridgeEnabled() {\n\tif (!isMobileBridgeAvailable()) {\n\t\treturn false;\n\t}\n\n\tconst _config = window.SNMobileAnalytics.getNativeConfig();\n\tconst config = typeof _config === 'string' ? JSON.parse(_config) : _config;\n\t// channel number as per current currently decided contract, might change in the future\n\treturn config && config.channel == '6';\n}\n\nexport function getMobileBridgeConfig() {\n\tif (!isMobileBridgeAvailable()) {\n\t\treturn null;\n\t}\n\treturn window.SNMobileAnalytics.getNativeConfig();\n}\n\nexport const MobileBridgeAdapter = {\n\taddEvent(eventName, properties, type) {\n\t\tif (!isMobileBridgeAvailable()) {\n\t\t\tconsole.warn('Mobile bridge is not available');\n\t\t}\n\t\twindow.SNMobileAnalytics.addEvent(\n\t\t\teventName,\n\t\t\tJSON.stringify(properties || {}),\n\t\t\ttype || null\n\t\t);\n\t},\n\n\tsetUserId(userId) {\n\t\tif (!isMobileBridgeAvailable()) {\n\t\t\tconsole.warn('Mobile bridge is not available');\n\t\t}\n\t\twindow.SNMobileAnalytics.setUserId(userId);\n\t},\n\n\tstartScreen(screenName) {\n\t\tif (!isMobileBridgeAvailable()) {\n\t\t\tconsole.warn('Mobile bridge is not available');\n\t\t}\n\t\twindow.SNMobileAnalytics.startScreen(screenName);\n\t},\n\n\taddPerformanceTrace() {\n\t\t// no-op\n\t},\n\n\tgetConfig() {\n\t\treturn getMobileBridgeConfig();\n\t},\n\n\tisAvailable() {\n\t\treturn isMobileBridgeAvailable();\n\t},\n\n\tisEnabled() {\n\t\treturn isMobileBridgeEnabled();\n\t},\n};\n","import { onEvent } from '@servicenow/ui-analytics-api';\nimport SNAnalytics from './sdk';\nimport { get as getConfigValue, set as setConfigValue } from '../config';\nimport addEvent from './addEvent';\nimport {\n\tTRACKING_CONSENT,\n\tANALYTICS_SET_APPLICATION_OPTIONS,\n\tNEXT_EXPERIENCE_CHANNEL_ID,\n\tUNIFIED_NAVIGATION_APP,\n} from '../constants';\nimport {\n\tisMobileBridgeEnabled,\n\tMobileBridgeAdapter,\n} from './mobileBridgeAdapter';\n\nlet unsubscribe = () => null;\nlet isRolesUpdated = false;\n\nexport default function higherOrderSDKWrapper(fn, type) {\n\tswitch (type) {\n\t\tcase 'application': {\n\t\t\treturn async (name, version = 0, attributes = {}) => {\n\t\t\t\tif (isMobileBridgeEnabled()) {\n\t\t\t\t\tsetConfigValue('mobileBridgeMode', true);\n\t\t\t\t\tsetConfigValue('legacy', true);\n\t\t\t\t\tsetConfigValue('enableTrack', true);\n\t\t\t\t\tsetConfigValue('enableCollection', true);\n\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tunsubscribe = onEvent((event) => {\n\t\t\t\t\t\tif (event.type === 'usage') {\n\t\t\t\t\t\t\taddEvent(event, MobileBridgeAdapter);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\treturn fn(name, version, attributes);\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tattributes?.channelType === 'NextExperience' &&\n\t\t\t\t\t(attributes?.experienceId === '' ||\n\t\t\t\t\t\tattributes?.experienceName === '')\n\t\t\t\t) {\n\t\t\t\t\tattributes.experienceId = NEXT_EXPERIENCE_CHANNEL_ID;\n\t\t\t\t\tattributes.experienceName = UNIFIED_NAVIGATION_APP;\n\t\t\t\t}\n\t\t\t\tif (attributes.__isLegacy__) {\n\t\t\t\t\tsetConfigValue('legacy', true);\n\t\t\t\t\tsetConfigValue('enableTrack', true);\n\t\t\t\t\tsetConfigValue('enableCollection', true);\n\n\t\t\t\t\tif (!isMobileBridgeEnabled()) {\n\t\t\t\t\t\tSNAnalytics.start(...attributes.arguments);\n\t\t\t\t\t}\n\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tconst eventTarget = isMobileBridgeEnabled()\n\t\t\t\t\t\t? MobileBridgeAdapter\n\t\t\t\t\t\t: SNAnalytics;\n\t\t\t\t\tunsubscribe = onEvent((event) => {\n\t\t\t\t\t\tif (event.type === 'usage') {\n\t\t\t\t\t\t\taddEvent(event, eventTarget);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tif (attributes.experienceId) {\n\t\t\t\t\t\tif (attributes.experienceId === 'ui-builder')\n\t\t\t\t\t\t\treturn fn(name, version, attributes);\n\t\t\t\t\t\t// Next Experience, UX Metrics, CoreUI, Studio\n\t\t\t\t\t\t// Check if the experience ID has been registered\n\t\t\t\t\t\t//const registeredName = appRegistrationCache[attributes.experienceId];\n\t\t\t\t\t\tconst appRegistrationMetadataStorage =\n\t\t\t\t\t\t\tgetAppRegistrationMetadataFromSessionStorage();\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tappRegistrationMetadataStorage[\n\t\t\t\t\t\t\t\tattributes.experienceId\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// Check if the received name is different from the registered name\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tappRegistrationMetadataStorage[\n\t\t\t\t\t\t\t\t\tattributes.experienceId\n\t\t\t\t\t\t\t\t].name !== attributes.experienceName\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t//registerApplication(attributes);\n\t\t\t\t\t\t\t\tappRegistrationMetadataStorage[\n\t\t\t\t\t\t\t\t\tattributes.experienceId\n\t\t\t\t\t\t\t\t] = {\n\t\t\t\t\t\t\t\t\tname: attributes.experienceName,\n\t\t\t\t\t\t\t\t\tchannelType: attributes.channelType,\n\t\t\t\t\t\t\t\t\ttableName: attributes.tableName,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tstoreAppRegistrationMetadataInSessionStorage(\n\t\t\t\t\t\t\t\t\tappRegistrationMetadataStorage\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Experience ID is not registered, proceed to register\n\t\t\t\t\t\t\t// appRegistrationCache[attributes.experienceId] = attributes.experienceName;\n\t\t\t\t\t\t\t// registerApplication(attributes);\n\t\t\t\t\t\t\tappRegistrationMetadataStorage[\n\t\t\t\t\t\t\t\tattributes.experienceId\n\t\t\t\t\t\t\t] = {\n\t\t\t\t\t\t\t\tname: attributes.experienceName,\n\t\t\t\t\t\t\t\tchannelType: attributes.channelType,\n\t\t\t\t\t\t\t\ttableName: attributes.tableName,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tstoreAppRegistrationMetadataInSessionStorage(\n\t\t\t\t\t\t\t\tappRegistrationMetadataStorage\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tsetConfigValue('legacy', true);\n\t\t\t\t\tsetConfigValue('enableTrack', true);\n\t\t\t\t\tsetConfigValue('enableCollection', true);\n\n\t\t\t\t\tlet legacyConfig = prepareAndGetLegacyConfig(attributes);\n\n\t\t\t\t\tif (legacyConfig && Object.keys(legacyConfig).length > 0) {\n\t\t\t\t\t\t// If the user has been presented with consent dialogue, we should hold the events\n\t\t\t\t\t\t// until the user provides the consent.\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tlegacyConfig.sessionConfig?.trackingConsent !=\n\t\t\t\t\t\t\t\tTRACKING_CONSENT.missing &&\n\t\t\t\t\t\t\t(attributes?.experienceId ||\n\t\t\t\t\t\t\t\tisWebChannelApplication(legacyConfig))\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst instanceDomainName =\n\t\t\t\t\t\t\t\tattributes?.instanceDomainName\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\tinstanceDomainName:\n\t\t\t\t\t\t\t\t\t\t\t\tattributes.instanceDomainName,\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: {};\n\t\t\t\t\t\t\tif (!isMobileBridgeEnabled()) {\n\t\t\t\t\t\t\t\tSNAnalytics.start(\n\t\t\t\t\t\t\t\t\tlegacyConfig.apiKey,\n\t\t\t\t\t\t\t\t\tlegacyConfig.apiAuth,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t...legacyConfig.sessionConfig,\n\t\t\t\t\t\t\t\t\t\t...instanceDomainName,\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!isRolesUpdated) {\n\t\t\t\t\t\t\t\tconst rolesList =\n\t\t\t\t\t\t\t\t\tlegacyConfig.sessionConfig.roles?.split(\n\t\t\t\t\t\t\t\t\t\t','\n\t\t\t\t\t\t\t\t\t) || [];\n\t\t\t\t\t\t\t\tisRolesUpdated = true;\n\t\t\t\t\t\t\t\tSNAnalytics.setUserProperty('roles', rolesList);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlet options = {\n\t\t\t\t\t\t\t\tchannelType: attributes.channelType,\n\t\t\t\t\t\t\t\ttableName: attributes.tableName,\n\t\t\t\t\t\t\t\texperienceName: attributes.experienceName,\n\t\t\t\t\t\t\t\texperienceId: attributes.experienceId,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tsessionStorage.setItem(\n\t\t\t\t\t\t\t\tANALYTICS_SET_APPLICATION_OPTIONS,\n\t\t\t\t\t\t\t\tJSON.stringify(options)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tunsubscribe();\n\t\t\t\t\t\tconst eventTarget = isMobileBridgeEnabled()\n\t\t\t\t\t\t\t? MobileBridgeAdapter\n\t\t\t\t\t\t\t: SNAnalytics;\n\t\t\t\t\t\tunsubscribe = onEvent((event) => {\n\t\t\t\t\t\t\tif (event.type === 'usage') {\n\t\t\t\t\t\t\t\taddEvent(event, eventTarget);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn fn(name, version, attributes);\n\t\t\t};\n\t\t}\n\t\tcase 'page':\n\t\t\treturn async (id, attributes = {}) => {\n\t\t\t\tconst isLegacy = getConfigValue('legacy');\n\n\t\t\t\tif (isLegacy) {\n\t\t\t\t\tif (isMobileBridgeEnabled()) {\n\t\t\t\t\t\tconst screenName = attributes.arguments\n\t\t\t\t\t\t\t? attributes.arguments[0]\n\t\t\t\t\t\t\t: attributes.name;\n\t\t\t\t\t\tMobileBridgeAdapter.startScreen(screenName);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (attributes.arguments) {\n\t\t\t\t\t\t\tSNAnalytics.startPage(...attributes.arguments);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tSNAnalytics.startPage(\n\t\t\t\t\t\t\t\tattributes.name,\n\t\t\t\t\t\t\t\tattributes.title || attributes.name\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (isMobileBridgeEnabled()) {\n\t\t\t\t\t\tconst screenName = attributes.arguments\n\t\t\t\t\t\t\t? attributes.arguments[0]\n\t\t\t\t\t\t\t: attributes.name;\n\t\t\t\t\t\tMobileBridgeAdapter.startScreen(screenName);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn fn(id, attributes);\n\t\t\t};\n\t\tcase 'user':\n\t\t\treturn async (id, attributes = {}) => {\n\t\t\t\tconst isLegacy = getConfigValue('legacy');\n\n\t\t\t\tif (isLegacy) {\n\t\t\t\t\tconst operation = attributes.__operation__;\n\t\t\t\t\tdelete attributes.__operation__;\n\n\t\t\t\t\tif (isMobileBridgeEnabled()) {\n\t\t\t\t\t\tif (operation === 'setUserId') {\n\t\t\t\t\t\t\tMobileBridgeAdapter.setUserId(\n\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tswitch (operation) {\n\t\t\t\t\t\t\tcase 'setUserId':\n\t\t\t\t\t\t\t\tSNAnalytics.setUserId(...attributes.arguments);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'setUserProperty':\n\t\t\t\t\t\t\t\tSNAnalytics.setUserProperty(\n\t\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'removeUserProperty':\n\t\t\t\t\t\t\t\tSNAnalytics.removeUserProperty(\n\t\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'setUserProperties':\n\t\t\t\t\t\t\t\tSNAnalytics.setUserProperties(\n\t\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'appendToUserProperty':\n\t\t\t\t\t\t\t\tSNAnalytics.appendToUserProperty(\n\t\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'incUserProperty':\n\t\t\t\t\t\t\t\tSNAnalytics.incUserProperty(\n\t\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'setTrackingConsent':\n\t\t\t\t\t\t\t\tSNAnalytics.setTrackingConsent(\n\t\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn fn(id, attributes);\n\t\t\t};\n\t\tcase 'utility':\n\t\t\treturn async (id, attributes = {}) => {\n\t\t\t\tswitch (id) {\n\t\t\t\t\tcase 'setDebugLevel':\n\t\t\t\t\t\t// __TECTONIC__$servicenow_ui_analytics_integrator.setConfigValue('setDebugLevel', 'info');\n\t\t\t\t\t\tSNAnalytics.setDebugLevel(attributes);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'deleteCurrentUserData':\n\t\t\t\t\t\t// __TECTONIC__$servicenow_ui_analytics_integrator.setConfigValue('deleteCurrentUserData', '');\n\t\t\t\t\t\tSNAnalytics.deleteCurrentUserData();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'legacyConfig':\n\t\t\t\t\t\t// __TECTONIC__$servicenow_ui_analytics_integrator.setConfigValue('legacyConfig', {}});\n\t\t\t\t\t\tsetConfigValue(id, attributes);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// Handle other cases if needed (for debugging/logging purposes)\n\t\t\t\t\t\tconsole.log('Unknown setConfigValue id: ' + id);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\treturn fn(id, attributes);\n\t\t\t};\n\t}\n}\n\n// Function to retrieve the Applications object from sessionStorage\nfunction getAppRegistrationMetadataFromSessionStorage() {\n\ttry {\n\t\tconst storedData = sessionStorage.getItem('AppRegistrationMetadata');\n\t\treturn storedData ? JSON.parse(storedData) : {}; // Return parsed object or an empty object if not found\n\t} catch (error) {\n\t\tconsole.warn('[Analytics] Failed to retrieve app registration metadata from sessionStorage:', error);\n\t\treturn {}; // Return empty object if sessionStorage is unavailable or cleared\n\t}\n}\n\n// Function to store the Applications object in sessionStorage\nfunction storeAppRegistrationMetadataInSessionStorage(applications) {\n\tsessionStorage.setItem(\n\t\t'AppRegistrationMetadata',\n\t\tJSON.stringify(applications)\n\t);\n}\n\nfunction prepareAndGetLegacyConfig(attributes) {\n\ttry {\n\t\tconst legacyConfigData = sessionStorage.getItem('legacyConfig');\n\t\tif (!legacyConfigData) {\n\t\t\treturn {};\n\t\t}\n\n\t\tlet uxMetricsConfig = JSON.parse(legacyConfigData);\n\t\tif (uxMetricsConfig && Object.keys(uxMetricsConfig).length !== 0) {\n\t\t\tlet legacyConfig = {\n\t\t\t\tapiAuth: uxMetricsConfig.apiAuth,\n\t\t\t\tapiKey: uxMetricsConfig.apiKey,\n\t\t\t\tuxCollectionMode: uxMetricsConfig.uxCollectionMode\n\t\t\t\t\t? uxMetricsConfig.uxCollectionMode\n\t\t\t\t\t: 'Both',\n\t\t\t\tchannelType: uxMetricsConfig.channelType,\n\t\t\t\tsessionConfig: {\n\t\t\t\t\tserverEndpoint: uxMetricsConfig.endpointURL,\n\t\t\t\t\ttrackingConsent: uxMetricsConfig.trackingConsent,\n\t\t\t\t\tuserId: uxMetricsConfig.user?.hashId,\n\t\t\t\t\tdomainId: uxMetricsConfig.user?.domainId,\n\t\t\t\t\tdomainName: uxMetricsConfig.user?.domainName,\n\t\t\t\t\troles: uxMetricsConfig.user?.roles,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tlegacyConfig.sessionConfig.appContextId = attributes.experienceId;\n\t\t\tlegacyConfig.sessionConfig.appContextName = attributes.experienceName;\n\t\t\treturn legacyConfig;\n\t\t} else {\n\t\t\treturn {};\n\t\t}\n\t} catch (error) {\n\t\tconsole.warn('[Analytics] Failed to retrieve or parse legacy config from sessionStorage:', error);\n\t\treturn {}; // Return empty config if sessionStorage is unavailable or data is corrupted\n\t}\n}\nfunction isWebChannelApplication(legacyConfig) {\n\treturn (\n\t\tlegacyConfig?.channelType === 'web' ||\n\t\tlegacyConfig?.channelType == 'CoreUI'\n\t);\n}\n","import { get as getConfigValue } from '../config';\n\nexport default async function send(events) {\n\tif (!getConfigValue('enableCollection')) return;\n\n\tconst url = getConfigValue('collecterUrl') || 'api/now/trace';\n\n\ttry {\n\t\tawait fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(events),\n\t\t});\n\t} catch (e) {\n\t\tconsole.log(e);\n\t}\n}\n","import { get as getConfigValue } from './config';\nimport {\n\tonEvent,\n\tgetQueuedEvents,\n\tgetApplication,\n\tgetUser,\n} from '@servicenow/ui-analytics-api';\nimport send from './legacy/send';\n\nconst events = [];\nconst exporterInterval = getConfigValue('exporterInterval');\nconst applyMetadata = (events) => {\n\tconst user = getUser();\n\tconst application = getApplication();\n\tconst augmentPage = getConfigValue('augmentPage');\n\n\tfor (let i = 0; i < events.length; i++) {\n\t\tconst event = events[i];\n\t\tevent.user = user;\n\t\tevent.application = application;\n\t\tevent.page = augmentPage(event.page);\n\t}\n\n\treturn events;\n};\n\nexport default function startExporter() {\n\tsend(applyMetadata(getQueuedEvents()));\n\n\tonEvent((event) => events.push(event));\n\n\tsetInterval(async () => {\n\t\tif (events.length) {\n\t\t\tsend([...events]);\n\t\t\tevents.length = 0;\n\t\t}\n\t}, exporterInterval);\n}\n","import { track } from '@servicenow/ui-analytics-api';\n\nexport const SPECIAL_EVENTS = [\n\t'$PERF-DATA',\n\t'UXF_DIRECT_LOAD_COMPLETE',\n\t'UXF_USER_NAV_LOAD_COMPLETE',\n\t'EXPERIENCE_START',\n\t'USER_NAVIGATE',\n];\n\nconst markTypes = {\n\tall: 'all',\n\tusage: 'usage',\n\tperformance: 'performance',\n};\n\nexport const registerCoreHandler = () => {\n\tif (!window.__webAnalytics__GLIDE_UX_METRICS) {\n\t\twindow.addEventListener('GLIDE_UX_METRICS', (event) => {\n\t\t\tvar payload = event.detail;\n\t\t\tif (\n\t\t\t\t!(\n\t\t\t\t\tpayload?.config?.type == markTypes.performance ||\n\t\t\t\t\tpayload?.config?.type == markTypes.all ||\n\t\t\t\t\tSPECIAL_EVENTS.includes(payload.eventName)\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\ttrackWithArguments(payload.eventName, payload.data);\n\t\t\t}\n\t\t});\n\t\t// this is added to avoid multiple event listeners being added in the core ui umd/esm module\n\t\twindow.__webAnalytics__GLIDE_UX_METRICS = true;\n\t}\n};\n\nfunction trackWithArguments(eventName, eventProps) {\n\tlet trackOptions = {\n\t\tname: eventName,\n\t\tattributes: {\n\t\t\t__type__: 'addEvent',\n\t\t\targuments: arguments,\n\t\t},\n\t};\n\ttrack(trackOptions.name, trackOptions);\n}\n","import {\n\ttrace,\n\ttrack,\n\tcreateCounter,\n\tcreateGauge,\n\tcreateHistogram,\n\tsetUser as setUserNext,\n\tgetUser,\n\tsetPage as setPageNext,\n\tgetPage,\n\tsetConfigValue as setApiConfigValueNext,\n\tonEvent,\n\tcreateTraceParent,\n\tcreateTraceId,\n\tcreateTraceParentHeader,\n\tsetApplication as setApplicationNext,\n\tgetApplication,\n} from '@servicenow/ui-analytics-api';\n\nimport higherOrderSDKWrapper from './higherOrderSDKWrapper';\nimport { get as getConfigValue } from '../config';\nimport startExporter from '../startExporter';\nimport { registerCoreHandler } from './coreUIEventHandler';\n\nconst setUser = higherOrderSDKWrapper(setUserNext, 'user');\nconst setPage = higherOrderSDKWrapper(setPageNext, 'page');\nconst setApplication = higherOrderSDKWrapper(setApplicationNext, 'application');\nconst setApiConfigValue = higherOrderSDKWrapper(\n\tsetApiConfigValueNext,\n\t'utility'\n);\n\nregisterCoreHandler();\n\nexport {\n\ttrace,\n\ttrack,\n\tcreateCounter,\n\tcreateGauge,\n\tcreateHistogram,\n\tsetUser,\n\tgetUser,\n\tsetPage,\n\tgetPage,\n\tsetApiConfigValue as setConfigValue,\n\tgetConfigValue,\n\tonEvent,\n\tcreateTraceParent,\n\tcreateTraceId,\n\tstartExporter,\n\tcreateTraceParentHeader,\n\tsetApplication,\n\tgetApplication,\n};\n","import { URLMASKSTRING, PARAMS_SEPARATOR, SUB_SEPARATOR } from '../constants';\n\nfunction mask(url, value) {\n\treturn url.replace(value, URLMASKSTRING);\n}\n\n/*\n * Returning masked url and other params.\n * There are corner cases such as duplicates, decoded uri params values.\n * Finding out each params values at correct position in url and masking it is the tricky part.\n */\n\nfunction handleParams(url, params, parentPrefix) {\n\tconst paramsPrefix = parentPrefix ? `${parentPrefix}param_` : 'param_';\n\tconst urlParams = {};\n\tlet maskedUrl = url;\n\tfor (const k in params) {\n\t\turlParams[paramsPrefix + k] = params[k];\n\t\tconst paramValue = params[k]?.toString();\n\t\t//checking empty and decoded values present in params object, added test case also.\n\t\tconst encodeUrlPart =\n\t\t\tparamValue &&\n\t\t\t(url.includes(paramValue)\n\t\t\t\t? paramValue\n\t\t\t\t: encodeURIComponent(paramValue));\n\t\tif (encodeUrlPart) maskedUrl = mask(maskedUrl, encodeUrlPart);\n\t}\n\treturn {\n\t\turl: maskedUrl,\n\t\tparams: urlParams,\n\t};\n}\n\n/*\n * Returning masked url and other fields present in both parent and child.\n * Masking sys id with *** if present in the url.\n */\n\nfunction handleFields(url, fields, parentPrefix) {\n\tconst checkSysId = /^[a-z0-9]+$/i;\n\tconst urlFields = {};\n\tlet maskedUrl = url;\n\tfor (const k in fields) {\n\t\turlFields[parentPrefix + k] = fields[k];\n\t\tif (fields[k].length === 32 && checkSysId.test(fields[k]))\n\t\t\tmaskedUrl = mask(maskedUrl, fields[k]);\n\t}\n\treturn {\n\t\turl: maskedUrl,\n\t\tfields: urlFields,\n\t};\n}\n\nfunction getProcessedSelectedContentData(url, obj, prefix) {\n\tlet allParams = {};\n\tlet maskedUrl = '';\n\tif (obj) {\n\t\t//spliting url by using `/params/` as separator\n\t\tconst urlParts = url?.split(PARAMS_SEPARATOR);\n\t\t//This might be the context path or fields url.\n\t\tconst fieldsObject = handleFields(urlParts?.[0], obj.fields, prefix);\n\t\tmaskedUrl = fieldsObject.url;\n\t\tallParams = { ...fieldsObject.fields };\n\t\tif (obj.params && urlParts.length > 1) {\n\t\t\tconst paramsObject = handleParams(urlParts[1], obj.params, prefix);\n\t\t\tmaskedUrl = `${maskedUrl}${PARAMS_SEPARATOR}${paramsObject.url}`;\n\t\t\tallParams = { ...allParams, ...paramsObject.params };\n\t\t}\n\t\tif (obj._timestamp) maskedUrl = mask(maskedUrl, obj._timestamp);\n\t} else maskedUrl = url;\n\treturn {\n\t\tmaskedUrl,\n\t\tallUrlParams: allParams,\n\t};\n}\n\nexport function getReconstructedUrlAndParams(metaUrl, selectedContent) {\n\tlet finalUrl = '';\n\tlet allParams = '';\n\t//spliting url by using `/sub/` as separator\n\tconst subParts = metaUrl?.split(SUB_SEPARATOR);\n\tif (subParts?.length > 1) {\n\t\tconst parentData = getProcessedSelectedContentData(\n\t\t\tsubParts[0],\n\t\t\tselectedContent.parent,\n\t\t\t'parent_'\n\t\t);\n\t\tconst childData = getProcessedSelectedContentData(\n\t\t\tsubParts[1],\n\t\t\tselectedContent,\n\t\t\t''\n\t\t);\n\t\tfinalUrl = `${parentData.maskedUrl}${SUB_SEPARATOR}${childData.maskedUrl}`;\n\t\tfor (let i = 2; i <= subParts.length - 1; i++)\n\t\t\tfinalUrl = `${finalUrl}${SUB_SEPARATOR}${subParts[i]}`;\n\t\tallParams = { ...parentData.allUrlParams, ...childData.allUrlParams };\n\t} else {\n\t\tconst childData = getProcessedSelectedContentData(\n\t\t\tsubParts?.[0],\n\t\t\tselectedContent,\n\t\t\t''\n\t\t);\n\t\tfinalUrl = childData.maskedUrl;\n\t\tallParams = { ...childData.allUrlParams };\n\t}\n\treturn {\n\t\turl: finalUrl,\n\t\tworkspaceParams: allParams,\n\t};\n}\n","const RECORD = 'record';\nconst SUB = 'sub';\nconst CLASSIC = 'classic';\n\nexport function isClassicUrl(selectedContent) {\n\treturn (\n\t\tselectedContent.route === CLASSIC ||\n\t\tselectedContent.isSeismicApp === false\n\t);\n}\n\nexport function getWorkspacePageName(url, selectedContent) {\n\tconst { route, fields, parent } = selectedContent ?? {};\n\tconst table = fields?.table;\n\tconst parentRoute = parent?.route;\n\tlet pageName;\n\tif (route || parentRoute) {\n\t\tif (route === RECORD) {\n\t\t\tif (!url) pageName = null;\n\t\t\telse if (url.includes('/sub/record/'))\n\t\t\t\tpageName = `${SUB}-${RECORD}-${table}`;\n\t\t\telse pageName = `${RECORD}-${table}`;\n\t\t} else\n\t\t\tpageName = `${parentRoute ? `${SUB}-` : ''}${route}${table ? `-${table}` : ''}`;\n\t}\n\treturn pageName;\n}\n\nfunction getClassicPageName(url) {\n\tconst decodedUrl = url ? decodeURIComponent(url) : null;\n\tconst patternMatch = decodedUrl && decodedUrl.match(/[$\\w\\-]+(?=.do[?]*)/g);\n\treturn (\n\t\tpatternMatch &&\n\t\t(patternMatch[0] === 'nav_to' ? patternMatch[1] : patternMatch[0])\n\t);\n}\n\nexport function getPageName({ url = '', selectedContent = {}, pageTitle }) {\n\tconst pageName = isClassicUrl(selectedContent)\n\t\t? getClassicPageName(url)\n\t\t: getWorkspacePageName(url, selectedContent);\n\treturn pageName || pageTitle;\n}\n","import { CLASSIC_URL_PARAMS } from '../constants';\nimport { getReconstructedUrlAndParams } from './selectContentParser';\nimport { isClassicUrl, getPageName, getWorkspacePageName } from './getPageName';\n\nfunction getClassicParamsAndUrl(url) {\n\tif (!url) return;\n\tconst decodedUrl = decodeURIComponent(url);\n\tconst urlParams = {};\n\tconst queryParams = decodedUrl.split('?');\n\tconst truncateUrl = url.startsWith('/nav_to.do')\n\t\t? url.split('%3F')\n\t\t: queryParams;\n\turlParams.url = truncateUrl[0];\n\tif (queryParams.length > 1) {\n\t\tconst parameters = new URLSearchParams(queryParams[1]);\n\t\tCLASSIC_URL_PARAMS.forEach((prop) => {\n\t\t\tconst value = parameters.get(prop);\n\t\t\tif (value) urlParams[prop] = value;\n\t\t});\n\t}\n\treturn urlParams;\n}\n\nfunction getWorkspaceParamsAndUrl(metaUrl, selectedContent) {\n\tconst { url, workspaceParams } = getReconstructedUrlAndParams(\n\t\tmetaUrl,\n\t\tselectedContent,\n\t\tfalse\n\t);\n\treturn { url, ...workspaceParams };\n}\n\nexport function getPageParamsAndUrl(meta = {}) {\n\tconst { url, selectedContent = {} } = meta;\n\tconst params = isClassicUrl(selectedContent)\n\t\t? getClassicParamsAndUrl(url)\n\t\t: getWorkspaceParamsAndUrl(url, selectedContent);\n\treturn params || [];\n}\n\nexport const getPageNameFromMeta = getPageName;\nexport default getWorkspacePageName;\n","import { TRACKING_CONSENT } from '../constants';\n\nlet configuration = JSON.parse(sessionStorage.getItem('legacyConfig'));\n\nfunction getConfig() {\n\treturn JSON.parse(sessionStorage.getItem('legacyConfig'));\n}\n\nfunction setConfig(config) {\n\tconfiguration = config;\n\t/* Convert comma separated string of allowedPropsInPageNavigate into array */\n\tconst { allowedPropsInPageNavigate = '' } = configuration;\n\tconfiguration.allowedPropsInPageNavigate =\n\t\tallowedPropsInPageNavigate.split(',');\n}\n\nfunction setConfigProperty(property, value) {\n\tgetConfig()[property] = value;\n}\n\nfunction getConfigProperty(property) {\n\treturn getConfig()[property];\n}\n\nfunction canStartSession() {\n\tconst channel = (getConfig()?.channelType || '').trim();\n\treturn (\n\t\tchannel !== 'NowExperience' &&\n\t\tchannel !== 'CoreUI' &&\n\t\tchannel !== 'NextExperience'\n\t);\n}\n\nfunction isConsentMissing() {\n\treturn getConfig()?.trackingConsent === TRACKING_CONSENT.missing;\n}\n\nfunction getAllowedPropsInPageNavigate() {\n\treturn getConfig() ? getConfig().allowedPropsInPageNavigate : '';\n}\n\nexport {\n\tgetConfig,\n\tsetConfig,\n\tsetConfigProperty,\n\tgetConfigProperty,\n\tcanStartSession,\n\tisConsentMissing,\n\tgetAllowedPropsInPageNavigate,\n};\n","import reduce from 'lodash/reduce';\nimport { EVENT_MAPPING, EXPERIENCE_START, USER_NAVIGATE } from './events';\nimport { getPageParamsAndUrl } from './utils';\nimport { getConfig, getAllowedPropsInPageNavigate } from './ux-config';\n\nfunction filterEventProps(eventProps, allowList) {\n\tif (Object.entries(getConfig()) > 0) {\n\t\treturn reduce(\n\t\t\tallowList,\n\t\t\t(acc, propName) => {\n\t\t\t\tacc[propName] = eventProps[propName];\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{}\n\t\t);\n\t} else {\n\t\teventProps;\n\t}\n}\n\nfunction isPrimitiveDataType(propVal) {\n\treturn (\n\t\ttypeof propVal === 'string' ||\n\t\ttypeof propVal === 'boolean' ||\n\t\t(typeof propVal === 'number' && !Number.isNaN(propVal))\n\t);\n}\n\n// appsee accepts string, number, boolean or Date\nfunction isValidType(propVal) {\n\t// is primitive or Date\n\treturn isPrimitiveDataType(propVal) || propVal instanceof Date;\n}\n\nfunction transformEventProps(eventProps) {\n\tObject.keys(eventProps).forEach((key) => {\n\t\t// stringify event prop value if not type supported by appsee\n\t\tif (eventProps[key] && !isValidType(eventProps[key]))\n\t\t\teventProps[key] = JSON.stringify(eventProps[key]);\n\t});\n}\n\nfunction isEntryPage(event, { switched } = {}) {\n\treturn event === EXPERIENCE_START && switched === false;\n}\n\n/*\n * excluding the meta(options), markTime, type properties from the props list\n * including the url, pageTitle from meta when the event is EXPERIENCE_START  or USER_NAVIGATE\n * which are sent to the appsee\n */\nexport function transform(mark) {\n\t/* eslint-disable no-unused-vars */\n\tconst {\n\t\tevent,\n\t\toptions: { meta, ...remainingOptions } = {},\n\t\tmarkTime,\n\t\tinteractionId,\n\t\tcomponentId,\n\t\tparentComponentId,\n\t\ttype,\n\t\tcomponentName,\n\t\t...otherProps\n\t} = mark;\n\tlet eventProps = { ...remainingOptions, ...otherProps };\n\tif (event === EXPERIENCE_START || event === USER_NAVIGATE) {\n\t\teventProps = {\n\t\t\t...eventProps,\n\t\t\t...getPageParamsAndUrl(meta),\n\t\t};\n\t\teventProps['Entry Page'] = isEntryPage(event, meta);\n\t\teventProps['Page Title'] = meta?.pageTitle;\n\t\tif (getConfig() && Object.entries(getConfig()) > 0) {\n\t\t\teventProps = filterEventProps(\n\t\t\t\teventProps,\n\t\t\t\tgetAllowedPropsInPageNavigate()\n\t\t\t);\n\t\t}\n\t}\n\ttransformEventProps(eventProps);\n\treturn {\n\t\teventName: EVENT_MAPPING[event] || event,\n\t\teventProps,\n\t};\n}\n","/* eslint-disable no-unused-vars */\nimport { transform } from './transformMarks';\nimport {\n\tEXPERIENCE_START,\n\tUSER_NAVIGATE,\n\tUXF_USER_NAV_LOAD_COMPLETE,\n} from './events';\nimport getWorkspacePageName, { getPageNameFromMeta } from './utils';\nimport { isAppRestricted } from './ux-config';\nimport { TRACKING_CONSENT, ALLOWED_PERF_EVENTS } from '../constants';\nimport { isEmpty } from 'lodash';\n\nlet pageUrl;\n\nexport default function addLegacyEvent(markReceived, legacySdk) {\n\t// these should be metrics or traces in the future\n\tif (markReceived.attributes?.__type__ === 'addPerformanceTrace') {\n\t\t// service portal addPerformanceTrace\n\t\tdelete markReceived.attributes.__type__;\n\t\tlegacySdk.addPerformanceTrace(...markReceived.attributes.arguments);\n\t} else if (markReceived.attributes?.__type__ === 'addEvent') {\n\t\t// service portal addEvent\n\t\tdelete markReceived.attributes.__type__;\n\t\tlegacySdk.addEvent(...markReceived.attributes.arguments);\n\t} else {\n\t\tconst allMarks = processMarks(markReceived);\n\t\tallMarks.forEach((mark = { options: {} }) => {\n\t\t\tif (mark.attributes.event === EXPERIENCE_START) {\n\t\t\t\tconst {\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\tapplicationContextId,\n\t\t\t\t\t\tapplicationContextName,\n\t\t\t\t\t\tswitched,\n\t\t\t\t\t} = {},\n\t\t\t\t} = mark.attributes.options;\n\t\t\t\tstartSession(\n\t\t\t\t\tlegacySdk,\n\t\t\t\t\tapplicationContextId,\n\t\t\t\t\tapplicationContextName\n\t\t\t\t);\n\t\t\t\tif (switched) return;\n\t\t\t}\n\t\t\tif (ALLOWED_PERF_EVENTS.includes(mark.attributes.event)) {\n\t\t\t\t// ux metrics performance events\n\t\t\t\t// Process performance marks\n\t\t\t\tconst {\n\t\t\t\t\toptions: {\n\t\t\t\t\t\tmetrics,\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\ttotalUiTime,\n\t\t\t\t\t\tscreenRoute: route,\n\t\t\t\t\t\tscreenFields: fields,\n\t\t\t\t\t\turl = '',\n\t\t\t\t\t\tscreenParent,\n\t\t\t\t\t} = {},\n\t\t\t\t\targuments: { name, value, properties, key: argumentKey },\n\t\t\t\t} = mark.attributes;\n\t\t\t\tif (totalUiTime) {\n\t\t\t\t\t// uxf; page loads only; will need to be modified to handle other metrics in the future\n\t\t\t\t\tconst navigationType =\n\t\t\t\t\t\tmark.attributes.event === UXF_USER_NAV_LOAD_COMPLETE\n\t\t\t\t\t\t\t? 'navigation'\n\t\t\t\t\t\t\t: 'page load';\n\t\t\t\t\tlegacySdk.addPerformanceTrace(\n\t\t\t\t\t\tgetWorkspacePageName(url, {\n\t\t\t\t\t\t\troute,\n\t\t\t\t\t\t\tfields,\n\t\t\t\t\t\t\tparent: screenParent,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t'Page Load Time',\n\t\t\t\t\t\tMath.round(totalUiTime),\n\t\t\t\t\t\t{ navigationType }\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (Array.isArray(metrics)) {\n\t\t\t\t\t// core ui\n\t\t\t\t\tmark.attributes.options.metrics.forEach((metric) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tmetric.name === 'Page Load Time' &&\n\t\t\t\t\t\t\t!metric.properties?.navigationType\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif (!metric.properties) metric.properties = {};\n\t\t\t\t\t\t\tmetric.properties.navigationType = 'page load';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlegacySdk.addPerformanceTrace(\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\tmetric.name,\n\t\t\t\t\t\t\tMath.round(metric.value),\n\t\t\t\t\t\t\tmetric.properties\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// ux metrics usage events\n\t\t\t\tconst { options = {}, event } = mark.attributes;\n\n\t\t\t\tif (isEmpty(event)) return;\n\n\t\t\t\tif (event === EXPERIENCE_START || event === USER_NAVIGATE) {\n\t\t\t\t\t// remove host from url\n\t\t\t\t\tif (options.meta?.url) {\n\t\t\t\t\t\toptions.meta.url = options.meta.url.replace(\n\t\t\t\t\t\t\twindow.location.origin,\n\t\t\t\t\t\t\t''\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (options.meta.url === pageUrl) return;\n\t\t\t\t\t}\n\t\t\t\t\tpageUrl = options.meta?.url;\n\t\t\t\t}\n\t\t\t\t// removed start page call from here.\n\t\t\t\tstartPage(event, options, legacySdk);\n\t\t\t\tconst { eventName, eventProps } = transform(mark.attributes);\n\t\t\t\tlegacySdk.addEvent(eventName, eventProps);\n\t\t\t}\n\t\t});\n\t}\n}\n\nfunction startSession(legacySdk, applicationContextId, applicationContextName) {\n\tlet uxMetricsConfig = JSON.parse(sessionStorage.getItem('legacyConfig'));\n\tif (uxMetricsConfig) {\n\t\tlet legacyConfig = {\n\t\t\tapiAuth: uxMetricsConfig.apiAuth,\n\t\t\tapiKey: uxMetricsConfig.apiKey,\n\t\t\tuxCollectionMode: uxMetricsConfig.uxCollectionMode\n\t\t\t\t? uxMetricsConfig.uxCollectionMode\n\t\t\t\t: 'Both',\n\t\t\tsessionConfig: {\n\t\t\t\tserverEndpoint: uxMetricsConfig.endpointURL,\n\t\t\t\ttrackingConsent: uxMetricsConfig.trackingConsent,\n\t\t\t\tuserId: uxMetricsConfig.user.hashId,\n\t\t\t\tdomainId: uxMetricsConfig.user.domainId,\n\t\t\t\tdomainName: uxMetricsConfig.user.domainName,\n\t\t\t\troles: uxMetricsConfig.user.roles,\n\t\t\t\tsaveAppContext: true,\n\t\t\t},\n\t\t};\n\n\t\tlegacyConfig.sessionConfig.appContextId = applicationContextId;\n\t\tlegacyConfig.sessionConfig.appContextName = applicationContextName;\n\t\tlegacySdk.start(\n\t\t\tlegacyConfig.uxCollectionMode,\n\t\t\tlegacyConfig.apiKey,\n\t\t\tlegacyConfig.apiAuth,\n\t\t\tlegacyConfig.sessionConfig\n\t\t);\n\t}\n}\n\nfunction startPage(event, options, legacySdk) {\n\tconst pageName = getPageName(event, options);\n\tpageName && legacySdk.startPage(pageName);\n}\n\nfunction getPageName(event, options) {\n\tconst { meta = {} } = options;\n\treturn USER_NAVIGATE === event || EXPERIENCE_START === event\n\t\t? getPageNameFromMeta(meta) || options.pageTitle\n\t\t: null;\n}\n\nfunction processMarks(marks) {\n\t// Convert marks to an array if it's not already an array\n\tif (!Array.isArray(marks)) {\n\t\tmarks = marks !== undefined && marks !== null ? [marks] : []; // Wrap in an array if not null/undefined\n\t}\n\treturn marks;\n}\n","import { get as getConfigValue, set as setConfigValue } from '../config';\nimport { onEvent } from '@servicenow/ui-analytics-api';\nimport addLegacyEvent from './addLegacyEvent';\n\nimport {\n\tTRACKING_CONSENT,\n\tANALYTICS_SET_APPLICATION_OPTIONS,\n} from '../constants';\n\nlet unsubscribe = () => null;\nlet isRolesUpdated = false;\nlet legacySdk = null;\n\nconst resolveLegacySdk = async () => {\n\tif (legacySdk) return;\n\tlegacySdk = (await import('@devsnc/library-appsee-web-sdk')).default;\n};\n\nexport default function higherOrderSDKWrapper(fn, type) {\n\tswitch (type) {\n\t\tcase 'application':\n\t\t\treturn async (name, version = 0, attributes = {}) => {\n\t\t\t\tawait resolveLegacySdk();\n\t\t\t\tif (attributes.__isLegacy__) {\n\t\t\t\t\t// Service Portal\n\t\t\t\t\tsetConfigValue('legacy', true);\n\t\t\t\t\tsetConfigValue('enableTrack', true);\n\t\t\t\t\tsetConfigValue('enableCollection', true);\n\n\t\t\t\t\tlet uxCollectionMode = '';\n\t\t\t\t\tif (attributes.uxCollectionMode)\n\t\t\t\t\t\tuxCollectionMode = attributes.uxCollectionMode;\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet enableNewWebSdk = attributes.enableNewWebSdk;\n\t\t\t\t\t\tif (enableNewWebSdk && enableNewWebSdk == true) {\n\t\t\t\t\t\t\tuxCollectionMode = 'Both';\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\tenableNewWebSdk &&\n\t\t\t\t\t\t\tenableNewWebSdk == false\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tuxCollectionMode = 'Legacy';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tuxCollectionMode = 'Both';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tattributes.uxCollectionMode = uxCollectionMode;\n\t\t\t\t\t}\n\n\t\t\t\t\t// conditional logic for service portal only.\n\t\t\t\t\tlegacySdk.start(\n\t\t\t\t\t\tattributes.uxCollectionMode,\n\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t);\n\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tunsubscribe = onEvent((event) => {\n\t\t\t\t\t\tif (event.type === 'usage') {\n\t\t\t\t\t\t\taddLegacyEvent(event, legacySdk);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tif (attributes.experienceId) {\n\t\t\t\t\t\t// Next Experience, UX Metrics, CoreUI, Studio\n\n\t\t\t\t\t\t// Check if the experience ID has been registered\n\t\t\t\t\t\t//const registeredName = appRegistrationCache[attributes.experienceId];\n\t\t\t\t\t\tconst appRegistrationMetadataStorage =\n\t\t\t\t\t\t\tgetAppRegistrationMetadataFromSessionStorage();\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tappRegistrationMetadataStorage[\n\t\t\t\t\t\t\t\tattributes.experienceId\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// Check if the received name is different from the registered name\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tappRegistrationMetadataStorage[\n\t\t\t\t\t\t\t\t\tattributes.experienceId\n\t\t\t\t\t\t\t\t].name !== attributes.experienceName\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t//registerApplication(attributes);\n\t\t\t\t\t\t\t\tappRegistrationMetadataStorage[\n\t\t\t\t\t\t\t\t\tattributes.experienceId\n\t\t\t\t\t\t\t\t] = {\n\t\t\t\t\t\t\t\t\tname: attributes.experienceName,\n\t\t\t\t\t\t\t\t\tchannelType: attributes.channelType,\n\t\t\t\t\t\t\t\t\ttableName: attributes.tableName,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tstoreAppRegistrationMetadataInSessionStorage(\n\t\t\t\t\t\t\t\t\tappRegistrationMetadataStorage\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Experience ID is not registered, proceed to register\n\t\t\t\t\t\t\t// appRegistrationCache[attributes.experienceId] = attributes.experienceName;\n\t\t\t\t\t\t\t// registerApplication(attributes);\n\t\t\t\t\t\t\tappRegistrationMetadataStorage[\n\t\t\t\t\t\t\t\tattributes.experienceId\n\t\t\t\t\t\t\t] = {\n\t\t\t\t\t\t\t\tname: attributes.experienceName,\n\t\t\t\t\t\t\t\tchannelType: attributes.channelType,\n\t\t\t\t\t\t\t\ttableName: attributes.tableName,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tstoreAppRegistrationMetadataInSessionStorage(\n\t\t\t\t\t\t\t\tappRegistrationMetadataStorage\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tsetConfigValue('legacy', true);\n\t\t\t\t\tsetConfigValue('enableTrack', true);\n\t\t\t\t\tsetConfigValue('enableCollection', true);\n\n\t\t\t\t\tlet legacyConfig = prepareAndGetLegacyConfig(attributes);\n\n\t\t\t\t\tif (legacyConfig && legacyConfig.uxCollectionMode) {\n\t\t\t\t\t\t// If the user has been presented with consent dialogue, we should hold the events\n\t\t\t\t\t\t// until the user provides the consent.\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tlegacyConfig.sessionConfig.trackingConsent !=\n\t\t\t\t\t\t\t\tTRACKING_CONSENT.missing &&\n\t\t\t\t\t\t\t(attributes.experienceId ||\n\t\t\t\t\t\t\t\tisWebChannelApplication(legacyConfig))\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst instanceDomainName =\n\t\t\t\t\t\t\t\tattributes?.instanceDomainName\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\tinstanceDomainName:\n\t\t\t\t\t\t\t\t\t\t\t\tattributes.instanceDomainName,\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: {};\n\n\t\t\t\t\t\t\tlegacySdk.start(\n\t\t\t\t\t\t\t\tlegacyConfig.uxCollectionMode,\n\t\t\t\t\t\t\t\tlegacyConfig.apiKey,\n\t\t\t\t\t\t\t\tlegacyConfig.apiAuth,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...legacyConfig.sessionConfig,\n\t\t\t\t\t\t\t\t\t...instanceDomainName,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (!isRolesUpdated) {\n\t\t\t\t\t\t\t\tconst rolesList =\n\t\t\t\t\t\t\t\t\tlegacyConfig.sessionConfig.roles?.split(\n\t\t\t\t\t\t\t\t\t\t','\n\t\t\t\t\t\t\t\t\t) || [];\n\t\t\t\t\t\t\t\tisRolesUpdated = true;\n\t\t\t\t\t\t\t\tlegacySdk.setUserProperty('roles', rolesList);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlet options = {\n\t\t\t\t\t\t\t\tchannelType: attributes.channelType,\n\t\t\t\t\t\t\t\ttableName: attributes.tableName,\n\t\t\t\t\t\t\t\texperienceName: attributes.experienceName,\n\t\t\t\t\t\t\t\texperienceId: attributes.experienceId,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tsessionStorage.setItem(\n\t\t\t\t\t\t\t\tANALYTICS_SET_APPLICATION_OPTIONS,\n\t\t\t\t\t\t\t\tJSON.stringify(options)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tunsubscribe();\n\t\t\t\t\t\tunsubscribe = onEvent((event) => {\n\t\t\t\t\t\t\tif (event.type === 'usage') {\n\t\t\t\t\t\t\t\taddLegacyEvent(event, legacySdk);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn fn(name, version, attributes);\n\t\t\t};\n\t\tcase 'page':\n\t\t\treturn async (id, attributes = {}) => {\n\t\t\t\tawait resolveLegacySdk();\n\n\t\t\t\tconst isLegacy = getConfigValue('legacy');\n\n\t\t\t\tif (isLegacy) {\n\t\t\t\t\t// setPage(id, {description});\n\t\t\t\t\tif (attributes.arguments)\n\t\t\t\t\t\tlegacySdk.startPage(...attributes.arguments); // service portal\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Already handled in addLegacyEvent for ux metrics,\n\t\t\t\t\t\t// Since the arguments were not as per the expected structure\n\t\t\t\t\t\t// Therefore UX metrics logic and mark object is used for setting the page.\n\t\t\t\t\t\tlegacySdk.startPage(attributes.name); // ux metrics\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn fn(id, attributes);\n\t\t\t};\n\t\tcase 'user':\n\t\t\treturn async (id, attributes = {}) => {\n\t\t\t\tawait resolveLegacySdk();\n\n\t\t\t\tconst isLegacy = getConfigValue('legacy');\n\n\t\t\t\tif (isLegacy) {\n\t\t\t\t\tconst operation = attributes.__operation__;\n\t\t\t\t\tdelete attributes.__operation__;\n\n\t\t\t\t\tswitch (operation) {\n\t\t\t\t\t\tcase 'setUserId':\n\t\t\t\t\t\t\t// setUser(id, {__operation__: 'setUserId'});\n\t\t\t\t\t\t\tlegacySdk.setUserId(...attributes.arguments);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'setUserProperty':\n\t\t\t\t\t\t\t// setUser(id, {__operation__: 'setUserProperty', someKey: someValue});\n\t\t\t\t\t\t\tlegacySdk.setUserProperty(...attributes.arguments);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'removeUserProperty':\n\t\t\t\t\t\t\t// setUser(id, {__operation__: 'removeUserProperty', someKey: undefined});\n\t\t\t\t\t\t\tlegacySdk.removeUserProperty(\n\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'setUserProperties':\n\t\t\t\t\t\t\t// setUser(id, {__operation__: 'removeUserProperty', someKey: someValue, anotherKey: anotherValue});\n\t\t\t\t\t\t\tlegacySdk.setUserProperties(\n\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'appendToUserProperty':\n\t\t\t\t\t\t\t// setUser(id, {__operation__: 'appendToUserProperty', someKey: someValue});\n\t\t\t\t\t\t\tlegacySdk.appendToUserProperty(\n\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'incUserProperty':\n\t\t\t\t\t\t\t// setUser(id, {__operation__: 'incUserProperty', args: arguments});\n\t\t\t\t\t\t\tlegacySdk.incUserProperty(...attributes.arguments);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'setTrackingConsent':\n\t\t\t\t\t\t\t// setUser(id, {__operation__: 'setTrackingConsent', args: arguments});\n\t\t\t\t\t\t\tlegacySdk.setTrackingConsent(\n\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn fn(id, attributes);\n\t\t\t};\n\n\t\tcase 'utility':\n\t\t\treturn async (id, attributes = {}) => {\n\t\t\t\tawait resolveLegacySdk();\n\t\t\t\tswitch (id) {\n\t\t\t\t\tcase 'setDebugLevel':\n\t\t\t\t\t\t// __TECTONIC__$servicenow_ui_analytics_integrator.setConfigValue('setDebugLevel', 'info');\n\t\t\t\t\t\tlegacySdk.setDebugLevel(attributes);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'deleteCurrentUserData':\n\t\t\t\t\t\t// __TECTONIC__$servicenow_ui_analytics_integrator.setConfigValue('deleteCurrentUserData', '');\n\t\t\t\t\t\tlegacySdk.deleteCurrentUserData();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'legacyConfig':\n\t\t\t\t\t\t// __TECTONIC__$servicenow_ui_analytics_integrator.setConfigValue('legacyConfig', {}});\n\t\t\t\t\t\tsetConfigValue(id, attributes);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// Handle other cases if needed (for debugging/logging purposes)\n\t\t\t\t\t\tconsole.log('Unknown setConfigValue id: ' + id);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\treturn fn(id, attributes);\n\t\t\t};\n\t}\n\n\t// Function to retrieve the Applications object from sessionStorage\n\tfunction getAppRegistrationMetadataFromSessionStorage() {\n\t\tconst storedData = sessionStorage.getItem('AppRegistrationMetadata');\n\t\treturn storedData ? JSON.parse(storedData) : {}; // Return parsed object or an empty object if not found\n\t}\n\n\t// Function to store the Applications object in sessionStorage\n\tfunction storeAppRegistrationMetadataInSessionStorage(applications) {\n\t\tsessionStorage.setItem(\n\t\t\t'AppRegistrationMetadata',\n\t\t\tJSON.stringify(applications)\n\t\t);\n\t}\n\n\tfunction prepareAndGetLegacyConfig(attributes) {\n\t\tlet uxMetricsConfig = JSON.parse(\n\t\t\tsessionStorage.getItem('legacyConfig')\n\t\t);\n\t\tif (uxMetricsConfig && Object.keys(uxMetricsConfig).length !== 0) {\n\t\t\tlet legacyConfig = {\n\t\t\t\tapiAuth: uxMetricsConfig.apiAuth,\n\t\t\t\tapiKey: uxMetricsConfig.apiKey,\n\t\t\t\tuxCollectionMode: uxMetricsConfig.uxCollectionMode\n\t\t\t\t\t? uxMetricsConfig.uxCollectionMode\n\t\t\t\t\t: 'Both',\n\t\t\t\tchannelType: uxMetricsConfig.channelType,\n\t\t\t\tsessionConfig: {\n\t\t\t\t\tserverEndpoint: uxMetricsConfig.endpointURL,\n\t\t\t\t\ttrackingConsent: uxMetricsConfig.trackingConsent,\n\t\t\t\t\tuserId: uxMetricsConfig.user.hashId,\n\t\t\t\t\tdomainId: uxMetricsConfig.user.domainId,\n\t\t\t\t\tdomainName: uxMetricsConfig.user.domainName,\n\t\t\t\t\troles: uxMetricsConfig.user.roles,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tlegacyConfig.sessionConfig.appContextId = attributes.experienceId;\n\t\t\tlegacyConfig.sessionConfig.appContextName =\n\t\t\t\tattributes.experienceName;\n\t\t\treturn legacyConfig;\n\t\t} else {\n\t\t\treturn {};\n\t\t}\n\t}\n\tfunction isWebChannelApplication(legacyConfig) {\n\t\treturn legacyConfig?.channelType === 'web';\n\t}\n}\n","import {\n\ttrace,\n\ttrack,\n\tcreateCounter,\n\tcreateGauge,\n\tcreateHistogram,\n\tsetUser as setUserNext,\n\tgetUser,\n\tsetPage as setPageNext,\n\tgetPage,\n\tsetConfigValue as setApiConfigValueNext,\n\tonEvent,\n\tcreateTraceParent,\n\tcreateTraceId,\n\tcreateTraceParentHeader,\n\tsetApplication as setApplicationNext,\n\tgetApplication,\n} from '@servicenow/ui-analytics-api';\n\nimport higherOrderSDKWrapper from './higherOrderSDKWrapper';\nimport { get as getConfigValue } from '../config';\nimport startExporter from '../startExporter';\n\nconst setUser = higherOrderSDKWrapper(setUserNext, 'user');\nconst setPage = higherOrderSDKWrapper(setPageNext, 'page');\nconst setApplication = higherOrderSDKWrapper(setApplicationNext, 'application');\nconst setApiConfigValue = higherOrderSDKWrapper(\n\tsetApiConfigValueNext,\n\t'utility'\n);\n\nexport {\n\ttrace,\n\ttrack,\n\tcreateCounter,\n\tcreateGauge,\n\tcreateHistogram,\n\tsetUser,\n\tgetUser,\n\tsetPage,\n\tgetPage,\n\tsetApiConfigValue as setConfigValue,\n\tgetConfigValue,\n\tonEvent,\n\tcreateTraceParent,\n\tcreateTraceId,\n\tstartExporter,\n\tcreateTraceParentHeader,\n\tsetApplication,\n\tgetApplication,\n};\n","import * as UsageProvider from './usage/usageProvider.js';\nimport * as LegacyAppseeProvider from './legacy/legacyAppseeProvider.js';\n\nexport function getProvider(type) {\n\tswitch (type.toLowerCase()) {\n\t\tcase 'usage':\n\t\t\treturn UsageProvider;\n\t\tcase 'legacy':\n\t\t\treturn LegacyAppseeProvider;\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown provider type: ${type}`);\n\t}\n}\n\nexport default getProvider;\n","import { getProvider } from './providerFactory';\nimport SNAnalytics from './usage/sdk';\n\nexport { getProvider, SNAnalytics };\n\nexport default getProvider;\n","import { getProvider } from '@servicenow/ui-analytics-providers';\n\nlet integrator = {}; // Default empty object before initialization\n\nexport function init(type) {\n\tintegrator = getProvider(type);\n\twindow.nowAnalytics = { ...integrator, getProvider }; // Update global reference\n}\n\n//moving initialization to here, as we are only going to support usage as a provider\ninit('usage');\n\n// No-op function (empty function that does nothing)\nconst noop = () => {};\n\n// Export function references with default no-op implementation\nexport const trace = (...args) => (integrator.trace || noop)(...args);\nexport const track = (...args) => (integrator.track || noop)(...args);\nexport const createCounter = (...args) =>\n\t(integrator.createCounter || noop)(...args);\nexport const createGauge = (...args) =>\n\t(integrator.createGauge || noop)(...args);\nexport const createHistogram = (...args) =>\n\t(integrator.createHistogram || noop)(...args);\nexport const setUser = (...args) => (integrator.setUser || noop)(...args);\nexport const getUser = (...args) => (integrator.getUser || noop)(...args);\nexport const setPage = (...args) => (integrator.setPage || noop)(...args);\nexport const getPage = (...args) => (integrator.getPage || noop)(...args);\nexport const setConfigValue = (...args) =>\n\t(integrator.setConfigValue || noop)(...args);\nexport const getConfigValue = (...args) =>\n\t(integrator.getConfigValue || noop)(...args);\nexport const onEvent = (...args) => (integrator.onEvent || noop)(...args);\nexport const createTraceParent = (...args) =>\n\t(integrator.createTraceParent || noop)(...args);\nexport const createTraceId = (...args) =>\n\t(integrator.createTraceId || noop)(...args);\nexport const createTraceParentHeader = (...args) =>\n\t(integrator.createTraceParentHeader || noop)(...args);\nexport const startExporter = (...args) =>\n\t(integrator.startExporter || noop)(...args);\nexport const setApplication = (...args) =>\n\t(integrator.setApplication || noop)(...args);\nexport const getApplication = (...args) =>\n\t(integrator.getApplication || noop)(...args);\n","export const USER_TOKEN = 'X-UserToken';\nexport const UCM_URL = '/api/ucm';\nexport const CONSENT_OPTIONS = {\n\tYES: 'full',\n\tNO: 'basic',\n};\n","import { USER_TOKEN, UCM_URL } from './constants';\n\nexport default async function get(url = UCM_URL) {\n\ttry {\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t[USER_TOKEN]: window.g_ck,\n\t\t\t},\n\t\t});\n\t\treturn await response.tojson();\n\t} catch (e) {\n\t\treturn e;\n\t}\n}\n","import { USER_TOKEN, UCM_URL } from './constants';\n\nexport default async function set(consent, url = UCM_URL) {\n\ttry {\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t[USER_TOKEN]: window.g_ck,\n\t\t\t},\n\t\t\tbody: JSON.stringify({ consent }),\n\t\t});\n\t\treturn await response.tojson();\n\t} catch (e) {\n\t\treturn e;\n\t}\n}\n","import * as servicenowUiAnalyticsApi from '@servicenow/ui-analytics-api';\nif (!window.__TECTONIC__$servicenow_ui_analytics_api) window.__TECTONIC__$servicenow_ui_analytics_api = servicenowUiAnalyticsApi;\nexport {servicenowUiAnalyticsApi};\nimport * as servicenowUiAnalyticsConsumer from '@servicenow/ui-analytics-consumer';\nif (!window.__TECTONIC__$servicenow_ui_analytics_consumer) window.__TECTONIC__$servicenow_ui_analytics_consumer = servicenowUiAnalyticsConsumer;\nexport {servicenowUiAnalyticsConsumer};\nimport * as servicenowUiAnalyticsCore from '@servicenow/ui-analytics-core';\nif (!window.__TECTONIC__$servicenow_ui_analytics_core) window.__TECTONIC__$servicenow_ui_analytics_core = servicenowUiAnalyticsCore;\nexport {servicenowUiAnalyticsCore};\nimport * as servicenowUiAnalyticsIntegrator from '@servicenow/ui-analytics-integrator';\nif (!window.__TECTONIC__$servicenow_ui_analytics_integrator) window.__TECTONIC__$servicenow_ui_analytics_integrator = servicenowUiAnalyticsIntegrator;\nexport {servicenowUiAnalyticsIntegrator};\nimport * as servicenowUiAnalyticsProviders from '@servicenow/ui-analytics-providers';\nif (!window.__TECTONIC__$servicenow_ui_analytics_providers) window.__TECTONIC__$servicenow_ui_analytics_providers = servicenowUiAnalyticsProviders;\nexport {servicenowUiAnalyticsProviders};\nimport * as servicenowUiAnalyticsUcm from '@servicenow/ui-analytics-ucm';\nif (!window.__TECTONIC__$servicenow_ui_analytics_ucm) window.__TECTONIC__$servicenow_ui_analytics_ucm = servicenowUiAnalyticsUcm;\nexport {servicenowUiAnalyticsUcm};"],"version":3}},{"offset":{"line":39,"column":0},"map":{"mappings":"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","file":"externals/@devsnc/sn-ui-logger/index.min.js","names":["toPropertyKey","require","module","exports","obj","key","value","Object","defineProperty","enumerable","configurable","writable","__esModule","_extends","assign","bind","target","i","arguments","length","source","prototype","hasOwnProperty","call","apply","this","_typeof","t","r","e","Symbol","toPrimitive","TypeError","String","Number","o","iterator","constructor","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","d","a","definition","get","prop","ConsoleLogExporter","extractInfo","log","_log$context","_log$context2","time","Date","timestamp","attributes","traceId","context","spanId","meta","fromExporter","export","logs","forEach","_log$meta","fromInterceptor","console","level","loggerName","message","fastDeepCopy","map","getCurrentTime","performance","timeOrigin","now","LogQueue","options","_defineProperty","Set","logLevel","cleanUpTimeInterval","collectTimeInterval","exporter","_logLevel","_cleanUpTimeInterval","_collectTimeInterval","_exporter","_queue","startLogInterval","startCleanupInterval","_collectIntervalId","window","setInterval","notifySubscribers","catch","error","_cleanupIntervalId","clear","stopLogInterval","clearInterval","stopCleanupInterval","lock","_queueLocked","unlock","concat","_backedLogs","push","info","forceFlush","getLogs","subscribe","callback","subscribers","add","delete","logsToEmit","notify","Logger","name","loggerProvider","_emit","emit","_options$level","debug","warn","logContext","LoggerProvider","Map","_context","_logQueue","_createLogInterceptor","_isLoggingEnabled","getLogger","logger","loggers","set","enableLogging","disableLogging","isLoggingEnabled","logQueue","_createConsoleLogInterceptors","defaultLogger","originalConsole","keys","_originalConsole$key","_args$","_args$$meta","_len","rest","Array","_key","args","from","join","_createErrorEventListener","addEventListener","event","stack","errorMessage","NoOpLoggerProvider","printErrorMessage","_","LoggerSubscriber","_window$nowUiFramewor","_window$nowUiFramewor2","nowUiFramework","snUiLoggerProvider"],"sources":["webpack:///@babel/runtime/7.24.0/helpers/defineProperty.js","webpack:///@babel/runtime/7.24.0/helpers/extends.js","webpack:///@babel/runtime/7.24.0/helpers/toPrimitive.js","webpack:///@babel/runtime/7.24.0/helpers/toPropertyKey.js","webpack:///@babel/runtime/7.24.0/helpers/typeof.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///@devsnc/sn-ui-logger/0.0.7/dist/exporter/consoleLogExporter.js","webpack:///@devsnc/sn-ui-logger/0.0.7/dist/utils/index.js","webpack:///@devsnc/sn-ui-logger/0.0.7/dist/logQueue.js","webpack:///@devsnc/sn-ui-logger/0.0.7/dist/logger.js","webpack:///@devsnc/sn-ui-logger/0.0.7/dist/loggerProvider/loggerProvider.js","webpack:///@devsnc/sn-ui-logger/0.0.7/dist/loggerProvider/noOpLoggerProvider.js","webpack:///@devsnc/sn-ui-logger/0.0.7/dist/subscriber.js"],"sourcesContent":["var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperty(obj, key, value) {\n  key = toPropertyKey(key);\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n  return obj;\n}\nmodule.exports = _defineProperty, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _extends() {\n  module.exports = _extends = Object.assign ? Object.assign.bind() : function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n    return target;\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n  return _extends.apply(this, arguments);\n}\nmodule.exports = _extends, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction toPrimitive(t, r) {\n  if (\"object\" != _typeof(t) || !t) return t;\n  var e = t[Symbol.toPrimitive];\n  if (void 0 !== e) {\n    var i = e.call(t, r || \"default\");\n    if (\"object\" != _typeof(i)) return i;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (\"string\" === r ? String : Number)(t);\n}\nmodule.exports = toPrimitive, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nvar toPrimitive = require(\"./toPrimitive.js\");\nfunction toPropertyKey(t) {\n  var i = toPrimitive(t, \"string\");\n  return \"symbol\" == _typeof(i) ? i : String(i);\n}\nmodule.exports = toPropertyKey, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _typeof(o) {\n  \"@babel/helpers - typeof\";\n\n  return (module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n    return typeof o;\n  } : function (o) {\n    return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports), _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","export default class ConsoleLogExporter {\n    constructor() { }\n    extractInfo(log) {\n        return {\n            time: new Date(log.timestamp),\n            timestamp: log.timestamp,\n            attributes: log.attributes,\n            traceId: log.context?.traceId,\n            spanId: log.context?.spanId,\n            meta: {\n                fromExporter: true,\n            },\n        };\n    }\n    export(logs) {\n        logs.forEach((log) => {\n            // Prevent double logging\n            if (log.meta?.fromInterceptor)\n                return;\n            console[log.level](`[${log.loggerName}]: ${log.message}`, this.extractInfo(log));\n        });\n    }\n}\n","/**\n * Logs has a specific schema. All of the values in a Log object are primitive,\n * except context and attributes, which are objects, where keys map to primitive types.\n * This will ensure no reference is carried over.\n * @param logs array of Log's\n * @returns deep copied array of Log's\n */\nexport const fastDeepCopy = (logs) => logs.map(log => ({\n    ...log,\n    attributes: log.attributes && { ...log.attributes },\n    context: log.context && { ...log.context },\n}));\nexport const getCurrentTime = () => performance.timeOrigin + performance.now();\n","import ConsoleLogExporter from \"./exporter/consoleLogExporter\";\nimport { fastDeepCopy } from './utils';\nexport default class LogQueue {\n    _queue;\n    _backedLogs = [];\n    _logLevel;\n    _cleanUpTimeInterval;\n    _collectTimeInterval;\n    _queueLocked = false;\n    _collectIntervalId;\n    _cleanupIntervalId;\n    _exporter;\n    subscribers = new Set();\n    constructor(options = {}) {\n        const { logLevel = 'debug', cleanUpTimeInterval = 60000, collectTimeInterval = 1000, exporter = new ConsoleLogExporter(), } = options;\n        this._logLevel = logLevel;\n        this._cleanUpTimeInterval = cleanUpTimeInterval;\n        this._collectTimeInterval = collectTimeInterval;\n        this._exporter = exporter;\n        this._queue = [];\n        this.startLogInterval();\n        this.startCleanupInterval();\n    }\n    /**\n     * Start the log collection interval.\n     * This will notify subscribers with the current log queue.\n     */\n    startLogInterval() {\n        try {\n            this._collectIntervalId = window.setInterval(() => {\n                this.notifySubscribers().catch(e => console.error('Something went wrong while notifying subscribers: ', e));\n            }, this._collectTimeInterval);\n        }\n        catch (e) {\n            console.error('Something went wrong while setting up log interval: ', e);\n        }\n    }\n    /**\n     * Start the log cleanup interval.\n     * This will clear the log queue if logs were not emitted within the time interval.\n     */\n    startCleanupInterval() {\n        try {\n            this._cleanupIntervalId = window.setInterval(() => this.clear(), this._cleanUpTimeInterval);\n        }\n        catch (e) {\n            console.error('Something went wrong while setting up log cleanup interval: ', e);\n        }\n    }\n    /**\n     * No more logs will be send to the subscribers.\n     */\n    stopLogInterval() {\n        window.clearInterval(this._collectIntervalId);\n    }\n    /**\n     * Stop clearing the log queue.\n     */\n    stopCleanupInterval() {\n        window.clearInterval(this._cleanupIntervalId);\n    }\n    lock() {\n        this._queueLocked = true;\n    }\n    unlock() {\n        this._queueLocked = false;\n        this._queue = this._queue.concat(fastDeepCopy(this._backedLogs));\n        this._backedLogs = [];\n    }\n    // TODO: should only push the log if it's level is higher than the current log level\n    /**\n     * Push to the log queue. If queue is locked, push to backed logs queue.\n     * @param log\n     * @returns void\n     */\n    push(log) {\n        if (this._queueLocked) {\n            this._backedLogs.push(log);\n            return;\n        }\n        this._queue.push(log);\n    }\n    /**\n     * Clear the log queue. If queue is locked, clears backed up logs queue.\n     * @returns true if queue was cleared, false if queue was locked and cleared backed logs\n     */\n    clear() {\n        if (this._queueLocked) {\n            console.info('Log queue is currently locked. Queueing cleanup.');\n            this._backedLogs = []; // TODO: is this worth it?\n            return false;\n        }\n        this._queue = [];\n        return true;\n    }\n    forceFlush() {\n        this._queue = [];\n    }\n    /**\n     * @returns deep copied array of Log's\n     */\n    getLogs() {\n        return fastDeepCopy(this._queue);\n    }\n    set logLevel(level) {\n        this._logLevel = level;\n    }\n    get logLevel() {\n        return this._logLevel;\n    }\n    /**\n     * Subscribe to log collection.\n     * @param callback function to call when logs are emitted\n     * @returns function that can be called to unsubscribe from log collection\n     */\n    subscribe(callback) {\n        this.subscribers.add(callback);\n        return () => this.subscribers.delete(callback);\n    }\n    async notifySubscribers() {\n        // don't allow any more logs to be pushed to main queue while we're emitting\n        this.lock();\n        const logsToEmit = fastDeepCopy(this._queue);\n        this.forceFlush();\n        this.unlock();\n        this.subscribers.forEach(notify => notify(logsToEmit));\n    }\n}\n","import { getCurrentTime } from \"./utils\";\nexport default class Logger {\n    name;\n    loggerProvider;\n    context = { traceId: '', spanId: '' };\n    constructor(name = 'SnUiLogger', loggerProvider) {\n        this.name = name;\n        this.loggerProvider = loggerProvider;\n    }\n    _emit(log) {\n        this.loggerProvider.push(log);\n    }\n    /**\n     * Emits a log message with custom level.\n     * @param message log message to print\n     * @param options options should contain `level` and `attributes` to\n     * \tshow with the log. `level` defaults to `info`\n     */\n    emit(message, options = { level: 'info' }) {\n        this._emit({\n            loggerName: this.name,\n            message,\n            timestamp: getCurrentTime(),\n            attributes: options.attributes,\n            level: options.level ?? 'info',\n            meta: options.meta,\n        });\n    }\n    /**\n     * Emits a log message with level `info`.\n     * @param message log message to print\n     * @param attributes attributes to show with the log\n     */\n    info(message, attributes = {}) {\n        this._emit({\n            loggerName: this.name,\n            message,\n            timestamp: getCurrentTime(),\n            attributes,\n            level: 'info',\n        });\n    }\n    /**\n     * Emits a log message with level `debug`.\n     * @param message log message to print\n     * @param attributes attributes to show with the log\n     */\n    debug(message, attributes = {}) {\n        this._emit({\n            loggerName: this.name,\n            message,\n            timestamp: getCurrentTime(),\n            attributes,\n            level: 'debug',\n        });\n    }\n    /**\n     * Emits a log message with level `warn`.\n     * @param message log message to print\n     * @param attributes attributes to show with the log\n     */\n    warn(message, attributes = {}) {\n        this._emit({\n            loggerName: this.name,\n            message,\n            timestamp: getCurrentTime(),\n            attributes,\n            level: 'warn',\n        });\n    }\n    /**\n     * Emits a log message with level `error`.\n     * @param message log message to print\n     * @param attributes attributes to show with the log\n     */\n    error(message, attributes = {}) {\n        this._emit({\n            loggerName: this.name,\n            message,\n            timestamp: getCurrentTime(),\n            attributes,\n            level: 'error',\n        });\n    }\n    set logContext(context) {\n        this.context = context;\n        this.loggerProvider.context = context;\n    }\n    get logContext() {\n        return this.context;\n    }\n}\n","/* eslint-disable no-fallthrough */\nimport ConsoleLogExporter from '../exporter/consoleLogExporter';\nimport LogQueue from '../logQueue';\nimport Logger from '../logger';\nexport default class LoggerProvider {\n    _logLevel;\n    _logQueue;\n    _context;\n    _exporter;\n    loggers = new Map();\n    _isLoggingEnabled = true;\n    constructor(options = {}) {\n        const { logLevel = 'warn', cleanUpTimeInterval = 60000, collectTimeInterval = 1000, context = { traceId: '', spanId: '' }, exporter = new ConsoleLogExporter(), } = options;\n        this._logLevel = logLevel === true ? 'debug' : logLevel;\n        this._context = context;\n        this._logQueue = new LogQueue({\n            cleanUpTimeInterval,\n            collectTimeInterval,\n            exporter,\n        });\n        this._exporter = exporter;\n        if (this._logLevel)\n            this._createLogInterceptor();\n    }\n    push(log) {\n        if (!this._isLoggingEnabled)\n            return;\n        log.context = this._context;\n        this._logQueue.push(log);\n        this._exporter.export([log]);\n    }\n    clear() {\n        this._logQueue.clear();\n    }\n    set logLevel(level) {\n        this._logLevel = level === true ? 'debug' : level;\n        if (level)\n            this._createLogInterceptor();\n    }\n    get logLevel() {\n        return this._logLevel;\n    }\n    getLogger(name = 'SnUiLogger') {\n        let logger = this.loggers.get(name);\n        if (!logger) {\n            logger = new Logger(name, this);\n            this.loggers.set(name, logger);\n        }\n        return logger;\n    }\n    set context(context) {\n        this._context = context;\n    }\n    get context() {\n        return this._context;\n    }\n    enableLogging() {\n        this._isLoggingEnabled = true;\n        this._logQueue.startLogInterval();\n        this._logQueue.startCleanupInterval();\n    }\n    disableLogging() {\n        this._isLoggingEnabled = false;\n        this._logQueue.stopLogInterval();\n        this._logQueue.stopCleanupInterval();\n    }\n    get isLoggingEnabled() {\n        return this._isLoggingEnabled;\n    }\n    get logQueue() {\n        return this._logQueue;\n    }\n    subscribe(callback) {\n        return this._logQueue.subscribe(callback);\n    }\n    _createConsoleLogInterceptors() {\n        const defaultLogger = this.getLogger();\n        const originalConsole = {};\n        switch (this._logLevel) {\n            case 'debug':\n                originalConsole.debug = console.debug;\n            case 'info':\n                originalConsole.info = console.info;\n            case 'warn':\n                originalConsole.warn = console.warn;\n            case 'error':\n                originalConsole.error = console.error;\n        }\n        const consoleKeys = Object.keys(originalConsole);\n        consoleKeys.forEach((key) => {\n            console[key] = function (...rest) {\n                const args = Array.from(rest);\n                originalConsole[key]?.apply(console, args);\n                if (args[1]?.meta?.fromExporter)\n                    return;\n                if (defaultLogger) {\n                    defaultLogger.emit(args.join(' '), {\n                        level: key,\n                        meta: {\n                            fromInterceptor: true,\n                        },\n                    });\n                }\n            };\n        });\n    }\n    _createErrorEventListener() {\n        const defaultLogger = this.getLogger();\n        window.addEventListener('error', (event) => {\n            if (defaultLogger) {\n                const { error } = event;\n                defaultLogger.error(`${error.stack}\\n`, {\n                    errorMessage: error.message,\n                });\n            }\n        });\n    }\n    _createLogInterceptor() {\n        this._createConsoleLogInterceptors();\n        this._createErrorEventListener();\n    }\n}\n","export default class NoOpLoggerProvider {\n    constructor() { }\n    printErrorMessage() {\n        console.error('LoggerProvider has not been initialized yet. Please ensure you are on a seismic compatible page, and you have logging enabled');\n    }\n    push() {\n        this.printErrorMessage();\n    }\n    clear() {\n        this.printErrorMessage();\n    }\n    set logLevel(_) {\n        this.printErrorMessage();\n    }\n    get logLevel() {\n        this.printErrorMessage();\n        return '';\n    }\n    getLogger() {\n        this.printErrorMessage();\n    }\n    set context(_) {\n        this.printErrorMessage();\n    }\n    get context() {\n        this.printErrorMessage();\n        return {};\n    }\n    enableLogging() {\n        this.printErrorMessage();\n    }\n    disableLogging() {\n        this.printErrorMessage();\n    }\n    subscribe() {\n        this.printErrorMessage();\n        return () => { };\n    }\n}\n","import { NoOpLoggerProvider } from './loggerProvider';\n/**\n * LoggerSubscriber is a class that enables subscribing to logs from the LoggerProvider.\n * This subscriber is used in Web environments only.\n *\n * @example\n * const subscriber = new LoggerSubscriber();\n * subscriber.subscribe((logs) => {\n * \tconsole.log(logs);\n * });\n */\nexport default class LoggerSubscriber {\n    loggerProvider;\n    constructor() {\n        this.loggerProvider = window.nowUiFramework?.snUiLoggerProvider ?? new NoOpLoggerProvider();\n    }\n    /**\n     * Receive logs from the LoggerProvider.\n     * @param callback A function that will be called when logs are emitted.\n     * @return A function that can be called to unsubscribe from the LoggerProvider.\n     */\n    subscribe(callback) {\n        return this.loggerProvider.subscribe(callback);\n    }\n}\n"],"version":3}}]}