From 80d342913ab7f3dc3e1a549a3b7cb866b6b84e64 Mon Sep 17 00:00:00 2001
From: "scott.sun" <scott.sun@topibd.com>
Date: Thu, 16 Apr 2020 12:38:40 +0800
Subject: [PATCH] s

---
 config.js                                     | 1092 ++--
 config1.js                                    |  194 +
 config2.js                                    |  306 ++
 jtg js/JTG_NET_set_drill_attribute_aim.js     |   88 +
 jtg js/JTG_ORG_backup_layers_aim.js           |   88 +
 jtg js/JTG_ORG_create_outline_aim.js          |   88 +
 jtg js/JTG_ORG_delete_profile_aim.js          |   88 +
 jtg js/JTG_ORG_input_data_aim.js              |  148 +
 jtg js/JTG_ORG_set_origin_aim.js              |   88 +
 jtg js/JTG_PUB_auto_save_job_aim.js           |   88 +
 jtg js/JTG_PUB_copy_step_aim.js               |   88 +
 jtg js/node_modules/@types/console/index.d.ts |   12 +
 jtg js/node_modules/@types/events/index.d.ts  |   28 +
 jtg js/node_modules/@types/fs/index.d.ts      |  335 ++
 jtg js/node_modules/@types/lodash/LICENSE     |   21 +
 jtg js/node_modules/@types/lodash/README.md   |   16 +
 jtg js/node_modules/@types/lodash/add.d.ts    |    2 +
 jtg js/node_modules/@types/lodash/after.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/ary.d.ts    |    2 +
 jtg js/node_modules/@types/lodash/assign.d.ts |    2 +
 .../node_modules/@types/lodash/assignIn.d.ts  |    2 +
 .../@types/lodash/assignInWith.d.ts           |    2 +
 .../@types/lodash/assignWith.d.ts             |    2 +
 jtg js/node_modules/@types/lodash/at.d.ts     |    2 +
 .../node_modules/@types/lodash/attempt.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/before.d.ts |    2 +
 jtg js/node_modules/@types/lodash/bind.d.ts   |    2 +
 .../node_modules/@types/lodash/bindAll.d.ts   |    2 +
 .../node_modules/@types/lodash/bindKey.d.ts   |    2 +
 .../node_modules/@types/lodash/camelCase.d.ts |    2 +
 .../@types/lodash/capitalize.d.ts             |    2 +
 .../node_modules/@types/lodash/castArray.d.ts |    2 +
 jtg js/node_modules/@types/lodash/ceil.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/chain.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/chunk.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/clamp.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/clone.d.ts  |    2 +
 .../node_modules/@types/lodash/cloneDeep.d.ts |    2 +
 .../@types/lodash/cloneDeepWith.d.ts          |    2 +
 .../node_modules/@types/lodash/cloneWith.d.ts |    2 +
 .../@types/lodash/common/array.d.ts           | 3708 +++++++++++++
 .../@types/lodash/common/collection.d.ts      | 2575 +++++++++
 .../@types/lodash/common/common.d.ts          |  268 +
 .../@types/lodash/common/date.d.ts            |   27 +
 .../@types/lodash/common/function.d.ts        | 1473 +++++
 .../@types/lodash/common/lang.d.ts            | 2065 +++++++
 .../@types/lodash/common/math.d.ts            |  532 ++
 .../@types/lodash/common/number.d.ts          |  178 +
 .../@types/lodash/common/object.d.ts          | 3761 +++++++++++++
 .../@types/lodash/common/seq.d.ts             |  196 +
 .../@types/lodash/common/string.d.ts          | 1059 ++++
 .../@types/lodash/common/util.d.ts            | 1463 +++++
 .../node_modules/@types/lodash/compact.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/concat.d.ts |    2 +
 jtg js/node_modules/@types/lodash/cond.d.ts   |    2 +
 .../@types/lodash/conformsTo.d.ts             |    2 +
 .../node_modules/@types/lodash/constant.d.ts  |    2 +
 .../node_modules/@types/lodash/countBy.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/create.d.ts |    2 +
 jtg js/node_modules/@types/lodash/curry.d.ts  |    2 +
 .../@types/lodash/curryRight.d.ts             |    2 +
 .../node_modules/@types/lodash/debounce.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/deburr.d.ts |    2 +
 .../node_modules/@types/lodash/defaultTo.d.ts |    2 +
 .../node_modules/@types/lodash/defaults.d.ts  |    2 +
 .../@types/lodash/defaultsDeep.d.ts           |    2 +
 jtg js/node_modules/@types/lodash/defer.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/delay.d.ts  |    2 +
 .../@types/lodash/difference.d.ts             |    2 +
 .../@types/lodash/differenceBy.d.ts           |    2 +
 .../@types/lodash/differenceWith.d.ts         |    2 +
 jtg js/node_modules/@types/lodash/divide.d.ts |    2 +
 jtg js/node_modules/@types/lodash/drop.d.ts   |    2 +
 .../node_modules/@types/lodash/dropRight.d.ts |    2 +
 .../@types/lodash/dropRightWhile.d.ts         |    2 +
 .../node_modules/@types/lodash/dropWhile.d.ts |    2 +
 jtg js/node_modules/@types/lodash/each.d.ts   |    2 +
 .../node_modules/@types/lodash/eachRight.d.ts |    2 +
 .../node_modules/@types/lodash/endsWith.d.ts  |    2 +
 .../node_modules/@types/lodash/entries.d.ts   |    2 +
 .../node_modules/@types/lodash/entriesIn.d.ts |    2 +
 jtg js/node_modules/@types/lodash/eq.d.ts     |    2 +
 jtg js/node_modules/@types/lodash/escape.d.ts |    2 +
 .../@types/lodash/escapeRegExp.d.ts           |    2 +
 jtg js/node_modules/@types/lodash/every.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/extend.d.ts |    2 +
 .../@types/lodash/extendWith.d.ts             |    2 +
 jtg js/node_modules/@types/lodash/fill.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/filter.d.ts |    2 +
 jtg js/node_modules/@types/lodash/find.d.ts   |    2 +
 .../node_modules/@types/lodash/findIndex.d.ts |    2 +
 .../node_modules/@types/lodash/findKey.d.ts   |    2 +
 .../node_modules/@types/lodash/findLast.d.ts  |    2 +
 .../@types/lodash/findLastIndex.d.ts          |    2 +
 .../@types/lodash/findLastKey.d.ts            |    2 +
 jtg js/node_modules/@types/lodash/first.d.ts  |    2 +
 .../node_modules/@types/lodash/flatMap.d.ts   |    2 +
 .../@types/lodash/flatMapDeep.d.ts            |    2 +
 .../@types/lodash/flatMapDepth.d.ts           |    2 +
 .../node_modules/@types/lodash/flatten.d.ts   |    2 +
 .../@types/lodash/flattenDeep.d.ts            |    2 +
 .../@types/lodash/flattenDepth.d.ts           |    2 +
 jtg js/node_modules/@types/lodash/flip.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/floor.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/flow.d.ts   |    2 +
 .../node_modules/@types/lodash/flowRight.d.ts |    2 +
 .../node_modules/@types/lodash/forEach.d.ts   |    2 +
 .../@types/lodash/forEachRight.d.ts           |    2 +
 jtg js/node_modules/@types/lodash/forIn.d.ts  |    2 +
 .../@types/lodash/forInRight.d.ts             |    2 +
 jtg js/node_modules/@types/lodash/forOwn.d.ts |    2 +
 .../@types/lodash/forOwnRight.d.ts            |    2 +
 jtg js/node_modules/@types/lodash/fp.d.ts     | 4765 +++++++++++++++++
 jtg js/node_modules/@types/lodash/fp/F.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/fp/T.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/fp/__.d.ts  |    3 +
 jtg js/node_modules/@types/lodash/fp/add.d.ts |    2 +
 .../node_modules/@types/lodash/fp/after.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/fp/all.d.ts |    2 +
 .../@types/lodash/fp/allPass.d.ts             |    2 +
 .../node_modules/@types/lodash/fp/always.d.ts |    2 +
 jtg js/node_modules/@types/lodash/fp/any.d.ts |    2 +
 .../@types/lodash/fp/anyPass.d.ts             |    2 +
 .../node_modules/@types/lodash/fp/apply.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/fp/ary.d.ts |    2 +
 .../node_modules/@types/lodash/fp/assign.d.ts |    2 +
 .../@types/lodash/fp/assignAll.d.ts           |    2 +
 .../@types/lodash/fp/assignAllWith.d.ts       |    2 +
 .../@types/lodash/fp/assignIn.d.ts            |    2 +
 .../@types/lodash/fp/assignInAll.d.ts         |    2 +
 .../@types/lodash/fp/assignInAllWith.d.ts     |    2 +
 .../@types/lodash/fp/assignInWith.d.ts        |    2 +
 .../@types/lodash/fp/assignWith.d.ts          |    2 +
 .../node_modules/@types/lodash/fp/assoc.d.ts  |    2 +
 .../@types/lodash/fp/assocPath.d.ts           |    2 +
 jtg js/node_modules/@types/lodash/fp/at.d.ts  |    2 +
 .../@types/lodash/fp/attempt.d.ts             |    2 +
 .../node_modules/@types/lodash/fp/before.d.ts |    2 +
 .../node_modules/@types/lodash/fp/bind.d.ts   |    2 +
 .../@types/lodash/fp/bindAll.d.ts             |    2 +
 .../@types/lodash/fp/bindKey.d.ts             |    2 +
 .../@types/lodash/fp/camelCase.d.ts           |    2 +
 .../@types/lodash/fp/capitalize.d.ts          |    2 +
 .../@types/lodash/fp/castArray.d.ts           |    2 +
 .../node_modules/@types/lodash/fp/ceil.d.ts   |    2 +
 .../node_modules/@types/lodash/fp/chunk.d.ts  |    2 +
 .../node_modules/@types/lodash/fp/clamp.d.ts  |    2 +
 .../node_modules/@types/lodash/fp/clone.d.ts  |    2 +
 .../@types/lodash/fp/cloneDeep.d.ts           |    2 +
 .../@types/lodash/fp/cloneDeepWith.d.ts       |    2 +
 .../@types/lodash/fp/cloneWith.d.ts           |    2 +
 .../@types/lodash/fp/compact.d.ts             |    2 +
 .../@types/lodash/fp/complement.d.ts          |    2 +
 .../@types/lodash/fp/compose.d.ts             |    2 +
 .../node_modules/@types/lodash/fp/concat.d.ts |    2 +
 .../node_modules/@types/lodash/fp/cond.d.ts   |    2 +
 .../@types/lodash/fp/conforms.d.ts            |    2 +
 .../@types/lodash/fp/conformsTo.d.ts          |    2 +
 .../@types/lodash/fp/constant.d.ts            |    2 +
 .../@types/lodash/fp/contains.d.ts            |    2 +
 .../@types/lodash/fp/convert.d.ts             |   15 +
 .../@types/lodash/fp/countBy.d.ts             |    2 +
 .../node_modules/@types/lodash/fp/create.d.ts |    2 +
 .../node_modules/@types/lodash/fp/curry.d.ts  |    2 +
 .../node_modules/@types/lodash/fp/curryN.d.ts |    2 +
 .../@types/lodash/fp/curryRight.d.ts          |    2 +
 .../@types/lodash/fp/curryRightN.d.ts         |    2 +
 .../@types/lodash/fp/debounce.d.ts            |    2 +
 .../node_modules/@types/lodash/fp/deburr.d.ts |    2 +
 .../@types/lodash/fp/defaultTo.d.ts           |    2 +
 .../@types/lodash/fp/defaults.d.ts            |    2 +
 .../@types/lodash/fp/defaultsAll.d.ts         |    2 +
 .../@types/lodash/fp/defaultsDeep.d.ts        |    2 +
 .../@types/lodash/fp/defaultsDeepAll.d.ts     |    2 +
 .../node_modules/@types/lodash/fp/defer.d.ts  |    2 +
 .../node_modules/@types/lodash/fp/delay.d.ts  |    2 +
 .../@types/lodash/fp/difference.d.ts          |    2 +
 .../@types/lodash/fp/differenceBy.d.ts        |    2 +
 .../@types/lodash/fp/differenceWith.d.ts      |    2 +
 .../node_modules/@types/lodash/fp/dissoc.d.ts |    2 +
 .../@types/lodash/fp/dissocPath.d.ts          |    2 +
 .../node_modules/@types/lodash/fp/divide.d.ts |    2 +
 .../node_modules/@types/lodash/fp/drop.d.ts   |    2 +
 .../@types/lodash/fp/dropLast.d.ts            |    2 +
 .../@types/lodash/fp/dropLastWhile.d.ts       |    2 +
 .../@types/lodash/fp/dropRight.d.ts           |    2 +
 .../@types/lodash/fp/dropRightWhile.d.ts      |    2 +
 .../@types/lodash/fp/dropWhile.d.ts           |    2 +
 .../node_modules/@types/lodash/fp/each.d.ts   |    2 +
 .../@types/lodash/fp/eachRight.d.ts           |    2 +
 .../@types/lodash/fp/endsWith.d.ts            |    2 +
 .../@types/lodash/fp/entries.d.ts             |    2 +
 .../@types/lodash/fp/entriesIn.d.ts           |    2 +
 jtg js/node_modules/@types/lodash/fp/eq.d.ts  |    2 +
 .../node_modules/@types/lodash/fp/equals.d.ts |    2 +
 .../node_modules/@types/lodash/fp/escape.d.ts |    2 +
 .../@types/lodash/fp/escapeRegExp.d.ts        |    2 +
 .../node_modules/@types/lodash/fp/every.d.ts  |    2 +
 .../node_modules/@types/lodash/fp/extend.d.ts |    2 +
 .../@types/lodash/fp/extendAll.d.ts           |    2 +
 .../@types/lodash/fp/extendAllWith.d.ts       |    2 +
 .../@types/lodash/fp/extendWith.d.ts          |    2 +
 .../node_modules/@types/lodash/fp/fill.d.ts   |    2 +
 .../node_modules/@types/lodash/fp/filter.d.ts |    2 +
 .../node_modules/@types/lodash/fp/find.d.ts   |    2 +
 .../@types/lodash/fp/findFrom.d.ts            |    2 +
 .../@types/lodash/fp/findIndex.d.ts           |    2 +
 .../@types/lodash/fp/findIndexFrom.d.ts       |    2 +
 .../@types/lodash/fp/findKey.d.ts             |    2 +
 .../@types/lodash/fp/findLast.d.ts            |    2 +
 .../@types/lodash/fp/findLastFrom.d.ts        |    2 +
 .../@types/lodash/fp/findLastIndex.d.ts       |    2 +
 .../@types/lodash/fp/findLastIndexFrom.d.ts   |    2 +
 .../@types/lodash/fp/findLastKey.d.ts         |    2 +
 .../node_modules/@types/lodash/fp/first.d.ts  |    2 +
 .../@types/lodash/fp/flatMap.d.ts             |    2 +
 .../@types/lodash/fp/flatMapDeep.d.ts         |    2 +
 .../@types/lodash/fp/flatMapDepth.d.ts        |    2 +
 .../@types/lodash/fp/flatten.d.ts             |    2 +
 .../@types/lodash/fp/flattenDeep.d.ts         |    2 +
 .../@types/lodash/fp/flattenDepth.d.ts        |    2 +
 .../node_modules/@types/lodash/fp/flip.d.ts   |    2 +
 .../node_modules/@types/lodash/fp/floor.d.ts  |    2 +
 .../node_modules/@types/lodash/fp/flow.d.ts   |    2 +
 .../@types/lodash/fp/flowRight.d.ts           |    2 +
 .../@types/lodash/fp/forEach.d.ts             |    2 +
 .../@types/lodash/fp/forEachRight.d.ts        |    2 +
 .../node_modules/@types/lodash/fp/forIn.d.ts  |    2 +
 .../@types/lodash/fp/forInRight.d.ts          |    2 +
 .../node_modules/@types/lodash/fp/forOwn.d.ts |    2 +
 .../@types/lodash/fp/forOwnRight.d.ts         |    2 +
 .../@types/lodash/fp/fromPairs.d.ts           |    2 +
 .../@types/lodash/fp/functions.d.ts           |    2 +
 .../@types/lodash/fp/functionsIn.d.ts         |    2 +
 jtg js/node_modules/@types/lodash/fp/get.d.ts |    2 +
 .../node_modules/@types/lodash/fp/getOr.d.ts  |    2 +
 .../@types/lodash/fp/groupBy.d.ts             |    2 +
 jtg js/node_modules/@types/lodash/fp/gt.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/fp/gte.d.ts |    2 +
 jtg js/node_modules/@types/lodash/fp/has.d.ts |    2 +
 .../node_modules/@types/lodash/fp/hasIn.d.ts  |    2 +
 .../node_modules/@types/lodash/fp/head.d.ts   |    2 +
 .../@types/lodash/fp/identical.d.ts           |    2 +
 .../@types/lodash/fp/identity.d.ts            |    2 +
 .../@types/lodash/fp/inRange.d.ts             |    2 +
 .../@types/lodash/fp/includes.d.ts            |    2 +
 .../@types/lodash/fp/includesFrom.d.ts        |    2 +
 .../@types/lodash/fp/indexBy.d.ts             |    2 +
 .../@types/lodash/fp/indexOf.d.ts             |    2 +
 .../@types/lodash/fp/indexOfFrom.d.ts         |    2 +
 .../node_modules/@types/lodash/fp/init.d.ts   |    2 +
 .../@types/lodash/fp/initial.d.ts             |    2 +
 .../@types/lodash/fp/intersection.d.ts        |    2 +
 .../@types/lodash/fp/intersectionBy.d.ts      |    2 +
 .../@types/lodash/fp/intersectionWith.d.ts    |    2 +
 .../node_modules/@types/lodash/fp/invert.d.ts |    2 +
 .../@types/lodash/fp/invertBy.d.ts            |    2 +
 .../@types/lodash/fp/invertObj.d.ts           |    2 +
 .../node_modules/@types/lodash/fp/invoke.d.ts |    2 +
 .../@types/lodash/fp/invokeArgs.d.ts          |    2 +
 .../@types/lodash/fp/invokeArgsMap.d.ts       |    2 +
 .../@types/lodash/fp/invokeMap.d.ts           |    2 +
 .../@types/lodash/fp/isArguments.d.ts         |    2 +
 .../@types/lodash/fp/isArray.d.ts             |    2 +
 .../@types/lodash/fp/isArrayBuffer.d.ts       |    2 +
 .../@types/lodash/fp/isArrayLike.d.ts         |    2 +
 .../@types/lodash/fp/isArrayLikeObject.d.ts   |    2 +
 .../@types/lodash/fp/isBoolean.d.ts           |    2 +
 .../@types/lodash/fp/isBuffer.d.ts            |    2 +
 .../node_modules/@types/lodash/fp/isDate.d.ts |    2 +
 .../@types/lodash/fp/isElement.d.ts           |    2 +
 .../@types/lodash/fp/isEmpty.d.ts             |    2 +
 .../@types/lodash/fp/isEqual.d.ts             |    2 +
 .../@types/lodash/fp/isEqualWith.d.ts         |    2 +
 .../@types/lodash/fp/isError.d.ts             |    2 +
 .../@types/lodash/fp/isFinite.d.ts            |    2 +
 .../@types/lodash/fp/isFunction.d.ts          |    2 +
 .../@types/lodash/fp/isInteger.d.ts           |    2 +
 .../@types/lodash/fp/isLength.d.ts            |    2 +
 .../node_modules/@types/lodash/fp/isMap.d.ts  |    2 +
 .../@types/lodash/fp/isMatch.d.ts             |    2 +
 .../@types/lodash/fp/isMatchWith.d.ts         |    2 +
 .../node_modules/@types/lodash/fp/isNaN.d.ts  |    2 +
 .../@types/lodash/fp/isNative.d.ts            |    2 +
 .../node_modules/@types/lodash/fp/isNil.d.ts  |    2 +
 .../node_modules/@types/lodash/fp/isNull.d.ts |    2 +
 .../@types/lodash/fp/isNumber.d.ts            |    2 +
 .../@types/lodash/fp/isObject.d.ts            |    2 +
 .../@types/lodash/fp/isObjectLike.d.ts        |    2 +
 .../@types/lodash/fp/isPlainObject.d.ts       |    2 +
 .../@types/lodash/fp/isRegExp.d.ts            |    2 +
 .../@types/lodash/fp/isSafeInteger.d.ts       |    2 +
 .../node_modules/@types/lodash/fp/isSet.d.ts  |    2 +
 .../@types/lodash/fp/isString.d.ts            |    2 +
 .../@types/lodash/fp/isSymbol.d.ts            |    2 +
 .../@types/lodash/fp/isTypedArray.d.ts        |    2 +
 .../@types/lodash/fp/isUndefined.d.ts         |    2 +
 .../@types/lodash/fp/isWeakMap.d.ts           |    2 +
 .../@types/lodash/fp/isWeakSet.d.ts           |    2 +
 .../@types/lodash/fp/iteratee.d.ts            |    2 +
 .../node_modules/@types/lodash/fp/join.d.ts   |    2 +
 .../node_modules/@types/lodash/fp/juxt.d.ts   |    2 +
 .../@types/lodash/fp/kebabCase.d.ts           |    2 +
 .../node_modules/@types/lodash/fp/keyBy.d.ts  |    2 +
 .../node_modules/@types/lodash/fp/keys.d.ts   |    2 +
 .../node_modules/@types/lodash/fp/keysIn.d.ts |    2 +
 .../node_modules/@types/lodash/fp/last.d.ts   |    2 +
 .../@types/lodash/fp/lastIndexOf.d.ts         |    2 +
 .../@types/lodash/fp/lastIndexOfFrom.d.ts     |    2 +
 .../@types/lodash/fp/lowerCase.d.ts           |    2 +
 .../@types/lodash/fp/lowerFirst.d.ts          |    2 +
 jtg js/node_modules/@types/lodash/fp/lt.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/fp/lte.d.ts |    2 +
 jtg js/node_modules/@types/lodash/fp/map.d.ts |    2 +
 .../@types/lodash/fp/mapKeys.d.ts             |    2 +
 .../@types/lodash/fp/mapValues.d.ts           |    2 +
 .../@types/lodash/fp/matches.d.ts             |    2 +
 .../@types/lodash/fp/matchesProperty.d.ts     |    2 +
 jtg js/node_modules/@types/lodash/fp/max.d.ts |    2 +
 .../node_modules/@types/lodash/fp/maxBy.d.ts  |    2 +
 .../node_modules/@types/lodash/fp/mean.d.ts   |    2 +
 .../node_modules/@types/lodash/fp/meanBy.d.ts |    2 +
 .../@types/lodash/fp/memoize.d.ts             |    2 +
 .../node_modules/@types/lodash/fp/merge.d.ts  |    2 +
 .../@types/lodash/fp/mergeAll.d.ts            |    2 +
 .../@types/lodash/fp/mergeAllWith.d.ts        |    2 +
 .../@types/lodash/fp/mergeWith.d.ts           |    2 +
 .../node_modules/@types/lodash/fp/method.d.ts |    2 +
 .../@types/lodash/fp/methodOf.d.ts            |    2 +
 jtg js/node_modules/@types/lodash/fp/min.d.ts |    2 +
 .../node_modules/@types/lodash/fp/minBy.d.ts  |    2 +
 .../@types/lodash/fp/multiply.d.ts            |    2 +
 .../node_modules/@types/lodash/fp/nAry.d.ts   |    2 +
 .../node_modules/@types/lodash/fp/negate.d.ts |    2 +
 .../@types/lodash/fp/noConflict.d.ts          |    2 +
 .../node_modules/@types/lodash/fp/noop.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/fp/now.d.ts |    2 +
 jtg js/node_modules/@types/lodash/fp/nth.d.ts |    2 +
 .../node_modules/@types/lodash/fp/nthArg.d.ts |    2 +
 .../node_modules/@types/lodash/fp/omit.d.ts   |    2 +
 .../@types/lodash/fp/omitAll.d.ts             |    2 +
 .../node_modules/@types/lodash/fp/omitBy.d.ts |    2 +
 .../node_modules/@types/lodash/fp/once.d.ts   |    2 +
 .../@types/lodash/fp/orderBy.d.ts             |    2 +
 .../node_modules/@types/lodash/fp/over.d.ts   |    2 +
 .../@types/lodash/fp/overArgs.d.ts            |    2 +
 .../@types/lodash/fp/overEvery.d.ts           |    2 +
 .../@types/lodash/fp/overSome.d.ts            |    2 +
 jtg js/node_modules/@types/lodash/fp/pad.d.ts |    2 +
 .../@types/lodash/fp/padChars.d.ts            |    2 +
 .../@types/lodash/fp/padCharsEnd.d.ts         |    2 +
 .../@types/lodash/fp/padCharsStart.d.ts       |    2 +
 .../node_modules/@types/lodash/fp/padEnd.d.ts |    2 +
 .../@types/lodash/fp/padStart.d.ts            |    2 +
 .../@types/lodash/fp/parseInt.d.ts            |    2 +
 .../@types/lodash/fp/partial.d.ts             |    2 +
 .../@types/lodash/fp/partialRight.d.ts        |    2 +
 .../@types/lodash/fp/partition.d.ts           |    2 +
 .../node_modules/@types/lodash/fp/path.d.ts   |    2 +
 .../node_modules/@types/lodash/fp/pathEq.d.ts |    2 +
 .../node_modules/@types/lodash/fp/pathOr.d.ts |    2 +
 .../node_modules/@types/lodash/fp/paths.d.ts  |    2 +
 .../node_modules/@types/lodash/fp/pick.d.ts   |    2 +
 .../@types/lodash/fp/pickAll.d.ts             |    2 +
 .../node_modules/@types/lodash/fp/pickBy.d.ts |    2 +
 .../node_modules/@types/lodash/fp/pipe.d.ts   |    2 +
 .../@types/lodash/fp/placeholder.d.ts         |    3 +
 .../node_modules/@types/lodash/fp/pluck.d.ts  |    2 +
 .../node_modules/@types/lodash/fp/prop.d.ts   |    2 +
 .../node_modules/@types/lodash/fp/propEq.d.ts |    2 +
 .../node_modules/@types/lodash/fp/propOr.d.ts |    2 +
 .../@types/lodash/fp/property.d.ts            |    2 +
 .../@types/lodash/fp/propertyOf.d.ts          |    2 +
 .../node_modules/@types/lodash/fp/props.d.ts  |    2 +
 .../node_modules/@types/lodash/fp/pull.d.ts   |    2 +
 .../@types/lodash/fp/pullAll.d.ts             |    2 +
 .../@types/lodash/fp/pullAllBy.d.ts           |    2 +
 .../@types/lodash/fp/pullAllWith.d.ts         |    2 +
 .../node_modules/@types/lodash/fp/pullAt.d.ts |    2 +
 .../node_modules/@types/lodash/fp/random.d.ts |    2 +
 .../node_modules/@types/lodash/fp/range.d.ts  |    2 +
 .../@types/lodash/fp/rangeRight.d.ts          |    2 +
 .../@types/lodash/fp/rangeStep.d.ts           |    2 +
 .../@types/lodash/fp/rangeStepRight.d.ts      |    2 +
 .../node_modules/@types/lodash/fp/rearg.d.ts  |    2 +
 .../node_modules/@types/lodash/fp/reduce.d.ts |    2 +
 .../@types/lodash/fp/reduceRight.d.ts         |    2 +
 .../node_modules/@types/lodash/fp/reject.d.ts |    2 +
 .../node_modules/@types/lodash/fp/remove.d.ts |    2 +
 .../node_modules/@types/lodash/fp/repeat.d.ts |    2 +
 .../@types/lodash/fp/replace.d.ts             |    2 +
 .../node_modules/@types/lodash/fp/rest.d.ts   |    2 +
 .../@types/lodash/fp/restFrom.d.ts            |    2 +
 .../node_modules/@types/lodash/fp/result.d.ts |    2 +
 .../@types/lodash/fp/reverse.d.ts             |    2 +
 .../node_modules/@types/lodash/fp/round.d.ts  |    2 +
 .../@types/lodash/fp/runInContext.d.ts        |    2 +
 .../node_modules/@types/lodash/fp/sample.d.ts |    2 +
 .../@types/lodash/fp/sampleSize.d.ts          |    2 +
 jtg js/node_modules/@types/lodash/fp/set.d.ts |    2 +
 .../@types/lodash/fp/setWith.d.ts             |    2 +
 .../@types/lodash/fp/shuffle.d.ts             |    2 +
 .../node_modules/@types/lodash/fp/size.d.ts   |    2 +
 .../node_modules/@types/lodash/fp/slice.d.ts  |    2 +
 .../@types/lodash/fp/snakeCase.d.ts           |    2 +
 .../node_modules/@types/lodash/fp/some.d.ts   |    2 +
 .../node_modules/@types/lodash/fp/sortBy.d.ts |    2 +
 .../@types/lodash/fp/sortedIndex.d.ts         |    2 +
 .../@types/lodash/fp/sortedIndexBy.d.ts       |    2 +
 .../@types/lodash/fp/sortedIndexOf.d.ts       |    2 +
 .../@types/lodash/fp/sortedLastIndex.d.ts     |    2 +
 .../@types/lodash/fp/sortedLastIndexBy.d.ts   |    2 +
 .../@types/lodash/fp/sortedLastIndexOf.d.ts   |    2 +
 .../@types/lodash/fp/sortedUniq.d.ts          |    2 +
 .../@types/lodash/fp/sortedUniqBy.d.ts        |    2 +
 .../node_modules/@types/lodash/fp/split.d.ts  |    2 +
 .../node_modules/@types/lodash/fp/spread.d.ts |    2 +
 .../@types/lodash/fp/spreadFrom.d.ts          |    2 +
 .../@types/lodash/fp/startCase.d.ts           |    2 +
 .../@types/lodash/fp/startsWith.d.ts          |    2 +
 .../@types/lodash/fp/stubArray.d.ts           |    2 +
 .../@types/lodash/fp/stubFalse.d.ts           |    2 +
 .../@types/lodash/fp/stubObject.d.ts          |    2 +
 .../@types/lodash/fp/stubString.d.ts          |    2 +
 .../@types/lodash/fp/stubTrue.d.ts            |    2 +
 .../@types/lodash/fp/subtract.d.ts            |    2 +
 jtg js/node_modules/@types/lodash/fp/sum.d.ts |    2 +
 .../node_modules/@types/lodash/fp/sumBy.d.ts  |    2 +
 .../@types/lodash/fp/symmetricDifference.d.ts |    2 +
 .../lodash/fp/symmetricDifferenceBy.d.ts      |    2 +
 .../lodash/fp/symmetricDifferenceWith.d.ts    |    2 +
 .../node_modules/@types/lodash/fp/tail.d.ts   |    2 +
 .../node_modules/@types/lodash/fp/take.d.ts   |    2 +
 .../@types/lodash/fp/takeLast.d.ts            |    2 +
 .../@types/lodash/fp/takeLastWhile.d.ts       |    2 +
 .../@types/lodash/fp/takeRight.d.ts           |    2 +
 .../@types/lodash/fp/takeRightWhile.d.ts      |    2 +
 .../@types/lodash/fp/takeWhile.d.ts           |    2 +
 jtg js/node_modules/@types/lodash/fp/tap.d.ts |    2 +
 .../@types/lodash/fp/template.d.ts            |    2 +
 .../@types/lodash/fp/throttle.d.ts            |    2 +
 .../node_modules/@types/lodash/fp/thru.d.ts   |    2 +
 .../node_modules/@types/lodash/fp/times.d.ts  |    2 +
 .../@types/lodash/fp/toArray.d.ts             |    2 +
 .../@types/lodash/fp/toFinite.d.ts            |    2 +
 .../@types/lodash/fp/toInteger.d.ts           |    2 +
 .../@types/lodash/fp/toLength.d.ts            |    2 +
 .../@types/lodash/fp/toLower.d.ts             |    2 +
 .../@types/lodash/fp/toNumber.d.ts            |    2 +
 .../@types/lodash/fp/toPairs.d.ts             |    2 +
 .../@types/lodash/fp/toPairsIn.d.ts           |    2 +
 .../node_modules/@types/lodash/fp/toPath.d.ts |    2 +
 .../@types/lodash/fp/toPlainObject.d.ts       |    2 +
 .../@types/lodash/fp/toSafeInteger.d.ts       |    2 +
 .../@types/lodash/fp/toString.d.ts            |    2 +
 .../@types/lodash/fp/toUpper.d.ts             |    2 +
 .../@types/lodash/fp/transform.d.ts           |    2 +
 .../node_modules/@types/lodash/fp/trim.d.ts   |    2 +
 .../@types/lodash/fp/trimChars.d.ts           |    2 +
 .../@types/lodash/fp/trimCharsEnd.d.ts        |    2 +
 .../@types/lodash/fp/trimCharsStart.d.ts      |    2 +
 .../@types/lodash/fp/trimEnd.d.ts             |    2 +
 .../@types/lodash/fp/trimStart.d.ts           |    2 +
 .../@types/lodash/fp/truncate.d.ts            |    2 +
 .../@types/lodash/fp/unapply.d.ts             |    2 +
 .../node_modules/@types/lodash/fp/unary.d.ts  |    2 +
 .../@types/lodash/fp/unescape.d.ts            |    2 +
 .../node_modules/@types/lodash/fp/union.d.ts  |    2 +
 .../@types/lodash/fp/unionBy.d.ts             |    2 +
 .../@types/lodash/fp/unionWith.d.ts           |    2 +
 .../node_modules/@types/lodash/fp/uniq.d.ts   |    2 +
 .../node_modules/@types/lodash/fp/uniqBy.d.ts |    2 +
 .../@types/lodash/fp/uniqWith.d.ts            |    2 +
 .../@types/lodash/fp/uniqueId.d.ts            |    2 +
 .../node_modules/@types/lodash/fp/unnest.d.ts |    2 +
 .../node_modules/@types/lodash/fp/unset.d.ts  |    2 +
 .../node_modules/@types/lodash/fp/unzip.d.ts  |    2 +
 .../@types/lodash/fp/unzipWith.d.ts           |    2 +
 .../node_modules/@types/lodash/fp/update.d.ts |    2 +
 .../@types/lodash/fp/updateWith.d.ts          |    2 +
 .../@types/lodash/fp/upperCase.d.ts           |    2 +
 .../@types/lodash/fp/upperFirst.d.ts          |    2 +
 .../@types/lodash/fp/useWith.d.ts             |    2 +
 .../node_modules/@types/lodash/fp/values.d.ts |    2 +
 .../@types/lodash/fp/valuesIn.d.ts            |    2 +
 .../node_modules/@types/lodash/fp/where.d.ts  |    2 +
 .../@types/lodash/fp/whereEq.d.ts             |    2 +
 .../@types/lodash/fp/without.d.ts             |    2 +
 .../node_modules/@types/lodash/fp/words.d.ts  |    2 +
 .../node_modules/@types/lodash/fp/wrap.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/fp/xor.d.ts |    2 +
 .../node_modules/@types/lodash/fp/xorBy.d.ts  |    2 +
 .../@types/lodash/fp/xorWith.d.ts             |    2 +
 jtg js/node_modules/@types/lodash/fp/zip.d.ts |    2 +
 .../node_modules/@types/lodash/fp/zipAll.d.ts |    2 +
 .../node_modules/@types/lodash/fp/zipObj.d.ts |    2 +
 .../@types/lodash/fp/zipObject.d.ts           |    2 +
 .../@types/lodash/fp/zipObjectDeep.d.ts       |    2 +
 .../@types/lodash/fp/zipWith.d.ts             |    2 +
 .../node_modules/@types/lodash/fromPairs.d.ts |    2 +
 .../node_modules/@types/lodash/functions.d.ts |    2 +
 .../@types/lodash/functionsIn.d.ts            |    2 +
 jtg js/node_modules/@types/lodash/get.d.ts    |    2 +
 .../node_modules/@types/lodash/groupBy.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/gt.d.ts     |    2 +
 jtg js/node_modules/@types/lodash/gte.d.ts    |    2 +
 jtg js/node_modules/@types/lodash/has.d.ts    |    2 +
 jtg js/node_modules/@types/lodash/hasIn.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/head.d.ts   |    2 +
 .../node_modules/@types/lodash/identity.d.ts  |    2 +
 .../node_modules/@types/lodash/inRange.d.ts   |    2 +
 .../node_modules/@types/lodash/includes.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/index.d.ts  |   47 +
 .../node_modules/@types/lodash/indexOf.d.ts   |    2 +
 .../node_modules/@types/lodash/initial.d.ts   |    2 +
 .../@types/lodash/intersection.d.ts           |    2 +
 .../@types/lodash/intersectionBy.d.ts         |    2 +
 .../@types/lodash/intersectionWith.d.ts       |    2 +
 jtg js/node_modules/@types/lodash/invert.d.ts |    2 +
 .../node_modules/@types/lodash/invertBy.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/invoke.d.ts |    2 +
 .../node_modules/@types/lodash/invokeMap.d.ts |    2 +
 .../@types/lodash/isArguments.d.ts            |    2 +
 .../node_modules/@types/lodash/isArray.d.ts   |    2 +
 .../@types/lodash/isArrayBuffer.d.ts          |    2 +
 .../@types/lodash/isArrayLike.d.ts            |    2 +
 .../@types/lodash/isArrayLikeObject.d.ts      |    2 +
 .../node_modules/@types/lodash/isBoolean.d.ts |    2 +
 .../node_modules/@types/lodash/isBuffer.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/isDate.d.ts |    2 +
 .../node_modules/@types/lodash/isElement.d.ts |    2 +
 .../node_modules/@types/lodash/isEmpty.d.ts   |    2 +
 .../node_modules/@types/lodash/isEqual.d.ts   |    2 +
 .../@types/lodash/isEqualWith.d.ts            |    2 +
 .../node_modules/@types/lodash/isError.d.ts   |    2 +
 .../node_modules/@types/lodash/isFinite.d.ts  |    2 +
 .../@types/lodash/isFunction.d.ts             |    2 +
 .../node_modules/@types/lodash/isInteger.d.ts |    2 +
 .../node_modules/@types/lodash/isLength.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/isMap.d.ts  |    2 +
 .../node_modules/@types/lodash/isMatch.d.ts   |    2 +
 .../@types/lodash/isMatchWith.d.ts            |    2 +
 jtg js/node_modules/@types/lodash/isNaN.d.ts  |    2 +
 .../node_modules/@types/lodash/isNative.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/isNil.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/isNull.d.ts |    2 +
 .../node_modules/@types/lodash/isNumber.d.ts  |    2 +
 .../node_modules/@types/lodash/isObject.d.ts  |    2 +
 .../@types/lodash/isObjectLike.d.ts           |    2 +
 .../@types/lodash/isPlainObject.d.ts          |    2 +
 .../node_modules/@types/lodash/isRegExp.d.ts  |    2 +
 .../@types/lodash/isSafeInteger.d.ts          |    2 +
 jtg js/node_modules/@types/lodash/isSet.d.ts  |    2 +
 .../node_modules/@types/lodash/isString.d.ts  |    2 +
 .../node_modules/@types/lodash/isSymbol.d.ts  |    2 +
 .../@types/lodash/isTypedArray.d.ts           |    2 +
 .../@types/lodash/isUndefined.d.ts            |    2 +
 .../node_modules/@types/lodash/isWeakMap.d.ts |    2 +
 .../node_modules/@types/lodash/isWeakSet.d.ts |    2 +
 .../node_modules/@types/lodash/iteratee.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/join.d.ts   |    2 +
 .../node_modules/@types/lodash/kebabCase.d.ts |    2 +
 jtg js/node_modules/@types/lodash/keyBy.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/keys.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/keysIn.d.ts |    2 +
 jtg js/node_modules/@types/lodash/last.d.ts   |    2 +
 .../@types/lodash/lastIndexOf.d.ts            |    2 +
 .../node_modules/@types/lodash/lowerCase.d.ts |    2 +
 .../@types/lodash/lowerFirst.d.ts             |    2 +
 jtg js/node_modules/@types/lodash/lt.d.ts     |    2 +
 jtg js/node_modules/@types/lodash/lte.d.ts    |    2 +
 jtg js/node_modules/@types/lodash/map.d.ts    |    2 +
 .../node_modules/@types/lodash/mapKeys.d.ts   |    2 +
 .../node_modules/@types/lodash/mapValues.d.ts |    2 +
 .../node_modules/@types/lodash/matches.d.ts   |    2 +
 .../@types/lodash/matchesProperty.d.ts        |    2 +
 jtg js/node_modules/@types/lodash/max.d.ts    |    2 +
 jtg js/node_modules/@types/lodash/maxBy.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/mean.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/meanBy.d.ts |    2 +
 .../node_modules/@types/lodash/memoize.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/merge.d.ts  |    2 +
 .../node_modules/@types/lodash/mergeWith.d.ts |    2 +
 jtg js/node_modules/@types/lodash/method.d.ts |    2 +
 .../node_modules/@types/lodash/methodOf.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/min.d.ts    |    2 +
 jtg js/node_modules/@types/lodash/minBy.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/mixin.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/negate.d.ts |    2 +
 .../@types/lodash/noConflict.d.ts             |    2 +
 jtg js/node_modules/@types/lodash/noop.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/now.d.ts    |    2 +
 jtg js/node_modules/@types/lodash/nth.d.ts    |    2 +
 jtg js/node_modules/@types/lodash/nthArg.d.ts |    2 +
 jtg js/node_modules/@types/lodash/omit.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/omitBy.d.ts |    2 +
 jtg js/node_modules/@types/lodash/once.d.ts   |    2 +
 .../node_modules/@types/lodash/orderBy.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/over.d.ts   |    2 +
 .../node_modules/@types/lodash/overArgs.d.ts  |    2 +
 .../node_modules/@types/lodash/overEvery.d.ts |    2 +
 .../node_modules/@types/lodash/overSome.d.ts  |    2 +
 .../node_modules/@types/lodash/package.json   |   84 +
 jtg js/node_modules/@types/lodash/pad.d.ts    |    2 +
 jtg js/node_modules/@types/lodash/padEnd.d.ts |    2 +
 .../node_modules/@types/lodash/padStart.d.ts  |    2 +
 .../node_modules/@types/lodash/parseInt.d.ts  |    2 +
 .../node_modules/@types/lodash/partial.d.ts   |    2 +
 .../@types/lodash/partialRight.d.ts           |    2 +
 .../node_modules/@types/lodash/partition.d.ts |    2 +
 jtg js/node_modules/@types/lodash/pick.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/pickBy.d.ts |    2 +
 .../node_modules/@types/lodash/property.d.ts  |    2 +
 .../@types/lodash/propertyOf.d.ts             |    2 +
 jtg js/node_modules/@types/lodash/pull.d.ts   |    2 +
 .../node_modules/@types/lodash/pullAll.d.ts   |    2 +
 .../node_modules/@types/lodash/pullAllBy.d.ts |    2 +
 .../@types/lodash/pullAllWith.d.ts            |    2 +
 jtg js/node_modules/@types/lodash/pullAt.d.ts |    2 +
 jtg js/node_modules/@types/lodash/random.d.ts |    2 +
 jtg js/node_modules/@types/lodash/range.d.ts  |    2 +
 .../@types/lodash/rangeRight.d.ts             |    2 +
 jtg js/node_modules/@types/lodash/rearg.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/reduce.d.ts |    2 +
 .../@types/lodash/reduceRight.d.ts            |    2 +
 jtg js/node_modules/@types/lodash/reject.d.ts |    2 +
 jtg js/node_modules/@types/lodash/remove.d.ts |    2 +
 jtg js/node_modules/@types/lodash/repeat.d.ts |    2 +
 .../node_modules/@types/lodash/replace.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/rest.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/result.d.ts |    2 +
 .../node_modules/@types/lodash/reverse.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/round.d.ts  |    2 +
 .../@types/lodash/runInContext.d.ts           |    2 +
 jtg js/node_modules/@types/lodash/sample.d.ts |    2 +
 .../@types/lodash/sampleSize.d.ts             |    2 +
 jtg js/node_modules/@types/lodash/set.d.ts    |    2 +
 .../node_modules/@types/lodash/setWith.d.ts   |    2 +
 .../node_modules/@types/lodash/shuffle.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/size.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/slice.d.ts  |    2 +
 .../node_modules/@types/lodash/snakeCase.d.ts |    2 +
 jtg js/node_modules/@types/lodash/some.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/sortBy.d.ts |    2 +
 .../@types/lodash/sortedIndex.d.ts            |    2 +
 .../@types/lodash/sortedIndexBy.d.ts          |    2 +
 .../@types/lodash/sortedIndexOf.d.ts          |    2 +
 .../@types/lodash/sortedLastIndex.d.ts        |    2 +
 .../@types/lodash/sortedLastIndexBy.d.ts      |    2 +
 .../@types/lodash/sortedLastIndexOf.d.ts      |    2 +
 .../@types/lodash/sortedUniq.d.ts             |    2 +
 .../@types/lodash/sortedUniqBy.d.ts           |    2 +
 jtg js/node_modules/@types/lodash/split.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/spread.d.ts |    2 +
 .../node_modules/@types/lodash/startCase.d.ts |    2 +
 .../@types/lodash/startsWith.d.ts             |    2 +
 .../node_modules/@types/lodash/subtract.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/sum.d.ts    |    2 +
 jtg js/node_modules/@types/lodash/sumBy.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/tail.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/take.d.ts   |    2 +
 .../node_modules/@types/lodash/takeRight.d.ts |    2 +
 .../@types/lodash/takeRightWhile.d.ts         |    2 +
 .../node_modules/@types/lodash/takeWhile.d.ts |    2 +
 jtg js/node_modules/@types/lodash/tap.d.ts    |    2 +
 .../node_modules/@types/lodash/template.d.ts  |    2 +
 .../node_modules/@types/lodash/throttle.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/thru.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/times.d.ts  |    2 +
 .../node_modules/@types/lodash/toArray.d.ts   |    2 +
 .../node_modules/@types/lodash/toFinite.d.ts  |    2 +
 .../node_modules/@types/lodash/toInteger.d.ts |    2 +
 .../node_modules/@types/lodash/toLength.d.ts  |    2 +
 .../node_modules/@types/lodash/toLower.d.ts   |    2 +
 .../node_modules/@types/lodash/toNumber.d.ts  |    2 +
 .../node_modules/@types/lodash/toPairs.d.ts   |    2 +
 .../node_modules/@types/lodash/toPairsIn.d.ts |    2 +
 jtg js/node_modules/@types/lodash/toPath.d.ts |    2 +
 .../@types/lodash/toPlainObject.d.ts          |    2 +
 .../@types/lodash/toSafeInteger.d.ts          |    2 +
 .../node_modules/@types/lodash/toString.d.ts  |    2 +
 .../node_modules/@types/lodash/toUpper.d.ts   |    2 +
 .../node_modules/@types/lodash/transform.d.ts |    2 +
 jtg js/node_modules/@types/lodash/trim.d.ts   |    2 +
 .../node_modules/@types/lodash/trimEnd.d.ts   |    2 +
 .../node_modules/@types/lodash/trimStart.d.ts |    2 +
 .../node_modules/@types/lodash/truncate.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/unary.d.ts  |    2 +
 .../node_modules/@types/lodash/unescape.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/union.d.ts  |    2 +
 .../node_modules/@types/lodash/unionBy.d.ts   |    2 +
 .../node_modules/@types/lodash/unionWith.d.ts |    2 +
 jtg js/node_modules/@types/lodash/uniq.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/uniqBy.d.ts |    2 +
 .../node_modules/@types/lodash/uniqWith.d.ts  |    2 +
 .../node_modules/@types/lodash/uniqueId.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/unset.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/unzip.d.ts  |    2 +
 .../node_modules/@types/lodash/unzipWith.d.ts |    2 +
 jtg js/node_modules/@types/lodash/update.d.ts |    2 +
 .../@types/lodash/updateWith.d.ts             |    2 +
 .../node_modules/@types/lodash/upperCase.d.ts |    2 +
 .../@types/lodash/upperFirst.d.ts             |    2 +
 jtg js/node_modules/@types/lodash/values.d.ts |    2 +
 .../node_modules/@types/lodash/valuesIn.d.ts  |    2 +
 .../node_modules/@types/lodash/without.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/words.d.ts  |    2 +
 jtg js/node_modules/@types/lodash/wrap.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/xor.d.ts    |    2 +
 jtg js/node_modules/@types/lodash/xorBy.d.ts  |    2 +
 .../node_modules/@types/lodash/xorWith.d.ts   |    2 +
 jtg js/node_modules/@types/lodash/zip.d.ts    |    2 +
 .../node_modules/@types/lodash/zipObject.d.ts |    2 +
 .../@types/lodash/zipObjectDeep.d.ts          |    2 +
 .../node_modules/@types/lodash/zipWith.d.ts   |    2 +
 jtg js/node_modules/@types/os/index.d.ts      |   77 +
 jtg js/node_modules/@types/process/index.d.ts |  172 +
 .../@types/topcam.gencom/index.d.ts           | 1434 +++++
 .../@types/topcam.ikm6/index.d.ts             |  141 +
 .../@types/topcam.scriptfunc/index.d.ts       |   77 +
 .../@types/topsin.crypto/index.d.ts           |  105 +
 .../@types/topsin.database/index.d.ts         |  619 +++
 .../@types/topsin.gengui/index.d.ts           |  343 ++
 .../@types/topsin.genmath/index.d.ts          |  451 ++
 .../@types/topsin.socket/index.d.ts           |  343 ++
 test/ATS_AIM_customer_data_analysis.js        |   57 +-
 test/ATS_AIM_input_data copy.js               |  331 ++
 test/ATS_AIM_input_data.js                    |  412 +-
 test/ATS_AIM_input_data_v3_0.js               |   65 +-
 test/ATS_AIM_layer_rename_v_2_0.js            |   51 +-
 test/CAM_Analysis_job.js                      |    3 +
 test/mytest.js                                |  484 +-
 732 files changed, 30476 insertions(+), 1041 deletions(-)
 create mode 100644 config1.js
 create mode 100644 config2.js
 create mode 100644 jtg js/JTG_NET_set_drill_attribute_aim.js
 create mode 100644 jtg js/JTG_ORG_backup_layers_aim.js
 create mode 100644 jtg js/JTG_ORG_create_outline_aim.js
 create mode 100644 jtg js/JTG_ORG_delete_profile_aim.js
 create mode 100644 jtg js/JTG_ORG_input_data_aim.js
 create mode 100644 jtg js/JTG_ORG_set_origin_aim.js
 create mode 100644 jtg js/JTG_PUB_auto_save_job_aim.js
 create mode 100644 jtg js/JTG_PUB_copy_step_aim.js
 create mode 100644 jtg js/node_modules/@types/console/index.d.ts
 create mode 100644 jtg js/node_modules/@types/events/index.d.ts
 create mode 100644 jtg js/node_modules/@types/fs/index.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/LICENSE
 create mode 100644 jtg js/node_modules/@types/lodash/README.md
 create mode 100644 jtg js/node_modules/@types/lodash/add.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/after.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/ary.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/assign.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/assignIn.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/assignInWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/assignWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/at.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/attempt.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/before.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/bind.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/bindAll.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/bindKey.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/camelCase.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/capitalize.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/castArray.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/ceil.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/chain.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/chunk.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/clamp.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/clone.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/cloneDeep.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/cloneDeepWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/cloneWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/common/array.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/common/collection.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/common/common.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/common/date.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/common/function.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/common/lang.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/common/math.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/common/number.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/common/object.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/common/seq.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/common/string.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/common/util.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/compact.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/concat.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/cond.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/conformsTo.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/constant.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/countBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/create.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/curry.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/curryRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/debounce.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/deburr.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/defaultTo.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/defaults.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/defaultsDeep.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/defer.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/delay.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/difference.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/differenceBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/differenceWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/divide.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/drop.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/dropRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/dropRightWhile.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/dropWhile.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/each.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/eachRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/endsWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/entries.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/entriesIn.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/eq.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/escape.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/escapeRegExp.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/every.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/extend.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/extendWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fill.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/filter.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/find.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/findIndex.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/findKey.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/findLast.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/findLastIndex.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/findLastKey.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/first.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/flatMap.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/flatMapDeep.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/flatMapDepth.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/flatten.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/flattenDeep.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/flattenDepth.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/flip.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/floor.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/flow.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/flowRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/forEach.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/forEachRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/forIn.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/forInRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/forOwn.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/forOwnRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/F.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/T.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/__.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/add.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/after.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/all.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/allPass.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/always.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/any.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/anyPass.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/apply.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/ary.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/assign.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/assignAll.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/assignAllWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/assignIn.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/assignInAll.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/assignInAllWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/assignInWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/assignWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/assoc.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/assocPath.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/at.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/attempt.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/before.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/bind.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/bindAll.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/bindKey.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/camelCase.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/capitalize.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/castArray.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/ceil.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/chunk.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/clamp.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/clone.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/cloneDeep.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/cloneDeepWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/cloneWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/compact.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/complement.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/compose.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/concat.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/cond.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/conforms.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/conformsTo.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/constant.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/contains.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/convert.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/countBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/create.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/curry.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/curryN.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/curryRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/curryRightN.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/debounce.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/deburr.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/defaultTo.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/defaults.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/defaultsAll.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/defaultsDeep.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/defaultsDeepAll.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/defer.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/delay.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/difference.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/differenceBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/differenceWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/dissoc.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/dissocPath.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/divide.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/drop.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/dropLast.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/dropLastWhile.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/dropRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/dropRightWhile.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/dropWhile.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/each.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/eachRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/endsWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/entries.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/entriesIn.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/eq.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/equals.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/escape.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/escapeRegExp.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/every.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/extend.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/extendAll.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/extendAllWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/extendWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/fill.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/filter.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/find.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/findFrom.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/findIndex.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/findIndexFrom.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/findKey.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/findLast.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/findLastFrom.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/findLastIndex.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/findLastIndexFrom.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/findLastKey.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/first.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/flatMap.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/flatMapDeep.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/flatMapDepth.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/flatten.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/flattenDeep.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/flattenDepth.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/flip.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/floor.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/flow.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/flowRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/forEach.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/forEachRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/forIn.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/forInRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/forOwn.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/forOwnRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/fromPairs.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/functions.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/functionsIn.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/get.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/getOr.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/groupBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/gt.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/gte.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/has.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/hasIn.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/head.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/identical.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/identity.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/inRange.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/includes.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/includesFrom.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/indexBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/indexOf.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/indexOfFrom.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/init.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/initial.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/intersection.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/intersectionBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/intersectionWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/invert.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/invertBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/invertObj.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/invoke.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/invokeArgs.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/invokeArgsMap.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/invokeMap.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isArguments.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isArray.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isArrayBuffer.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isArrayLike.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isArrayLikeObject.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isBoolean.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isBuffer.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isDate.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isElement.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isEmpty.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isEqual.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isEqualWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isError.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isFinite.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isFunction.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isInteger.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isLength.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isMap.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isMatch.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isMatchWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isNaN.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isNative.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isNil.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isNull.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isNumber.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isObject.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isObjectLike.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isPlainObject.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isRegExp.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isSafeInteger.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isSet.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isString.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isSymbol.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isTypedArray.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isUndefined.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isWeakMap.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/isWeakSet.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/iteratee.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/join.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/juxt.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/kebabCase.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/keyBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/keys.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/keysIn.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/last.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/lastIndexOf.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/lastIndexOfFrom.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/lowerCase.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/lowerFirst.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/lt.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/lte.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/map.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/mapKeys.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/mapValues.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/matches.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/matchesProperty.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/max.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/maxBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/mean.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/meanBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/memoize.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/merge.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/mergeAll.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/mergeAllWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/mergeWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/method.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/methodOf.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/min.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/minBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/multiply.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/nAry.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/negate.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/noConflict.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/noop.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/now.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/nth.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/nthArg.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/omit.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/omitAll.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/omitBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/once.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/orderBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/over.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/overArgs.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/overEvery.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/overSome.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/pad.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/padChars.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/padCharsEnd.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/padCharsStart.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/padEnd.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/padStart.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/parseInt.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/partial.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/partialRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/partition.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/path.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/pathEq.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/pathOr.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/paths.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/pick.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/pickAll.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/pickBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/pipe.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/placeholder.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/pluck.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/prop.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/propEq.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/propOr.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/property.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/propertyOf.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/props.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/pull.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/pullAll.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/pullAllBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/pullAllWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/pullAt.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/random.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/range.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/rangeRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/rangeStep.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/rangeStepRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/rearg.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/reduce.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/reduceRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/reject.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/remove.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/repeat.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/replace.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/rest.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/restFrom.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/result.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/reverse.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/round.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/runInContext.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/sample.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/sampleSize.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/set.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/setWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/shuffle.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/size.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/slice.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/snakeCase.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/some.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/sortBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/sortedIndex.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/sortedIndexBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/sortedIndexOf.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/sortedLastIndex.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/sortedLastIndexBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/sortedLastIndexOf.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/sortedUniq.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/sortedUniqBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/split.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/spread.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/spreadFrom.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/startCase.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/startsWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/stubArray.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/stubFalse.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/stubObject.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/stubString.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/stubTrue.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/subtract.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/sum.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/sumBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/symmetricDifference.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/symmetricDifferenceBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/symmetricDifferenceWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/tail.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/take.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/takeLast.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/takeLastWhile.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/takeRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/takeRightWhile.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/takeWhile.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/tap.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/template.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/throttle.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/thru.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/times.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/toArray.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/toFinite.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/toInteger.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/toLength.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/toLower.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/toNumber.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/toPairs.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/toPairsIn.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/toPath.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/toPlainObject.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/toSafeInteger.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/toString.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/toUpper.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/transform.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/trim.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/trimChars.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/trimCharsEnd.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/trimCharsStart.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/trimEnd.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/trimStart.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/truncate.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/unapply.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/unary.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/unescape.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/union.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/unionBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/unionWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/uniq.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/uniqBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/uniqWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/uniqueId.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/unnest.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/unset.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/unzip.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/unzipWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/update.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/updateWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/upperCase.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/upperFirst.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/useWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/values.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/valuesIn.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/where.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/whereEq.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/without.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/words.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/wrap.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/xor.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/xorBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/xorWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/zip.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/zipAll.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/zipObj.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/zipObject.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/zipObjectDeep.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fp/zipWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/fromPairs.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/functions.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/functionsIn.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/get.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/groupBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/gt.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/gte.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/has.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/hasIn.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/head.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/identity.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/inRange.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/includes.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/index.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/indexOf.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/initial.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/intersection.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/intersectionBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/intersectionWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/invert.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/invertBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/invoke.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/invokeMap.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isArguments.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isArray.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isArrayBuffer.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isArrayLike.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isArrayLikeObject.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isBoolean.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isBuffer.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isDate.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isElement.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isEmpty.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isEqual.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isEqualWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isError.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isFinite.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isFunction.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isInteger.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isLength.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isMap.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isMatch.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isMatchWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isNaN.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isNative.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isNil.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isNull.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isNumber.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isObject.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isObjectLike.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isPlainObject.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isRegExp.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isSafeInteger.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isSet.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isString.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isSymbol.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isTypedArray.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isUndefined.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isWeakMap.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/isWeakSet.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/iteratee.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/join.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/kebabCase.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/keyBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/keys.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/keysIn.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/last.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/lastIndexOf.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/lowerCase.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/lowerFirst.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/lt.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/lte.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/map.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/mapKeys.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/mapValues.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/matches.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/matchesProperty.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/max.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/maxBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/mean.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/meanBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/memoize.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/merge.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/mergeWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/method.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/methodOf.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/min.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/minBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/mixin.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/negate.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/noConflict.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/noop.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/now.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/nth.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/nthArg.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/omit.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/omitBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/once.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/orderBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/over.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/overArgs.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/overEvery.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/overSome.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/package.json
 create mode 100644 jtg js/node_modules/@types/lodash/pad.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/padEnd.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/padStart.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/parseInt.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/partial.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/partialRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/partition.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/pick.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/pickBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/property.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/propertyOf.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/pull.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/pullAll.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/pullAllBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/pullAllWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/pullAt.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/random.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/range.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/rangeRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/rearg.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/reduce.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/reduceRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/reject.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/remove.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/repeat.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/replace.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/rest.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/result.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/reverse.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/round.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/runInContext.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/sample.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/sampleSize.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/set.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/setWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/shuffle.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/size.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/slice.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/snakeCase.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/some.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/sortBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/sortedIndex.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/sortedIndexBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/sortedIndexOf.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/sortedLastIndex.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/sortedLastIndexBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/sortedLastIndexOf.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/sortedUniq.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/sortedUniqBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/split.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/spread.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/startCase.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/startsWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/subtract.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/sum.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/sumBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/tail.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/take.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/takeRight.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/takeRightWhile.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/takeWhile.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/tap.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/template.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/throttle.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/thru.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/times.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/toArray.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/toFinite.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/toInteger.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/toLength.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/toLower.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/toNumber.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/toPairs.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/toPairsIn.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/toPath.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/toPlainObject.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/toSafeInteger.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/toString.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/toUpper.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/transform.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/trim.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/trimEnd.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/trimStart.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/truncate.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/unary.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/unescape.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/union.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/unionBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/unionWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/uniq.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/uniqBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/uniqWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/uniqueId.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/unset.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/unzip.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/unzipWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/update.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/updateWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/upperCase.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/upperFirst.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/values.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/valuesIn.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/without.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/words.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/wrap.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/xor.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/xorBy.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/xorWith.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/zip.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/zipObject.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/zipObjectDeep.d.ts
 create mode 100644 jtg js/node_modules/@types/lodash/zipWith.d.ts
 create mode 100644 jtg js/node_modules/@types/os/index.d.ts
 create mode 100644 jtg js/node_modules/@types/process/index.d.ts
 create mode 100644 jtg js/node_modules/@types/topcam.gencom/index.d.ts
 create mode 100644 jtg js/node_modules/@types/topcam.ikm6/index.d.ts
 create mode 100644 jtg js/node_modules/@types/topcam.scriptfunc/index.d.ts
 create mode 100644 jtg js/node_modules/@types/topsin.crypto/index.d.ts
 create mode 100644 jtg js/node_modules/@types/topsin.database/index.d.ts
 create mode 100644 jtg js/node_modules/@types/topsin.gengui/index.d.ts
 create mode 100644 jtg js/node_modules/@types/topsin.genmath/index.d.ts
 create mode 100644 jtg js/node_modules/@types/topsin.socket/index.d.ts
 create mode 100644 test/ATS_AIM_input_data copy.js
 create mode 100644 test/CAM_Analysis_job.js

diff --git a/config.js b/config.js
index ffb6043..cd13665 100644
--- a/config.js
+++ b/config.js
@@ -6,7 +6,27 @@ var config = {
 			"arrStep": "stp",
 			"isMerge": "yes"
 		 },
-		"Gerber274x_1": {
+		"Gerber274x_1": {  // cust1
+			"nf1": 3,
+			"nf2": 4,
+			"units": "mm",
+			"zeroes": "leading",
+			"decimal": "no",
+			"nf_comp": 0,
+			"break_sr": "yes",
+			"data_type": "ascii",
+			"separator": "*",
+			"threshold": 200,
+			"drill_only": "no",
+			"multiplier": 1,
+			"resolution": 3,
+			"tool_units": "inch",
+			"coordinates": "absolute",
+			"merge_by_rule": "no",
+			"signed_coords": "no",
+			"text_line_width": 0.0024
+		},
+		"Gerber274x_2": {   // cust2
 			"nf1": 3,
 			"nf2": 5,
 			"units": "inch",
@@ -26,7 +46,483 @@ var config = {
 			"signed_coords": "no",
 			"text_line_width": 0.0024
 		},
-		"Gerber274x_2": {
+		"Excellon1_1":{   // cust1
+			"nf1": 3,
+			"nf2": 0,
+			"units": "mm",
+			"zeroes": "leading",
+			"decimal": "yes",
+			"nf_comp": 0,
+			"break_sr": "yes",
+			"data_type": "ascii",
+			"separator": "nl",
+			"threshold": 200,
+			"drill_only": "no",
+			"multiplier": 1,
+			"resolution": 3,
+			"tool_units": "mm",
+			"coordinates": "absolute",
+			"merge_by_rule": "no",
+			"signed_coords": "no",
+			"text_line_width": 0.0024
+		},
+		"Excellon2_1": {   // cust2
+			"nf1": 3,
+			"nf2": 5,
+			"units": "mm",
+			"zeroes": "leading",
+			"decimal": "no",
+			"nf_comp": 0,
+			"break_sr": "yes",
+			"data_type": "ascii",
+			"separator": "nl",
+			"threshold": 200,
+			"drill_only": "no",
+			"multiplier": 1,
+			"resolution": 3,
+			"tool_units": "mm",
+			"coordinates": "absolute",
+			"merge_by_rule": "no",
+			"signed_coords": "no",
+			"text_line_width": 0.0024
+		},
+		"Excellon2_2": {
+			"nf1": 2,
+			"nf2": 3,
+			"units": "inch",
+			"zeroes": "leading",
+			"decimal": "no",
+			"nf_comp": 0,
+			"break_sr": "yes",
+			"data_type": "ascii",
+			"separator": "nl",
+			"threshold": 200,
+			"drill_only": "no",
+			"multiplier": 1,
+			"resolution": 3,
+			"tool_units": "inch",
+			"coordinates": "absolute",
+			"merge_by_rule": "no",
+			"signed_coords": "no",
+			"text_line_width": 0.0024
+		},
+		"Excellon2_3": {  // cust2
+			"nf1": 2,
+			"nf2": 5,
+			"units": "inch",
+			"zeroes": "trailing",
+			"decimal": "no",
+			"nf_comp": 0,
+			"break_sr": "yes",
+			"data_type": "ascii",
+			"separator": "nl",
+			"threshold": 200,
+			"drill_only": "no",
+			"multiplier": 1,
+			"resolution": 3,
+			"tool_units": "mm",
+			"coordinates": "absolute",
+			"merge_by_rule": "no",
+			"signed_coords": "no",
+			"text_line_width": 0.0024
+		},
+		"IPC356_1": {   // cust2
+			"nf1": 2,
+			"nf2": 4,
+			"units": "inch",
+			"zeroes": "none",
+			"decimal": "no",
+			"nf_comp": 0,
+			"break_sr": "yes",
+			"data_type": "ascii",
+			"separator": "*",
+			"threshold": 200,
+			"drill_only": "no",
+			"multiplier": 1,
+			"resolution": 3,
+			"tool_units": "inch",
+			"coordinates": "absolute",
+			"merge_by_rule": "no",
+			"signed_coords": "no",
+			"text_line_width": 0.0024
+		}
+	},
+	"customer": {
+		"Customer_1": {
+			"path": "C:/Users/Administrator/Desktop/Customer_1",
+			"db": "genesis",
+			"step": "cad",
+			"rules": [
+				{ 
+					"valid": function(props){
+						var file = props.file;
+						var job = props.job;
+						var reg = new RegExp("^"+job+"-a","ig")
+						return /.+\.tgz$/ig.test(file.name) && reg.test(file.baseName)
+					}, 
+					"type": "ODB",		
+					"format": "ODB_1"
+				},
+				{ 
+					"valid": function(props){
+						var file = props.file;
+						var job = props.job;
+						return /.+\.tgz$/ig.test(file.name) && job == file.baseName
+					}, 
+					"type": "ODB",		
+					"format": "ODB"
+				},
+				{
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.drd$/ig.test(file.name)
+					},  
+					"type": "Excellon1",		
+					"format": "Excellon1_1"
+				},
+				{
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.phd$/ig.test(file.name)
+					},  
+					"type": "Gerber274x",		
+					"format": "Gerber274x_1"
+				}
+			],
+			"tl_name": [
+				{"orig_name" : "^spt$", "tl_name" : "spt" },
+				{"orig_name" : "^smt$", "tl_name" : "smt" },
+				{"orig_name" : "^smb$", "tl_name" : "smb" },
+				{"orig_name" : "^spb$", "tl_name" : "spb" },
+				{"orig_name" : "^ssb$", "tl_name" : "ssb" },
+				{"orig_name" : "^sst$", "tl_name" : "sst" },
+				{"orig_name" : "^top$", "tl_name" : "top" },
+				{"orig_name" : "^drill$", "tl_name" : "drill" },
+				{"orig_name" : "^rout$", "tl_name" : "rout" },
+				{"orig_name" : "^bottom$", "tl_name" : "bottom" },
+				{"orig_name" : ["^isl(\\d+)$","^layer_(\\d+)$"], "tl_name" : "l_($1)"},
+				{"orig_name" : ["_isl(\\d+)_isl(\\d+)","d(\\d+)-(\\d+)"], "tl_name" : "d_($1)-($2)"},
+				{"orig_name" : ["_top_isl(\\d+)"], "tl_name" : "d_1-($1)"},
+				{"orig_name" : ["_isl(\\d+)_bottom"], "tl_name" : "d_($1)-($1+1)"}
+			]
+		},
+		"Customer_2": {
+			"path": "C:/Users/Administrator/Desktop/Customer_2",
+			"db": "genesis",
+			"step": "cad",
+			"rules": [
+				{ 
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.tgz$/ig.test(file.name)
+					}, 
+					"type": "ODB",		
+					"format": "ODB"
+				},
+				{
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.ipc$/ig.test(file.name)
+					},  
+					"type": "IPC356",		
+					"format": "IPC356_1"
+				},
+				{
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.rou$/ig.test(file.name)
+					},  
+					"type": "Excellon2",		
+					"format": "Excellon2_3"
+				},
+				{
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.art$/ig.test(file.name)
+					},  
+					"type": "Gerber274x",		
+					"format": "Gerber274x_2",
+					"format_params": function(props){
+						var params = props.params
+						if(params.art_param){
+							var leading = params.art_param["SUPPRESS_LEAD_ZEROES"]
+							var trailing = params.art_param["SUPPRESS_TRAIL_ZEROES"]
+							var zeroes = "none"
+							if(/yes/ig.test(leading)){
+								zeroes = "leading"
+							}
+							if(/yes/ig.test(trailing)){
+								zeroes = "trailing"
+							}
+							var nf1,nf2
+							if(params.art_param.hasOwnProperty("FORMAT")){
+								var tmp = params.art_param["FORMAT"].split(".")
+								if(/\d+/ig.test(tmp[0])){nf1 = Number(tmp[0])}
+								if(/\d+/ig.test(tmp[1])){nf2 = Number(tmp[1])}
+							}
+							return {
+								"nf1": nf1 || 3,
+								"nf2": nf2 || 5,
+								"units": /METRIC|MM/ig.test(params.art_param["OUTPUT_UNITS"])? "mm" :"inch",
+								"zeroes": zeroes,
+								"decimal": "no",
+								"nf_comp": 0,
+								"break_sr": "yes",
+								"data_type": "ascii",
+								"separator": "*",
+								"threshold": 200,
+								"drill_only": "no",
+								"multiplier": 1,
+								"resolution": 3,
+								"tool_units": /METRIC|MM/ig.test(params.art_param["OUTPUT_UNITS"])? "mm" :"inch",
+								"coordinates": "absolute",
+								"merge_by_rule": "no",
+								"signed_coords": "no",
+								"text_line_width": 0.0024
+							}
+						}
+					}
+				},
+				{
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.drl$/ig.test(file.name)
+					},  
+					"type": "Excellon2",		
+					"format": "Excellon2_1",
+					"format_params": function(props){
+						var params = props.params
+						if(params.nc_param){
+							var leading = params.nc_param["SUPPRESS_LEAD_ZEROES"]
+							var trailing = params.nc_param["SUPPRESS_TRAIL_ZEROES"]
+							var zeroes = "none"
+							if(/yes/ig.test(leading)){
+								zeroes = "leading"
+							}
+							if(/yes/ig.test(trailing)){
+								zeroes = "trailing"
+							}
+							return {
+								"nf1": params.nc_param["INTEGER_PLACES"]? Number(params.nc_param["INTEGER_PLACES"]) : 3,
+								"nf2": params.nc_param["DECIMAL_PLACES"]? Number(params.nc_param["DECIMAL_PLACES"]) : 5,
+								"units": /METRIC|MM/ig.test(params.nc_param["OUTPUT_UNITS"])? "mm" :"inch",
+								"zeroes": zeroes,
+								"decimal": "no",
+								"nf_comp": 0,
+								"break_sr": "yes",
+								"data_type": "ascii",
+								"separator": "nl",
+								"threshold": 200,
+								"drill_only": "no",
+								"multiplier": 1,
+								"resolution": 3,
+								"tool_units": /METRIC|MM/ig.test(params.nc_param["OUTPUT_UNITS"])? "mm" :"inch",
+								"coordinates": params.nc_param["COORDINATES"]? params.nc_param["COORDINATES"].toLowerCase() :"absolute",
+								"merge_by_rule": "no",
+								"signed_coords": "no",
+								"text_line_width": 0.0024
+							}
+						}
+					}
+				}
+			],
+			"tl_name": [
+				{"orig_name" : ["assytop.art","past_top"], "tl_name" : "past_top" },
+				{"orig_name" : ["assybot.art","past_botm"], "tl_name" : "past_botm" },
+				{"orig_name" : ["pleg.art","silk_top"], "tl_name" : "silk_top" },
+				{"orig_name" : ["sleg.art","silk_bot"], "tl_name" : "silk_bot" },
+				{"orig_name" : ["ssm.art","sm_top"], "tl_name" : "sm_top" },
+				{"orig_name" : ["psm.art","sm_bot"], "tl_name" : "sm_botm" },
+				{"orig_name" : ["^top$","^top.art$"], "tl_name" : "top" },
+				{"orig_name" : ["^0(\\d+).*ccp_ms","^s(\\d+)\.art","lay(\\d+)\\.art","layer_(\\d+)"], "tl_name" : "l_($1)"},
+				{"orig_name" : ["^bottom$","^bottom.art$"], "tl_name" : "bottom" },
+				{"orig_name" : ["-(\\d+)-(\\d+)\.drl$","(\\d+)-(\\d+)-laser\.drl$","d(\\d+)-(\\d+)"], "tl_name" : "d_($1)-($2)"},
+				{"orig_name" : ["\\.rou$","rout"], "tl_name" : "rout" },
+				{"orig_name" : "fab.art", "tl_name" : "fab.art" },
+				{"orig_name" : ["multipack.art","^array$"], "tl_name" : "array" },
+				{"orig_name" : ["outline.art","^outline$"], "tl_name" : "outline" },
+				{"orig_name" : "top-enig", "tl_name" : "top-enig" },
+				{"orig_name" : "bot-enig", "tl_name" : "bot-enig" },
+				{"orig_name" : "fab_page2", "tl_name" : "fab_page2" },
+			]
+		},
+		"New_data": {
+			"path": "C:/Users/Administrator/Desktop/New data",
+			"db": "genesis",
+			"step": "cad",
+			"rules": [
+				{ 
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.tgz$/ig.test(file.name)
+					}, 
+					"type": "ODB",		
+					"format": "ODB"
+				},
+				{
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.art$/ig.test(file.name)
+					},  
+					"type": "Gerber274x",		
+					"format": "Gerber274x_2",
+					"format_params": function(props){
+						var params = props.params
+						if(params.art_param){
+							var leading = params.art_param["SUPPRESS_LEAD_ZEROES"]
+							var trailing = params.art_param["SUPPRESS_TRAIL_ZEROES"]
+							var zeroes = "none"
+							if(/yes/ig.test(leading)){
+								zeroes = "leading"
+							}
+							if(/yes/ig.test(trailing)){
+								zeroes = "trailing"
+							}
+							var nf1,nf2
+							if(params.art_param.hasOwnProperty("FORMAT")){
+								var tmp = params.art_param["FORMAT"].split(".")
+								if(/\d+/ig.test(tmp[0])){nf1 = Number(tmp[0])}
+								if(/\d+/ig.test(tmp[1])){nf2 = Number(tmp[1])}
+							}
+							return {
+								"nf1": nf1 || 3,
+								"nf2": nf2 || 5,
+								"units": /METRIC|MM/ig.test(params.art_param["OUTPUT_UNITS"])? "mm" :"inch",
+								"zeroes": zeroes,
+								"decimal": "no",
+								"nf_comp": 0,
+								"break_sr": "yes",
+								"data_type": "ascii",
+								"separator": "*",
+								"threshold": 200,
+								"drill_only": "no",
+								"multiplier": 1,
+								"resolution": 3,
+								"tool_units": /METRIC|MM/ig.test(params.art_param["OUTPUT_UNITS"])? "mm" :"inch",
+								"coordinates": "absolute",
+								"merge_by_rule": "no",
+								"signed_coords": "no",
+								"text_line_width": 0.0024
+							}
+						}
+					}
+				},
+				{
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.drl$/ig.test(file.name)
+					},  
+					"type": "Excellon2",		
+					"format": "Excellon2_1",
+					"format_params": function(props){
+						var params = props.params
+						if(params.nc_param){
+							var leading = params.nc_param["SUPPRESS_LEAD_ZEROES"]
+							var trailing = params.nc_param["SUPPRESS_TRAIL_ZEROES"]
+							var zeroes = "none"
+							if(/yes/ig.test(leading)){
+								zeroes = "leading"
+							}
+							if(/yes/ig.test(trailing)){
+								zeroes = "trailing"
+							}
+							return {
+								"nf1": params.nc_param["INTEGER_PLACES"]? Number(params.nc_param["INTEGER_PLACES"]) : 3,
+								"nf2": params.nc_param["DECIMAL_PLACES"]? Number(params.nc_param["DECIMAL_PLACES"]) : 5,
+								"units": /METRIC|MM/ig.test(params.nc_param["OUTPUT_UNITS"])? "mm" :"inch",
+								"zeroes": zeroes,
+								"decimal": "no",
+								"nf_comp": 0,
+								"break_sr": "yes",
+								"data_type": "ascii",
+								"separator": "nl",
+								"threshold": 200,
+								"drill_only": "no",
+								"multiplier": 1,
+								"resolution": 3,
+								"tool_units": /METRIC|MM/ig.test(params.nc_param["OUTPUT_UNITS"])? "mm" :"inch",
+								"coordinates": params.nc_param["COORDINATES"]? params.nc_param["COORDINATES"].toLowerCase() :"absolute",
+								"merge_by_rule": "no",
+								"signed_coords": "no",
+								"text_line_width": 0.0024
+							}
+						}
+					}
+				}
+			],
+			"tl_name": [
+				{"orig_name" : "pasttop.art", "tl_name" : "past_top" },
+				{"orig_name" : "pleg.art", "tl_name" : "silk_top" },
+				{"orig_name" : "soldtop.art", "tl_name" : "sm_top" },
+				{"orig_name" : ["top.art","^top$"], "tl_name" : "top" },
+				{"orig_name" : ["art(\\d+)\\.art","layer_(\\d+)"], "tl_name" : "l_($1)"},
+				{"orig_name" : ["bottom.art","^bottom$"], "tl_name" : "bottom" },
+				{"orig_name" : "soldbotm.art", "tl_name" : "sm_botm" },
+				{"orig_name" : "sleg.art", "tl_name" : "silk_bot" },
+				{"orig_name" : "pastbotm.art", "tl_name" : "past_botm" },
+				{"orig_name" : "multipack.art", "tl_name" : "array" },
+				{"orig_name" : "outline.art", "tl_name" : "outline" },
+				{"orig_name" : "fab.art", "tl_name" : "fab" },
+				{"orig_name" : "top-enig", "tl_name" : "top-enig" },
+				{"orig_name" : "bot-enig", "tl_name" : "bot-enig" },
+				{"orig_name" : "fab_page2", "tl_name" : "fab_page2" },
+				{"orig_name" : ["(\\d+)-(\\d+)$","d(\\d+)-(\\d+)"], "tl_name" : "d_($1)-($2)"}
+			]
+		}
+	},
+	"data_format": [
+		{"tl_name":"past_top" , "new_name":"past_top" , "attr":{ "context":"board", "type":"solder_paste" }},
+		{"tl_name":"silk_top" , "new_name":"silk_top" , "attr":{ "context":"board", "type":"solder_paste" }},
+		{"tl_name":"sm_top" , "new_name":"sm_top" , "attr":{ "context":"board", "type":"solder_mask" }},
+		{"tl_name":"^top$" , "new_name":"top" , "attr":{ "context":"board", "type":"signal" }},
+		{"tl_name":"l_(\\d+)","new_name":"layer_($1)" ,"attr":{"context":"board","type":"signal"}},
+		{"tl_name":"^bottom$","new_name":"bottom" ,"attr":{"context":"board","type":"signal"}},
+		{"tl_name":"sm_botm" , "new_name":"sm_botm" , "attr":{ "context":"board", "type":"solder_mask" }},
+		{"tl_name":"silk_bot" , "new_name":"silk_bot" , "attr":{ "context":"board", "type":"solder_paste" }},
+		{"tl_name":"past_botm" , "new_name":"past_botm" , "attr":{ "context":"board", "type":"solder_paste" }},
+		{"tl_name":"d_(\\d+)-(\\d+)","new_name":"d($1)-($2)" ,"attr":{"context":"board","type":"drill"}},
+		{"tl_name":"drill","new_name":"drill" ,"attr":{"context":"board","type":"drill"}},
+		{"tl_name":"rout","new_name":"rout" ,"attr":{"context":"board","type":"rout"}},
+		{"tl_name":"array","new_name":"array" ,"attr":{"context":"misc"}},
+		{"tl_name":"outline","new_name":"outline" ,"attr":{"context":"misc"}},
+		{"tl_name":"fab.art","new_name":"fab.art" ,"attr":{"context":"misc"}}
+	],
+	"delSameJob": "yes"
+}
+
+module.exports = config
+
+
+/*
+(function(){return {
+	"formats": {
+		"ODB": {},
+		"ODB_1": { 
+			"comments": "", 
+			"arrStep": "stp",
+			"isMerge": "yes"
+		 },
+		"Gerber274x_1": {  // cust1
+			"nf1": 3,
+			"nf2": 4,
+			"units": "mm",
+			"zeroes": "leading",
+			"decimal": "no",
+			"nf_comp": 0,
+			"break_sr": "yes",
+			"data_type": "ascii",
+			"separator": "*",
+			"threshold": 200,
+			"drill_only": "no",
+			"multiplier": 1,
+			"resolution": 3,
+			"tool_units": "inch",
+			"coordinates": "absolute",
+			"merge_by_rule": "no",
+			"signed_coords": "no",
+			"text_line_width": 0.0024
+		},
+		"Gerber274x_2": {   // cust2
 			"nf1": 3,
 			"nf2": 5,
 			"units": "inch",
@@ -46,7 +542,27 @@ var config = {
 			"signed_coords": "no",
 			"text_line_width": 0.0024
 		},
-		"Excellon2_1": {
+		"Excellon1_1":{   // cust1
+			"nf1": 3,
+			"nf2": 0,
+			"units": "mm",
+			"zeroes": "leading",
+			"decimal": "yes",
+			"nf_comp": 0,
+			"break_sr": "yes",
+			"data_type": "ascii",
+			"separator": "nl",
+			"threshold": 200,
+			"drill_only": "no",
+			"multiplier": 1,
+			"resolution": 3,
+			"tool_units": "mm",
+			"coordinates": "absolute",
+			"merge_by_rule": "no",
+			"signed_coords": "no",
+			"text_line_width": 0.0024
+		},
+		"Excellon2_1": {   // cust2
 			"nf1": 3,
 			"nf2": 5,
 			"units": "mm",
@@ -86,7 +602,7 @@ var config = {
 			"signed_coords": "no",
 			"text_line_width": 0.0024
 		},
-		"Excellon2_3": {
+		"Excellon2_3": {  // cust2
 			"nf1": 2,
 			"nf2": 5,
 			"units": "inch",
@@ -106,7 +622,7 @@ var config = {
 			"signed_coords": "no",
 			"text_line_width": 0.0024
 		},
-		"IPC356_1": {
+		"IPC356_1": {   // cust2
 			"nf1": 2,
 			"nf2": 4,
 			"units": "inch",
@@ -128,6 +644,64 @@ var config = {
 		}
 	},
 	"customer": {
+		"Customer_1": {
+			"path": "C:/Users/Administrator/Desktop/Customer_1",
+			"db": "genesis",
+			"step": "cad",
+			"rules": [
+				{ 
+					"valid": function(props){
+						var file = props.file;
+						var job = props.job;
+						var reg = new RegExp("^"+job+"-a","ig")
+						return /.+\.tgz$/ig.test(file.name) && reg.test(file.baseName)
+					}, 
+					"type": "ODB",		
+					"format": "ODB_1"
+				},
+				{ 
+					"valid": function(props){
+						var file = props.file;
+						var job = props.job;
+						return /.+\.tgz$/ig.test(file.name) && job == file.baseName
+					}, 
+					"type": "ODB",		
+					"format": "ODB"
+				},
+				{
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.drd$/ig.test(file.name)
+					},  
+					"type": "Excellon1",		
+					"format": "Excellon1_1"
+				},
+				{
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.phd$/ig.test(file.name)
+					},  
+					"type": "Gerber274x",		
+					"format": "Gerber274x_1"
+				}
+			],
+			"tl_name": [
+				{"orig_name" : "^spt$", "tl_name" : "spt" },
+				{"orig_name" : "^smt$", "tl_name" : "smt" },
+				{"orig_name" : "^smb$", "tl_name" : "smb" },
+				{"orig_name" : "^spb$", "tl_name" : "spb" },
+				{"orig_name" : "^ssb$", "tl_name" : "ssb" },
+				{"orig_name" : "^sst$", "tl_name" : "sst" },
+				{"orig_name" : "^top$", "tl_name" : "top" },
+				{"orig_name" : "^drill$", "tl_name" : "drill" },
+				{"orig_name" : "^rout$", "tl_name" : "rout" },
+				{"orig_name" : "^bottom$", "tl_name" : "bottom" },
+				{"orig_name" : ["^isl(\\d+)$","^layer_(\\d+)$"], "tl_name" : "l_($1)"},
+				{"orig_name" : ["_isl(\\d+)_isl(\\d+)","d(\\d+)-(\\d+)"], "tl_name" : "d_($1)-($2)"},
+				{"orig_name" : ["_top_isl(\\d+)"], "tl_name" : "d_1-($1)"},
+				{"orig_name" : ["_isl(\\d+)_bottom"], "tl_name" : "d_($1)-($1+1)"}
+			]
+		},
 		"Customer_2": {
 			"path": "C:/Users/Administrator/Desktop/Customer_2",
 			"db": "genesis",
@@ -163,7 +737,47 @@ var config = {
 						return /.+\.art$/ig.test(file.name)
 					},  
 					"type": "Gerber274x",		
-					"format": "Gerber274x_1"
+					"format": "Gerber274x_2",
+					"format_params": function(props){
+						var params = props.params
+						if(params.art_param){
+							var leading = params.art_param["SUPPRESS_LEAD_ZEROES"]
+							var trailing = params.art_param["SUPPRESS_TRAIL_ZEROES"]
+							var zeroes = "none"
+							if(/yes/ig.test(leading)){
+								zeroes = "leading"
+							}
+							if(/yes/ig.test(trailing)){
+								zeroes = "trailing"
+							}
+							var nf1,nf2
+							if(params.art_param.hasOwnProperty("FORMAT")){
+								var tmp = params.art_param["FORMAT"].split(".")
+								if(/\d+/ig.test(tmp[0])){nf1 = Number(tmp[0])}
+								if(/\d+/ig.test(tmp[1])){nf2 = Number(tmp[1])}
+							}
+							return {
+								"nf1": nf1 || 3,
+								"nf2": nf2 || 5,
+								"units": /METRIC|MM/ig.test(params.art_param["OUTPUT_UNITS"])? "mm" :"inch",
+								"zeroes": zeroes,
+								"decimal": "no",
+								"nf_comp": 0,
+								"break_sr": "yes",
+								"data_type": "ascii",
+								"separator": "*",
+								"threshold": 200,
+								"drill_only": "no",
+								"multiplier": 1,
+								"resolution": 3,
+								"tool_units": /METRIC|MM/ig.test(params.art_param["OUTPUT_UNITS"])? "mm" :"inch",
+								"coordinates": "absolute",
+								"merge_by_rule": "no",
+								"signed_coords": "no",
+								"text_line_width": 0.0024
+							}
+						}
+					}
 				},
 				{
 					"valid": function(props){
@@ -187,7 +801,7 @@ var config = {
 							return {
 								"nf1": params.nc_param["INTEGER_PLACES"]? Number(params.nc_param["INTEGER_PLACES"]) : 3,
 								"nf2": params.nc_param["DECIMAL_PLACES"]? Number(params.nc_param["DECIMAL_PLACES"]) : 5,
-								"units": /METRIC/ig.test(params.nc_param["OUTPUT_UNITS"])? "mm" :"inch",
+								"units": /METRIC|MM/ig.test(params.nc_param["OUTPUT_UNITS"])? "mm" :"inch",
 								"zeroes": zeroes,
 								"decimal": "no",
 								"nf_comp": 0,
@@ -198,7 +812,7 @@ var config = {
 								"drill_only": "no",
 								"multiplier": 1,
 								"resolution": 3,
-								"tool_units": /METRIC/ig.test(params.nc_param["OUTPUT_UNITS"])? "mm" :"inch",
+								"tool_units": /METRIC|MM/ig.test(params.nc_param["OUTPUT_UNITS"])? "mm" :"inch",
 								"coordinates": params.nc_param["COORDINATES"]? params.nc_param["COORDINATES"].toLowerCase() :"absolute",
 								"merge_by_rule": "no",
 								"signed_coords": "no",
@@ -212,9 +826,9 @@ var config = {
 				{"orig_name" : "pasttop.art", "tl_name" : "past_top" },
 				{"orig_name" : "pleg.art", "tl_name" : "silk_top" },
 				{"orig_name" : "soldtop.art", "tl_name" : "sm_top" },
-				{"orig_name" : "top.art", "tl_name" : "top" },
-				{"orig_name" : "lay(\\d+)\\.art", "tl_name" : "l_($1)"},
-				{"orig_name" : "bottom.art", "tl_name" : "bottom" },
+				{"orig_name" : ["top.art","^top$"], "tl_name" : "top" },
+				{"orig_name" : ["lay(\\d+)\\.art","layer_(\\d+)"], "tl_name" : "l_($1)"},
+				{"orig_name" : ["bottom.art","^bottom$"], "tl_name" : "bottom" },
 				{"orig_name" : "soldbotm.art", "tl_name" : "sm_botm" },
 				{"orig_name" : "sleg.art", "tl_name" : "silk_bot" },
 				{"orig_name" : "pastbotm.art", "tl_name" : "past_botm" },
@@ -224,54 +838,13 @@ var config = {
 				{"orig_name" : "top-enig", "tl_name" : "top-enig" },
 				{"orig_name" : "bot-enig", "tl_name" : "bot-enig" },
 				{"orig_name" : "fab_page2", "tl_name" : "fab_page2" },
-				{"orig_name" : ["-(\\d+)-(\\d+)\.drl","(\\d+)-(\\d+)-laser\.drl"], "tl_name" : "d_($1)-($2)"}
-			]
-		},
-		"Customer_1": {
-			"path": "C:/Users/Administrator/Desktop/Customer_1",
-			"db": "genesis",
-			"step": "cad",
-			"rules": [
-				{ 
-					"valid": function(props){
-						var file = props.file;
-						var job = props.job;
-						var reg = new RegExp("^"+job+"-a","ig")
-						return /.+\.tgz$/ig.test(file.name) && reg.test(file.baseName)
-					}, 
-					"type": "ODB",		
-					"format": "ODB_1"
-				},
-				{ 
-					"valid": function(props){
-						var file = props.file;
-						return /.+\.tgz$/ig.test(file.name)
-					}, 
-					"type": "ODB",		
-					"format": "ODB"
-				},
-				{
-					"valid": function(props){
-						var file = props.file;
-						return /.+\.art$/ig.test(file.name)
-					},  
-					"type": "Gerber274x",		
-					"format": "Gerber274x_1"
-				},
-				{
-					"valid": function(props){
-						var file = props.file;
-						return /.+\.drl$/ig.test(file.name)
-					},  
-					"type": "Excellon2",		
-					"format": "Excellon2_1"
-				}
+				{"orig_name" : ["-(\\d+)-(\\d+)\.drl","(\\d+)-(\\d+)-laser\.drl","d(\\d+)-(\\d+)"], "tl_name" : "d_($1)-($2)"}
 			]
 		},
 		"New_data": {
 			"path": "C:/Users/Administrator/Desktop/New data",
 			"db": "genesis",
-			"step": "pcs",
+			"step": "cad",
 			"rules": [
 				{ 
 					"valid": function(props){
@@ -287,7 +860,47 @@ var config = {
 						return /.+\.art$/ig.test(file.name)
 					},  
 					"type": "Gerber274x",		
-					"format": "Gerber274x_1"
+					"format": "Gerber274x_2",
+					"format_params": function(props){
+						var params = props.params
+						if(params.art_param){
+							var leading = params.art_param["SUPPRESS_LEAD_ZEROES"]
+							var trailing = params.art_param["SUPPRESS_TRAIL_ZEROES"]
+							var zeroes = "none"
+							if(/yes/ig.test(leading)){
+								zeroes = "leading"
+							}
+							if(/yes/ig.test(trailing)){
+								zeroes = "trailing"
+							}
+							var nf1,nf2
+							if(params.art_param.hasOwnProperty("FORMAT")){
+								var tmp = params.art_param["FORMAT"].split(".")
+								if(/\d+/ig.test(tmp[0])){nf1 = Number(tmp[0])}
+								if(/\d+/ig.test(tmp[1])){nf2 = Number(tmp[1])}
+							}
+							return {
+								"nf1": nf1 || 3,
+								"nf2": nf2 || 5,
+								"units": /METRIC|MM/ig.test(params.art_param["OUTPUT_UNITS"])? "mm" :"inch",
+								"zeroes": zeroes,
+								"decimal": "no",
+								"nf_comp": 0,
+								"break_sr": "yes",
+								"data_type": "ascii",
+								"separator": "*",
+								"threshold": 200,
+								"drill_only": "no",
+								"multiplier": 1,
+								"resolution": 3,
+								"tool_units": /METRIC|MM/ig.test(params.art_param["OUTPUT_UNITS"])? "mm" :"inch",
+								"coordinates": "absolute",
+								"merge_by_rule": "no",
+								"signed_coords": "no",
+								"text_line_width": 0.0024
+							}
+						}
+					}
 				},
 				{
 					"valid": function(props){
@@ -295,8 +908,60 @@ var config = {
 						return /.+\.drl$/ig.test(file.name)
 					},  
 					"type": "Excellon2",		
-					"format": "Excellon2_2"
+					"format": "Excellon2_1",
+					"format_params": function(props){
+						var params = props.params
+						if(params.nc_param){
+							var leading = params.nc_param["SUPPRESS_LEAD_ZEROES"]
+							var trailing = params.nc_param["SUPPRESS_TRAIL_ZEROES"]
+							var zeroes = "none"
+							if(/yes/ig.test(leading)){
+								zeroes = "leading"
+							}
+							if(/yes/ig.test(trailing)){
+								zeroes = "trailing"
+							}
+							return {
+								"nf1": params.nc_param["INTEGER_PLACES"]? Number(params.nc_param["INTEGER_PLACES"]) : 3,
+								"nf2": params.nc_param["DECIMAL_PLACES"]? Number(params.nc_param["DECIMAL_PLACES"]) : 5,
+								"units": /METRIC|MM/ig.test(params.nc_param["OUTPUT_UNITS"])? "mm" :"inch",
+								"zeroes": zeroes,
+								"decimal": "no",
+								"nf_comp": 0,
+								"break_sr": "yes",
+								"data_type": "ascii",
+								"separator": "nl",
+								"threshold": 200,
+								"drill_only": "no",
+								"multiplier": 1,
+								"resolution": 3,
+								"tool_units": /METRIC|MM/ig.test(params.nc_param["OUTPUT_UNITS"])? "mm" :"inch",
+								"coordinates": params.nc_param["COORDINATES"]? params.nc_param["COORDINATES"].toLowerCase() :"absolute",
+								"merge_by_rule": "no",
+								"signed_coords": "no",
+								"text_line_width": 0.0024
+							}
+						}
+					}
 				}
+			],
+			"tl_name": [
+				{"orig_name" : "pasttop.art", "tl_name" : "past_top" },
+				{"orig_name" : "pleg.art", "tl_name" : "silk_top" },
+				{"orig_name" : "soldtop.art", "tl_name" : "sm_top" },
+				{"orig_name" : ["top.art","^top$"], "tl_name" : "top" },
+				{"orig_name" : ["art(\\d+)\\.art","layer_(\\d+)"], "tl_name" : "l_($1)"},
+				{"orig_name" : ["bottom.art","^bottom$"], "tl_name" : "bottom" },
+				{"orig_name" : "soldbotm.art", "tl_name" : "sm_botm" },
+				{"orig_name" : "sleg.art", "tl_name" : "silk_bot" },
+				{"orig_name" : "pastbotm.art", "tl_name" : "past_botm" },
+				{"orig_name" : "multipack.art", "tl_name" : "array" },
+				{"orig_name" : "outline.art", "tl_name" : "outline" },
+				{"orig_name" : "fab.art", "tl_name" : "fab" },
+				{"orig_name" : "top-enig", "tl_name" : "top-enig" },
+				{"orig_name" : "bot-enig", "tl_name" : "bot-enig" },
+				{"orig_name" : "fab_page2", "tl_name" : "fab_page2" },
+				{"orig_name" : ["(\\d+)-(\\d+)$","d(\\d+)-(\\d+)"], "tl_name" : "d_($1)-($2)"}
 			]
 		}
 	},
@@ -309,319 +974,6 @@ var config = {
 		{"tl_name":"rout","new_name":"rout" ,"attr":{"context":"board","type":"rout"}}
 	],
 	"delSameJob": "yes"
-}
-
-module.exports = config
-
-
-/*
-
-(function(){
-	return {
-		"formats": {
-			"ODB": {},
-			"ODB_1": { 
-				"comments": "", 
-				"arrStep": "stp",
-				"isMerge": "yes"
-			 },
-			"Gerber274x_1": {
-				"nf1": 3,
-				"nf2": 5,
-				"units": "inch",
-				"zeroes": "leading",
-				"decimal": "no",
-				"nf_comp": 0,
-				"break_sr": "yes",
-				"data_type": "ascii",
-				"separator": "*",
-				"threshold": 200,
-				"drill_only": "no",
-				"multiplier": 1,
-				"resolution": 3,
-				"tool_units": "inch",
-				"coordinates": "absolute",
-				"merge_by_rule": "no",
-				"signed_coords": "no",
-				"text_line_width": 0.0024
-			},
-			"Gerber274x_2": {
-				"nf1": 3,
-				"nf2": 5,
-				"units": "inch",
-				"zeroes": "leading",
-				"decimal": "no",
-				"nf_comp": 0,
-				"break_sr": "yes",
-				"data_type": "ascii",
-				"separator": "*",
-				"threshold": 200,
-				"drill_only": "no",
-				"multiplier": 1,
-				"resolution": 3,
-				"tool_units": "inch",
-				"coordinates": "absolute",
-				"merge_by_rule": "no",
-				"signed_coords": "no",
-				"text_line_width": 0.0024
-			},
-			"Excellon2_1": {
-				"nf1": 3,
-				"nf2": 5,
-				"units": "mm",
-				"zeroes": "leading",
-				"decimal": "no",
-				"nf_comp": 0,
-				"break_sr": "yes",
-				"data_type": "ascii",
-				"separator": "nl",
-				"threshold": 200,
-				"drill_only": "no",
-				"multiplier": 1,
-				"resolution": 3,
-				"tool_units": "mm",
-				"coordinates": "absolute",
-				"merge_by_rule": "no",
-				"signed_coords": "no",
-				"text_line_width": 0.0024
-			},
-			"Excellon2_2": {
-				"nf1": 2,
-				"nf2": 3,
-				"units": "inch",
-				"zeroes": "leading",
-				"decimal": "no",
-				"nf_comp": 0,
-				"break_sr": "yes",
-				"data_type": "ascii",
-				"separator": "nl",
-				"threshold": 200,
-				"drill_only": "no",
-				"multiplier": 1,
-				"resolution": 3,
-				"tool_units": "inch",
-				"coordinates": "absolute",
-				"merge_by_rule": "no",
-				"signed_coords": "no",
-				"text_line_width": 0.0024
-			},
-			"Excellon2_3": {
-				"nf1": 2,
-				"nf2": 5,
-				"units": "inch",
-				"zeroes": "trailing",
-				"decimal": "no",
-				"nf_comp": 0,
-				"break_sr": "yes",
-				"data_type": "ascii",
-				"separator": "nl",
-				"threshold": 200,
-				"drill_only": "no",
-				"multiplier": 1,
-				"resolution": 3,
-				"tool_units": "mm",
-				"coordinates": "absolute",
-				"merge_by_rule": "no",
-				"signed_coords": "no",
-				"text_line_width": 0.0024
-			},
-			"IPC356_1": {
-				"nf1": 2,
-				"nf2": 4,
-				"units": "inch",
-				"zeroes": "none",
-				"decimal": "no",
-				"nf_comp": 0,
-				"break_sr": "yes",
-				"data_type": "ascii",
-				"separator": "*",
-				"threshold": 200,
-				"drill_only": "no",
-				"multiplier": 1,
-				"resolution": 3,
-				"tool_units": "inch",
-				"coordinates": "absolute",
-				"merge_by_rule": "no",
-				"signed_coords": "no",
-				"text_line_width": 0.0024
-			}
-		},
-		"customer": {
-			"Customer_2": {
-				"path": "C:/Users/Administrator/Desktop/Customer_2",
-				"db": "genesis",
-				"step": "cad",
-				"rules": [
-					{ 
-						"valid": function(props){
-							var file = props.file;
-							return /.+\.tgz$/ig.test(file.name)
-						}, 
-						"type": "ODB",		
-						"format": "ODB"
-					},
-					{
-						"valid": function(props){
-							var file = props.file;
-							return /.+\.ipc$/ig.test(file.name)
-						},  
-						"type": "IPC356",		
-						"format": "IPC356_1"
-					},
-					{
-						"valid": function(props){
-							var file = props.file;
-							return /.+\.rou$/ig.test(file.name)
-						},  
-						"type": "Excellon2",		
-						"format": "Excellon2_3"
-					},
-					{
-						"valid": function(props){
-							var file = props.file;
-							return /.+\.art$/ig.test(file.name)
-						},  
-						"type": "Gerber274x",		
-						"format": "Gerber274x_1"
-					},
-					{
-						"valid": function(props){
-							var file = props.file;
-							return /.+\.drl$/ig.test(file.name)
-						},  
-						"type": "Excellon2",		
-						"format": "Excellon2_1",
-						"format_params": function(props){
-							var params = props.params
-							if(params.nc_param){
-								var leading = params.nc_param["SUPPRESS_LEAD_ZEROES"]
-								var trailing = params.nc_param["SUPPRESS_TRAIL_ZEROES"]
-								var zeroes = "none"
-								if(/yes/ig.test(leading)){
-									zeroes = "leading"
-								}
-								if(/yes/ig.test(trailing)){
-									zeroes = "trailing"
-								}
-								return {
-									"nf1": params.nc_param["INTEGER_PLACES"]? Number(params.nc_param["INTEGER_PLACES"]) : 3,
-									"nf2": params.nc_param["DECIMAL_PLACES"]? Number(params.nc_param["DECIMAL_PLACES"]) : 5,
-									"units": /METRIC/ig.test(params.nc_param["OUTPUT_UNITS"])? "mm" :"inch",
-									"zeroes": zeroes,
-									"decimal": "no",
-									"nf_comp": 0,
-									"break_sr": "yes",
-									"data_type": "ascii",
-									"separator": "nl",
-									"threshold": 200,
-									"drill_only": "no",
-									"multiplier": 1,
-									"resolution": 3,
-									"tool_units": /METRIC/ig.test(params.nc_param["OUTPUT_UNITS"])? "mm" :"inch",
-									"coordinates": params.nc_param["COORDINATES"]? params.nc_param["COORDINATES"].toLowerCase() :"absolute",
-									"merge_by_rule": "no",
-									"signed_coords": "no",
-									"text_line_width": 0.0024
-								}
-							}
-						}
-					}
-				],
-				"tlname": [
-					{"orig_name" : "pasttop.art", "tlname" : "past_top" },
-					{"orig_name" : "pleg.art", "tlname" : "silk_top" },
-					{"orig_name" : "soldtop.art", "tlname" : "sm_top" },
-					{"orig_name" : "art(\\d+)\\.art", "tlname" : "layer_(1)"},
-					{"orig_name" : "soldbotm.art", "tlname" : "sm_botm" },
-					{"orig_name" : "sleg.art", "tlname" : "silk_bot" },
-					{"orig_name" : "pastbotm.art", "tlname" : "past_botm" },
-					{"orig_name" : "multipack.art", "tlname" : "array" },
-					{"orig_name" : "outline.art", "tlname" : "outline" },
-					{"orig_name" : "fab.art", "tlname" : "fab.art" },
-					{"orig_name" : "top-enig", "tlname" : "top-enig" },
-					{"orig_name" : "bot-enig", "tlname" : "bot-enig" },
-					{"orig_name" : "fab_page2", "tlname" : "fab_page2" }
-				]
-			},
-			"Customer_1": {
-				"path": "C:/Users/Administrator/Desktop/Customer_1",
-				"db": "genesis",
-				"step": "cad",
-				"rules": [
-					{ 
-						"valid": function(props){
-							var file = props.file;
-							var job = props.job;
-							var reg = new RegExp("^"+job+"-a","ig")
-							return /.+\.tgz$/ig.test(file.name) && reg.test(file.baseName)
-						}, 
-						"type": "ODB",		
-						"format": "ODB_1"
-					},
-					{ 
-						"valid": function(props){
-							var file = props.file;
-							return /.+\.tgz$/ig.test(file.name)
-						}, 
-						"type": "ODB",		
-						"format": "ODB"
-					},
-					{
-						"valid": function(props){
-							var file = props.file;
-							return /.+\.art$/ig.test(file.name)
-						},  
-						"type": "Gerber274x",		
-						"format": "Gerber274x_1"
-					},
-					{
-						"valid": function(props){
-							var file = props.file;
-							return /.+\.drl$/ig.test(file.name)
-						},  
-						"type": "Excellon2",		
-						"format": "Excellon2_1"
-					}
-				]
-			},
-			"New_data": {
-				"path": "C:/Users/Administrator/Desktop/New data",
-				"db": "genesis",
-				"step": "pcs",
-				"rules": [
-					{ 
-						"valid": function(props){
-							var file = props.file;
-							return /.+\.tgz$/ig.test(file.name)
-						}, 
-						"type": "ODB",		
-						"format": "ODB"
-					},
-					{
-						"valid": function(props){
-							var file = props.file;
-							return /.+\.art$/ig.test(file.name)
-						},  
-						"type": "Gerber274x",		
-						"format": "Gerber274x_1"
-					},
-					{
-						"valid": function(props){
-							var file = props.file;
-							return /.+\.drl$/ig.test(file.name)
-						},  
-						"type": "Excellon2",		
-						"format": "Excellon2_2"
-					}
-				]
-			}
-		},
-		"sort_rename": [
-			{"tlname":"" , "newname":""   }  
-		],
-		"delSameJob": "yes"
-	}
-})()
-
+}})()
 
 */
\ No newline at end of file
diff --git a/config1.js b/config1.js
new file mode 100644
index 0000000..df3b105
--- /dev/null
+++ b/config1.js
@@ -0,0 +1,194 @@
+var config = {
+	"formats": {
+		"ODB": {},
+		"ODB_1": { 
+			"comments": "", 
+			"arrStep": "stp",
+			"isMerge": "yes"
+		 },
+		"Gerber274x_1": {
+			"nf1": 2,
+			"nf2": 5,
+			"units": "inch",
+			"zeroes": "leading",
+			"decimal": "no",
+			"nf_comp": 0,
+			"break_sr": "yes",
+			"data_type": "ascii",
+			"separator": "*",
+			"threshold": 200,
+			"drill_only": "no",
+			"multiplier": 1,
+			"resolution": 3,
+			"tool_units": "inch",
+			"coordinates": "absolute",
+			"merge_by_rule": "no",
+			"signed_coords": "no",
+			"text_line_width": 0.0024
+		},
+		"Gerber274x_2": {
+			"nf1": 3,
+			"nf2": 5,
+			"units": "inch",
+			"zeroes": "leading",
+			"decimal": "no",
+			"nf_comp": 0,
+			"break_sr": "yes",
+			"data_type": "ascii",
+			"separator": "*",
+			"threshold": 200,
+			"drill_only": "no",
+			"multiplier": 1,
+			"resolution": 3,
+			"tool_units": "inch",
+			"coordinates": "absolute",
+			"merge_by_rule": "no",
+			"signed_coords": "no",
+			"text_line_width": 0.0024
+		},
+		"Excellon2_1": {
+			"nf1": 3,
+			"nf2": 5,
+			"units": "mm",
+			"zeroes": "leading",
+			"decimal": "no",
+			"nf_comp": 0,
+			"break_sr": "yes",
+			"data_type": "ascii",
+			"separator": "nl",
+			"threshold": 200,
+			"drill_only": "no",
+			"multiplier": 1,
+			"resolution": 3,
+			"tool_units": "mm",
+			"coordinates": "absolute",
+			"merge_by_rule": "no",
+			"signed_coords": "no",
+			"text_line_width": 0.0024
+		},
+		"Excellon2_2": {
+			"nf1": 2,
+			"nf2": 5,
+			"units": "inch",
+			"zeroes": "none",
+			"decimal": "no",
+			"nf_comp": 0,
+			"break_sr": "yes",
+			"data_type": "ascii",
+			"separator": "nl",
+			"threshold": 200,
+			"drill_only": "no",
+			"multiplier": 1,
+			"resolution": 3,
+			"tool_units": "inch",
+			"coordinates": "absolute",
+			"merge_by_rule": "no",
+			"signed_coords": "no",
+			"text_line_width": 0.0024
+		},
+		"Excellon2_3": {
+			"nf1": 2,
+			"nf2": 5,
+			"units": "inch",
+			"zeroes": "trailing",
+			"decimal": "no",
+			"nf_comp": 0,
+			"break_sr": "yes",
+			"data_type": "ascii",
+			"separator": "nl",
+			"threshold": 200,
+			"drill_only": "no",
+			"multiplier": 1,
+			"resolution": 3,
+			"tool_units": "mm",
+			"coordinates": "absolute",
+			"merge_by_rule": "no",
+			"signed_coords": "no",
+			"text_line_width": 0.0024
+		},
+		"IPC356_1": {
+			"nf1": 2,
+			"nf2": 4,
+			"units": "inch",
+			"zeroes": "none",
+			"decimal": "no",
+			"nf_comp": 0,
+			"break_sr": "yes",
+			"data_type": "ascii",
+			"separator": "*",
+			"threshold": 200,
+			"drill_only": "no",
+			"multiplier": 1,
+			"resolution": 3,
+			"tool_units": "inch",
+			"coordinates": "absolute",
+			"merge_by_rule": "no",
+			"signed_coords": "no",
+			"text_line_width": 0.0024
+		}
+	},
+	"customer": {
+		"New_data": {
+			"path": "C:/Users/Administrator/Desktop/New data",
+			"db": "genesis",
+			"step": "pcs",
+			"rules": [
+				{ 
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.tgz$/ig.test(file.name)
+					}, 
+					"type": "ODB",		
+					"format": "ODB"
+				},
+				{
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.art$/ig.test(file.name)
+					},  
+					"type": "Gerber274x",		
+					"format": "Gerber274x_1"
+				},
+				{
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.drl$/ig.test(file.name)
+					},  
+					"type": "Excellon2",		
+					"format": "Excellon2_2"
+				}
+			],
+			"tl_name": [
+				{"orig_name" : "pasttop.art", "tl_name" : "past_top" },
+				{"orig_name" : "pleg.art", "tl_name" : "silk_top" },
+				{"orig_name" : "soldtop.art", "tl_name" : "sm_top" },
+				{"orig_name" : ["top.art","^top$"], "tl_name" : "top" },
+				{"orig_name" : ["art(\\d+)\\.art","layer_(\\d+)"], "tl_name" : "l_($1)"},
+				{"orig_name" : ["bottom.art","^bottom$"], "tl_name" : "bottom" },
+				{"orig_name" : "soldbotm.art", "tl_name" : "sm_botm" },
+				{"orig_name" : "sleg.art", "tl_name" : "silk_bot" },
+				{"orig_name" : "pastbotm.art", "tl_name" : "past_botm" },
+				{"orig_name" : "multipack.art", "tl_name" : "array" },
+				{"orig_name" : "outline.art", "tl_name" : "outline" },
+				{"orig_name" : "fab.art", "tl_name" : "fab" },
+				{"orig_name" : "top-enig", "tl_name" : "top-enig" },
+				{"orig_name" : "bot-enig", "tl_name" : "bot-enig" },
+				{"orig_name" : "fab_page2", "tl_name" : "fab_page2" },
+				{"orig_name" : ["(\\d+)-(\\d+)$","d(\\d+)-(\\d+)"], "tl_name" : "d_($1)-($2)"}
+			]
+		}
+	},
+	"data_format": [
+		{"tl_name":"^top$" , "new_name":"top" , "attr":{ "context":"board", "type":"signal" }},   // new_name 里支持特殊变量
+		{"tl_name":"l_(\\d+)","new_name":"layer_($1)" ,"attr":{"context":"board","type":"signal"}},
+		{"tl_name":"^bottom$","new_name":"bottom" ,"attr":{"context":"board","type":"signal"}},
+		{"tl_name":"d_(\\d+)-(\\d+)","new_name":"d($1)-($2)" ,"attr":{"context":"board","type":"drill"}},
+		{"tl_name":"drill","new_name":"drill" ,"attr":{"context":"board","type":"drill"}},
+		{"tl_name":"rout","new_name":"rout" ,"attr":{"context":"board","type":"rout"}}
+	],
+	"merge_drill": {},
+	"delSameJob": "yes"
+}
+
+module.exports = config
+
diff --git a/config2.js b/config2.js
new file mode 100644
index 0000000..560624d
--- /dev/null
+++ b/config2.js
@@ -0,0 +1,306 @@
+var config = {
+	"formats": {
+		"ODB": {},
+		"ODB_1": { 
+			"comments": "", 
+			"arrStep": "stp",
+			"isMerge": "yes"
+		 },
+		"Gerber274x_1": {
+			"nf1": 3,
+			"nf2": 5,
+			"units": "inch",
+			"zeroes": "leading",
+			"decimal": "no",
+			"nf_comp": 0,
+			"break_sr": "yes",
+			"data_type": "ascii",
+			"separator": "*",
+			"threshold": 200,
+			"drill_only": "no",
+			"multiplier": 1,
+			"resolution": 3,
+			"tool_units": "inch",
+			"coordinates": "absolute",
+			"merge_by_rule": "no",
+			"signed_coords": "no",
+			"text_line_width": 0.0024
+		},
+		"Gerber274x_2": {
+			"nf1": 3,
+			"nf2": 5,
+			"units": "inch",
+			"zeroes": "leading",
+			"decimal": "no",
+			"nf_comp": 0,
+			"break_sr": "yes",
+			"data_type": "ascii",
+			"separator": "*",
+			"threshold": 200,
+			"drill_only": "no",
+			"multiplier": 1,
+			"resolution": 3,
+			"tool_units": "inch",
+			"coordinates": "absolute",
+			"merge_by_rule": "no",
+			"signed_coords": "no",
+			"text_line_width": 0.0024
+		},
+		"Excellon2_1": {
+			"nf1": 3,
+			"nf2": 5,
+			"units": "mm",
+			"zeroes": "leading",
+			"decimal": "no",
+			"nf_comp": 0,
+			"break_sr": "yes",
+			"data_type": "ascii",
+			"separator": "nl",
+			"threshold": 200,
+			"drill_only": "no",
+			"multiplier": 1,
+			"resolution": 3,
+			"tool_units": "mm",
+			"coordinates": "absolute",
+			"merge_by_rule": "no",
+			"signed_coords": "no",
+			"text_line_width": 0.0024
+		},
+		"Excellon2_2": {
+			"nf1": 2,
+			"nf2": 3,
+			"units": "inch",
+			"zeroes": "leading",
+			"decimal": "no",
+			"nf_comp": 0,
+			"break_sr": "yes",
+			"data_type": "ascii",
+			"separator": "nl",
+			"threshold": 200,
+			"drill_only": "no",
+			"multiplier": 1,
+			"resolution": 3,
+			"tool_units": "inch",
+			"coordinates": "absolute",
+			"merge_by_rule": "no",
+			"signed_coords": "no",
+			"text_line_width": 0.0024
+		},
+		"Excellon2_3": {
+			"nf1": 2,
+			"nf2": 5,
+			"units": "inch",
+			"zeroes": "trailing",
+			"decimal": "no",
+			"nf_comp": 0,
+			"break_sr": "yes",
+			"data_type": "ascii",
+			"separator": "nl",
+			"threshold": 200,
+			"drill_only": "no",
+			"multiplier": 1,
+			"resolution": 3,
+			"tool_units": "mm",
+			"coordinates": "absolute",
+			"merge_by_rule": "no",
+			"signed_coords": "no",
+			"text_line_width": 0.0024
+		},
+		"IPC356_1": {
+			"nf1": 2,
+			"nf2": 4,
+			"units": "inch",
+			"zeroes": "none",
+			"decimal": "no",
+			"nf_comp": 0,
+			"break_sr": "yes",
+			"data_type": "ascii",
+			"separator": "*",
+			"threshold": 200,
+			"drill_only": "no",
+			"multiplier": 1,
+			"resolution": 3,
+			"tool_units": "inch",
+			"coordinates": "absolute",
+			"merge_by_rule": "no",
+			"signed_coords": "no",
+			"text_line_width": 0.0024
+		}
+	},
+	"customer": {
+		"Customer_2": {
+			"path": "C:/Users/Administrator/Desktop/Customer_2",
+			"db": "genesis",
+			"step": "cad",
+			"rules": [
+				{ 
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.tgz$/ig.test(file.name)
+					}, 
+					"type": "ODB",		
+					"format": "ODB"
+				},
+				{
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.ipc$/ig.test(file.name)
+					},  
+					"type": "IPC356",		
+					"format": "IPC356_1"
+				},
+				{
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.rou$/ig.test(file.name)
+					},  
+					"type": "Excellon2",		
+					"format": "Excellon2_3"
+				},
+				{
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.art$/ig.test(file.name)
+					},  
+					"type": "Gerber274x",		
+					"format": "Gerber274x_1"
+				},
+				{
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.drl$/ig.test(file.name)
+					},  
+					"type": "Excellon2",		
+					"format": "Excellon2_1",
+					"format_params": function(props){
+						var params = props.params
+						if(params.nc_param){
+							var leading = params.nc_param["SUPPRESS_LEAD_ZEROES"]
+							var trailing = params.nc_param["SUPPRESS_TRAIL_ZEROES"]
+							var zeroes = "none"
+							if(/yes/ig.test(leading)){
+								zeroes = "leading"
+							}
+							if(/yes/ig.test(trailing)){
+								zeroes = "trailing"
+							}
+							return {
+								"nf1": params.nc_param["INTEGER_PLACES"]? Number(params.nc_param["INTEGER_PLACES"]) : 3,
+								"nf2": params.nc_param["DECIMAL_PLACES"]? Number(params.nc_param["DECIMAL_PLACES"]) : 5,
+								"units": /METRIC/ig.test(params.nc_param["OUTPUT_UNITS"])? "mm" :"inch",
+								"zeroes": zeroes,
+								"decimal": "no",
+								"nf_comp": 0,
+								"break_sr": "yes",
+								"data_type": "ascii",
+								"separator": "nl",
+								"threshold": 200,
+								"drill_only": "no",
+								"multiplier": 1,
+								"resolution": 3,
+								"tool_units": /METRIC/ig.test(params.nc_param["OUTPUT_UNITS"])? "mm" :"inch",
+								"coordinates": params.nc_param["COORDINATES"]? params.nc_param["COORDINATES"].toLowerCase() :"absolute",
+								"merge_by_rule": "no",
+								"signed_coords": "no",
+								"text_line_width": 0.0024
+							}
+						}
+					}
+				}
+			],
+			"tl_name": [
+				{"orig_name" : "pasttop.art", "tl_name" : "past_top" },
+				{"orig_name" : "pleg.art", "tl_name" : "silk_top" },
+				{"orig_name" : "soldtop.art", "tl_name" : "sm_top" },
+				{"orig_name" : ["top.art","^top$"], "tl_name" : "top" },
+				{"orig_name" : ["lay(\\d+)\\.art","layer_(\\d+)"], "tl_name" : "l_($1)"},
+				{"orig_name" : ["bottom.art","^bottom$"], "tl_name" : "bottom" },
+				{"orig_name" : "soldbotm.art", "tl_name" : "sm_botm" },
+				{"orig_name" : "sleg.art", "tl_name" : "silk_bot" },
+				{"orig_name" : "pastbotm.art", "tl_name" : "past_botm" },
+				{"orig_name" : "multipack.art", "tl_name" : "array" },
+				{"orig_name" : "outline.art", "tl_name" : "outline" },
+				{"orig_name" : "fab.art", "tl_name" : "fab" },
+				{"orig_name" : "top-enig", "tl_name" : "top-enig" },
+				{"orig_name" : "bot-enig", "tl_name" : "bot-enig" },
+				{"orig_name" : "fab_page2", "tl_name" : "fab_page2" },
+				{"orig_name" : ["-(\\d+)-(\\d+)\.drl","(\\d+)-(\\d+)-laser\.drl","d(\\d+)-(\\d+)"], "tl_name" : "d_($1)-($2)"}
+			]
+		},
+		"Customer_1": {
+			"path": "C:/Users/Administrator/Desktop/Customer_1",
+			"db": "genesis",
+			"step": "cad",
+			"rules": [
+				{ 
+					"valid": function(props){
+						var file = props.file;
+						var job = props.job;
+						var reg = new RegExp("^"+job+"-a","ig")
+						return /.+\.tgz$/ig.test(file.name) && reg.test(file.baseName)
+					}, 
+					"type": "ODB",		
+					"format": "ODB_1"
+				},
+				{ 
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.tgz$/ig.test(file.name)
+					}, 
+					"type": "ODB",		
+					"format": "ODB"
+				},
+				{
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.art$/ig.test(file.name)
+					},  
+					"type": "Gerber274x",		
+					"format": "Gerber274x_1"
+				},
+				{
+					"valid": function(props){
+						var file = props.file;
+						return /.+\.drl$/ig.test(file.name)
+					},  
+					"type": "Excellon2",		
+					"format": "Excellon2_1"
+				}
+			],
+			"tl_name": [
+				{"orig_name" : "^spt$", "tl_name" : "spt" },
+				{"orig_name" : "^smt$", "tl_name" : "smt" },
+				{"orig_name" : "^smb$", "tl_name" : "smb" },
+				{"orig_name" : "^spb$", "tl_name" : "spb" },
+				{"orig_name" : "^ssb$", "tl_name" : "ssb" },
+				{"orig_name" : "^sst$", "tl_name" : "sst" },
+				{"orig_name" : "^top$", "tl_name" : "top" },
+				{"orig_name" : "^drill$", "tl_name" : "drill" },
+				{"orig_name" : "^rout$", "tl_name" : "rout" },
+				{"orig_name" : "^bottom$", "tl_name" : "bottom" },
+				{"orig_name" : ["^isl(\\d+)$","^layer_(\\d+)$"], "tl_name" : "l_($1)"},
+				{"orig_name" : ["_isl(\\d+)_isl(\\d+)","d(\\d+)-(\\d+)"], "tl_name" : "d_($1)-($2)"},
+				{"orig_name" : ["_top_isl(\\d+)"], "tl_name" : "d_1-($1)"},
+				{"orig_name" : ["_isl(\\d+)_bottom"], "tl_name" : "d_($1)-($1+1)"}
+			]
+		}
+	},
+	"data_format": [
+		{"tl_name":"^sst$" , "new_name":"sst" , "attr":{ "context":"board", "type":"solder_paste" }},
+		{"tl_name":"^spt$" , "new_name":"spt" , "attr":{ "context":"board", "type":"solder_paste" }},
+		{"tl_name":"^smt$" , "new_name":"smt" , "attr":{ "context":"board", "type":"solder_mask" }},
+		{"tl_name":"^top$" , "new_name":"top" , "attr":{ "context":"board", "type":"signal" }},
+		{"tl_name":"l_(\\d+)","new_name":"layer_($1)" ,"attr":{"context":"board","type":"signal"}},
+		{"tl_name":"^bottom$","new_name":"bottom" ,"attr":{"context":"board","type":"signal"}},
+		{"tl_name":"^smb$" , "new_name":"smb" , "attr":{ "context":"board", "type":"solder_mask" }},
+		{"tl_name":"^spb$" , "new_name":"spb" , "attr":{ "context":"board", "type":"solder_paste" }},
+		{"tl_name":"^ssb$" , "new_name":"ssb" , "attr":{ "context":"board", "type":"solder_paste" }},
+		{"tl_name":"d_(\\d+)-(\\d+)","new_name":"d($1)-($2)" ,"attr":{"context":"board","type":"drill"}},
+		{"tl_name":"drill","new_name":"drill" ,"attr":{"context":"board","type":"drill"}},
+		{"tl_name":"rout","new_name":"rout" ,"attr":{"context":"board","type":"rout"}}
+	],
+	"delSameJob": "yes"
+}
+
+module.exports = config
+
diff --git a/jtg js/JTG_NET_set_drill_attribute_aim.js b/jtg js/JTG_NET_set_drill_attribute_aim.js
new file mode 100644
index 0000000..61ef893
--- /dev/null
+++ b/jtg js/JTG_NET_set_drill_attribute_aim.js	
@@ -0,0 +1,88 @@
+/*
+NAME: 
+DESCRIPTION: ;
+PARAMETER:
+    [
+		{
+			name : 'customer',
+			title : '客户配置',
+			type : 'LineEdit',
+			property : {tool_tip : '客户配置'},
+		}
+	]
+	
+ VERSION_HISTORY:
+	V1.00 2020-04-15 Scott Sun
+	    1.新版本
+		
+ HELP:
+ 	<html><body bgcolor="#DDECFE">
+		<font size="3" color="#003DB2"><p>功能简介</p></font>
+		<p> 数据标准化 </p>
+		<br>
+		<font size="3" color="#003DB2"><p>参数配置</p></font>
+		<p> 客户配置 </p>
+		<br>
+		<font size="3" color="#003DB2"><p>注意事项</p></font>
+		<p> æ—  </p>
+		<br>
+	</body></html>	
+*/
+//////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////
+// 引入模块 包
+var $ = require('topcam.scriptfunc').argv();
+var fs = require('fs');
+var _ = require('lodash');
+var database = require("topsin.database");
+database.addConnection($.conf.database_conf, "DFM");
+var QDfm = database.query("DFM");
+if ($.conf.product_type == "aimdfm") {
+	QDfm.updateRow({
+		table: "pdm_aimdfm_task",
+		data: {
+			current_process_title: $.process_title
+		},
+		where: { id: $.task_id }
+	});
+}
+var GEN = $.gen;
+var Job = $.job_name;
+var db = $.db
+var Status = 'ok';
+var resultData = [];
+var PAR = {};
+if ($.hasOwnProperty('script_parameter')){
+	PAR = JSON.parse($.script_parameter);
+}
+
+try {
+    var par = PAR;
+
+
+    QDfm.updateRow({
+		table: "pdm_aimdfm_task",
+		data: {
+			progress: 33.33
+		},
+		where: { id: $.task_id }
+	});
+	if (GEN.hasError()) {
+		Status = 'error';
+		resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
+		return {
+			status: Status,
+			result_data: resultData
+		};
+	} else {
+		resultData.push({ type: "info", title: "操作完成, 请注意检查!" });
+		return {
+			status: Status,
+			result_data: resultData
+		};
+	}
+} catch (e) {
+    Status = 'error';
+    resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
+    return {status: Status, result_data: resultData};
+}
\ No newline at end of file
diff --git a/jtg js/JTG_ORG_backup_layers_aim.js b/jtg js/JTG_ORG_backup_layers_aim.js
new file mode 100644
index 0000000..61ef893
--- /dev/null
+++ b/jtg js/JTG_ORG_backup_layers_aim.js	
@@ -0,0 +1,88 @@
+/*
+NAME: 
+DESCRIPTION: ;
+PARAMETER:
+    [
+		{
+			name : 'customer',
+			title : '客户配置',
+			type : 'LineEdit',
+			property : {tool_tip : '客户配置'},
+		}
+	]
+	
+ VERSION_HISTORY:
+	V1.00 2020-04-15 Scott Sun
+	    1.新版本
+		
+ HELP:
+ 	<html><body bgcolor="#DDECFE">
+		<font size="3" color="#003DB2"><p>功能简介</p></font>
+		<p> 数据标准化 </p>
+		<br>
+		<font size="3" color="#003DB2"><p>参数配置</p></font>
+		<p> 客户配置 </p>
+		<br>
+		<font size="3" color="#003DB2"><p>注意事项</p></font>
+		<p> æ—  </p>
+		<br>
+	</body></html>	
+*/
+//////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////
+// 引入模块 包
+var $ = require('topcam.scriptfunc').argv();
+var fs = require('fs');
+var _ = require('lodash');
+var database = require("topsin.database");
+database.addConnection($.conf.database_conf, "DFM");
+var QDfm = database.query("DFM");
+if ($.conf.product_type == "aimdfm") {
+	QDfm.updateRow({
+		table: "pdm_aimdfm_task",
+		data: {
+			current_process_title: $.process_title
+		},
+		where: { id: $.task_id }
+	});
+}
+var GEN = $.gen;
+var Job = $.job_name;
+var db = $.db
+var Status = 'ok';
+var resultData = [];
+var PAR = {};
+if ($.hasOwnProperty('script_parameter')){
+	PAR = JSON.parse($.script_parameter);
+}
+
+try {
+    var par = PAR;
+
+
+    QDfm.updateRow({
+		table: "pdm_aimdfm_task",
+		data: {
+			progress: 33.33
+		},
+		where: { id: $.task_id }
+	});
+	if (GEN.hasError()) {
+		Status = 'error';
+		resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
+		return {
+			status: Status,
+			result_data: resultData
+		};
+	} else {
+		resultData.push({ type: "info", title: "操作完成, 请注意检查!" });
+		return {
+			status: Status,
+			result_data: resultData
+		};
+	}
+} catch (e) {
+    Status = 'error';
+    resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
+    return {status: Status, result_data: resultData};
+}
\ No newline at end of file
diff --git a/jtg js/JTG_ORG_create_outline_aim.js b/jtg js/JTG_ORG_create_outline_aim.js
new file mode 100644
index 0000000..61ef893
--- /dev/null
+++ b/jtg js/JTG_ORG_create_outline_aim.js	
@@ -0,0 +1,88 @@
+/*
+NAME: 
+DESCRIPTION: ;
+PARAMETER:
+    [
+		{
+			name : 'customer',
+			title : '客户配置',
+			type : 'LineEdit',
+			property : {tool_tip : '客户配置'},
+		}
+	]
+	
+ VERSION_HISTORY:
+	V1.00 2020-04-15 Scott Sun
+	    1.新版本
+		
+ HELP:
+ 	<html><body bgcolor="#DDECFE">
+		<font size="3" color="#003DB2"><p>功能简介</p></font>
+		<p> 数据标准化 </p>
+		<br>
+		<font size="3" color="#003DB2"><p>参数配置</p></font>
+		<p> 客户配置 </p>
+		<br>
+		<font size="3" color="#003DB2"><p>注意事项</p></font>
+		<p> æ—  </p>
+		<br>
+	</body></html>	
+*/
+//////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////
+// 引入模块 包
+var $ = require('topcam.scriptfunc').argv();
+var fs = require('fs');
+var _ = require('lodash');
+var database = require("topsin.database");
+database.addConnection($.conf.database_conf, "DFM");
+var QDfm = database.query("DFM");
+if ($.conf.product_type == "aimdfm") {
+	QDfm.updateRow({
+		table: "pdm_aimdfm_task",
+		data: {
+			current_process_title: $.process_title
+		},
+		where: { id: $.task_id }
+	});
+}
+var GEN = $.gen;
+var Job = $.job_name;
+var db = $.db
+var Status = 'ok';
+var resultData = [];
+var PAR = {};
+if ($.hasOwnProperty('script_parameter')){
+	PAR = JSON.parse($.script_parameter);
+}
+
+try {
+    var par = PAR;
+
+
+    QDfm.updateRow({
+		table: "pdm_aimdfm_task",
+		data: {
+			progress: 33.33
+		},
+		where: { id: $.task_id }
+	});
+	if (GEN.hasError()) {
+		Status = 'error';
+		resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
+		return {
+			status: Status,
+			result_data: resultData
+		};
+	} else {
+		resultData.push({ type: "info", title: "操作完成, 请注意检查!" });
+		return {
+			status: Status,
+			result_data: resultData
+		};
+	}
+} catch (e) {
+    Status = 'error';
+    resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
+    return {status: Status, result_data: resultData};
+}
\ No newline at end of file
diff --git a/jtg js/JTG_ORG_delete_profile_aim.js b/jtg js/JTG_ORG_delete_profile_aim.js
new file mode 100644
index 0000000..61ef893
--- /dev/null
+++ b/jtg js/JTG_ORG_delete_profile_aim.js	
@@ -0,0 +1,88 @@
+/*
+NAME: 
+DESCRIPTION: ;
+PARAMETER:
+    [
+		{
+			name : 'customer',
+			title : '客户配置',
+			type : 'LineEdit',
+			property : {tool_tip : '客户配置'},
+		}
+	]
+	
+ VERSION_HISTORY:
+	V1.00 2020-04-15 Scott Sun
+	    1.新版本
+		
+ HELP:
+ 	<html><body bgcolor="#DDECFE">
+		<font size="3" color="#003DB2"><p>功能简介</p></font>
+		<p> 数据标准化 </p>
+		<br>
+		<font size="3" color="#003DB2"><p>参数配置</p></font>
+		<p> 客户配置 </p>
+		<br>
+		<font size="3" color="#003DB2"><p>注意事项</p></font>
+		<p> æ—  </p>
+		<br>
+	</body></html>	
+*/
+//////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////
+// 引入模块 包
+var $ = require('topcam.scriptfunc').argv();
+var fs = require('fs');
+var _ = require('lodash');
+var database = require("topsin.database");
+database.addConnection($.conf.database_conf, "DFM");
+var QDfm = database.query("DFM");
+if ($.conf.product_type == "aimdfm") {
+	QDfm.updateRow({
+		table: "pdm_aimdfm_task",
+		data: {
+			current_process_title: $.process_title
+		},
+		where: { id: $.task_id }
+	});
+}
+var GEN = $.gen;
+var Job = $.job_name;
+var db = $.db
+var Status = 'ok';
+var resultData = [];
+var PAR = {};
+if ($.hasOwnProperty('script_parameter')){
+	PAR = JSON.parse($.script_parameter);
+}
+
+try {
+    var par = PAR;
+
+
+    QDfm.updateRow({
+		table: "pdm_aimdfm_task",
+		data: {
+			progress: 33.33
+		},
+		where: { id: $.task_id }
+	});
+	if (GEN.hasError()) {
+		Status = 'error';
+		resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
+		return {
+			status: Status,
+			result_data: resultData
+		};
+	} else {
+		resultData.push({ type: "info", title: "操作完成, 请注意检查!" });
+		return {
+			status: Status,
+			result_data: resultData
+		};
+	}
+} catch (e) {
+    Status = 'error';
+    resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
+    return {status: Status, result_data: resultData};
+}
\ No newline at end of file
diff --git a/jtg js/JTG_ORG_input_data_aim.js b/jtg js/JTG_ORG_input_data_aim.js
new file mode 100644
index 0000000..826cb3d
--- /dev/null
+++ b/jtg js/JTG_ORG_input_data_aim.js	
@@ -0,0 +1,148 @@
+/*
+NAME: 
+DESCRIPTION: ;
+PARAMETER:
+    [
+		{
+            name : 'auto_save',
+			title : '自动保存',
+            type : 'RadioBox',
+            property : {
+				item_list:[
+					{name:'yes',text:'YES'},
+					{name:'no',text:'NO'},
+				],
+				tool_tip:'是否自动保存料号开关'
+			}
+        }
+	]
+	
+ VERSION_HISTORY:
+	V1.00 2020-04-15 Scott Sun
+	    1.新版本
+		
+ HELP:
+ 	<html><body bgcolor="#DDECFE">
+		<font size="3" color="#003DB2"><p>功能简介</p></font>
+		<p> 数据标准化 </p>
+		<br>
+		<font size="3" color="#003DB2"><p>参数配置</p></font>
+		<p> 客户配置 </p>
+		<br>
+		<font size="3" color="#003DB2"><p>注意事项</p></font>
+		<p> æ—  </p>
+		<br>
+	</body></html>	
+*/
+//////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////
+// 引入模块 包
+var $ = require('topcam.scriptfunc').argv();
+var fs = require('fs');
+var _ = require('lodash');
+var database = require("topsin.database");
+database.addConnection($.conf.database_conf, "DFM");
+var QDfm = database.query("DFM");
+if ($.conf.product_type == "aimdfm") {
+	QDfm.updateRow({
+		table: "pdm_aimdfm_task",
+		data: {
+			current_process_title: $.process_title
+		},
+		where: { id: $.task_id }
+	});
+}
+var GEN = $.gen;
+var fs = require("fs");
+var Job = $.job_name;
+var db = $.db
+var Status = 'ok';
+var resultData = [];
+var PAR = {};
+if ($.hasOwnProperty('script_parameter')){
+	PAR = JSON.parse($.script_parameter);
+}
+if (!$.hasOwnProperty('auto_save')){
+	PAR.auto_save = "no"
+}
+
+try {
+    var par = PAR;
+
+    // 检查原稿文件信息
+
+    // 检查料号
+    var job = Job.toLowerCase()
+    if(!GEN.isJobExists({job:job})){throw "料号已经存在"}
+
+    // 读入gerber或者odb++ 判断读入方式
+    var inputInfo = inputInfo()
+    // 读入odb++
+    if(/odb/ig.test(inputInfo.type)){
+        importJob({db:"genesis",path:inputInfo.data.path,name:job})
+    }
+    // 读入gerber
+    if(/gerber/ig.test(inputInfo.type)){
+        importGerber({})
+    }
+    // 保存 
+
+    if(/yes/.test(par.auto_save)){
+        GEN.checkInout({job:job,mode:"out"})  // 结束保存料号 关闭料号
+        GEN.saveJob({ job: job });
+        GEN.checkInout({job:job,mode:"in"})
+        GEN.closeJob({job:job})
+    }
+
+
+    QDfm.updateRow({
+		table: "pdm_aimdfm_task",
+		data: {
+			progress: 33.33
+		},
+		where: { id: $.task_id }
+	});
+	if (GEN.hasError()) {
+		Status = 'error';
+		resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
+		return {
+			status: Status,
+			result_data: resultData
+		};
+	} else {
+		resultData.push({ type: "info", title: "操作完成, 请注意检查!" });
+		return {
+			status: Status,
+			result_data: resultData
+		};
+	}
+} catch (e) {
+    Status = 'error';
+    resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
+    return {status: Status, result_data: resultData};
+}
+
+function importJob(props){
+    GEN.importJob(props);
+}
+
+function importGerber(props){  // job   db  step
+    var job = props.job
+    GEN.createJob({name:job,db:props.db})
+    GEN.createStep({job:job,name:props.step})
+    var gerberInfo = props.data.map(function(item){
+        var gerberCfg = JSON.parse(JSON.stringify(item.format));
+        var file = item.file
+        gerberCfg.layer = file.name.toLowerCase()
+        gerberCfg.path = file.path
+        gerberCfg.format = item.type
+        gerberCfg.job = job
+        gerberCfg.step = step
+        return gerberCfg
+    })
+    GEN.COM("input_manual_reset")
+    gerberInfo.forEach(function(v){
+        GEN.COM("input_manual_set",v)
+    })
+    GEN.COM("input_manual")
+}
\ No newline at end of file
diff --git a/jtg js/JTG_ORG_set_origin_aim.js b/jtg js/JTG_ORG_set_origin_aim.js
new file mode 100644
index 0000000..61ef893
--- /dev/null
+++ b/jtg js/JTG_ORG_set_origin_aim.js	
@@ -0,0 +1,88 @@
+/*
+NAME: 
+DESCRIPTION: ;
+PARAMETER:
+    [
+		{
+			name : 'customer',
+			title : '客户配置',
+			type : 'LineEdit',
+			property : {tool_tip : '客户配置'},
+		}
+	]
+	
+ VERSION_HISTORY:
+	V1.00 2020-04-15 Scott Sun
+	    1.新版本
+		
+ HELP:
+ 	<html><body bgcolor="#DDECFE">
+		<font size="3" color="#003DB2"><p>功能简介</p></font>
+		<p> 数据标准化 </p>
+		<br>
+		<font size="3" color="#003DB2"><p>参数配置</p></font>
+		<p> 客户配置 </p>
+		<br>
+		<font size="3" color="#003DB2"><p>注意事项</p></font>
+		<p> æ—  </p>
+		<br>
+	</body></html>	
+*/
+//////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////
+// 引入模块 包
+var $ = require('topcam.scriptfunc').argv();
+var fs = require('fs');
+var _ = require('lodash');
+var database = require("topsin.database");
+database.addConnection($.conf.database_conf, "DFM");
+var QDfm = database.query("DFM");
+if ($.conf.product_type == "aimdfm") {
+	QDfm.updateRow({
+		table: "pdm_aimdfm_task",
+		data: {
+			current_process_title: $.process_title
+		},
+		where: { id: $.task_id }
+	});
+}
+var GEN = $.gen;
+var Job = $.job_name;
+var db = $.db
+var Status = 'ok';
+var resultData = [];
+var PAR = {};
+if ($.hasOwnProperty('script_parameter')){
+	PAR = JSON.parse($.script_parameter);
+}
+
+try {
+    var par = PAR;
+
+
+    QDfm.updateRow({
+		table: "pdm_aimdfm_task",
+		data: {
+			progress: 33.33
+		},
+		where: { id: $.task_id }
+	});
+	if (GEN.hasError()) {
+		Status = 'error';
+		resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
+		return {
+			status: Status,
+			result_data: resultData
+		};
+	} else {
+		resultData.push({ type: "info", title: "操作完成, 请注意检查!" });
+		return {
+			status: Status,
+			result_data: resultData
+		};
+	}
+} catch (e) {
+    Status = 'error';
+    resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
+    return {status: Status, result_data: resultData};
+}
\ No newline at end of file
diff --git a/jtg js/JTG_PUB_auto_save_job_aim.js b/jtg js/JTG_PUB_auto_save_job_aim.js
new file mode 100644
index 0000000..61ef893
--- /dev/null
+++ b/jtg js/JTG_PUB_auto_save_job_aim.js	
@@ -0,0 +1,88 @@
+/*
+NAME: 
+DESCRIPTION: ;
+PARAMETER:
+    [
+		{
+			name : 'customer',
+			title : '客户配置',
+			type : 'LineEdit',
+			property : {tool_tip : '客户配置'},
+		}
+	]
+	
+ VERSION_HISTORY:
+	V1.00 2020-04-15 Scott Sun
+	    1.新版本
+		
+ HELP:
+ 	<html><body bgcolor="#DDECFE">
+		<font size="3" color="#003DB2"><p>功能简介</p></font>
+		<p> 数据标准化 </p>
+		<br>
+		<font size="3" color="#003DB2"><p>参数配置</p></font>
+		<p> 客户配置 </p>
+		<br>
+		<font size="3" color="#003DB2"><p>注意事项</p></font>
+		<p> æ—  </p>
+		<br>
+	</body></html>	
+*/
+//////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////
+// 引入模块 包
+var $ = require('topcam.scriptfunc').argv();
+var fs = require('fs');
+var _ = require('lodash');
+var database = require("topsin.database");
+database.addConnection($.conf.database_conf, "DFM");
+var QDfm = database.query("DFM");
+if ($.conf.product_type == "aimdfm") {
+	QDfm.updateRow({
+		table: "pdm_aimdfm_task",
+		data: {
+			current_process_title: $.process_title
+		},
+		where: { id: $.task_id }
+	});
+}
+var GEN = $.gen;
+var Job = $.job_name;
+var db = $.db
+var Status = 'ok';
+var resultData = [];
+var PAR = {};
+if ($.hasOwnProperty('script_parameter')){
+	PAR = JSON.parse($.script_parameter);
+}
+
+try {
+    var par = PAR;
+
+
+    QDfm.updateRow({
+		table: "pdm_aimdfm_task",
+		data: {
+			progress: 33.33
+		},
+		where: { id: $.task_id }
+	});
+	if (GEN.hasError()) {
+		Status = 'error';
+		resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
+		return {
+			status: Status,
+			result_data: resultData
+		};
+	} else {
+		resultData.push({ type: "info", title: "操作完成, 请注意检查!" });
+		return {
+			status: Status,
+			result_data: resultData
+		};
+	}
+} catch (e) {
+    Status = 'error';
+    resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
+    return {status: Status, result_data: resultData};
+}
\ No newline at end of file
diff --git a/jtg js/JTG_PUB_copy_step_aim.js b/jtg js/JTG_PUB_copy_step_aim.js
new file mode 100644
index 0000000..61ef893
--- /dev/null
+++ b/jtg js/JTG_PUB_copy_step_aim.js	
@@ -0,0 +1,88 @@
+/*
+NAME: 
+DESCRIPTION: ;
+PARAMETER:
+    [
+		{
+			name : 'customer',
+			title : '客户配置',
+			type : 'LineEdit',
+			property : {tool_tip : '客户配置'},
+		}
+	]
+	
+ VERSION_HISTORY:
+	V1.00 2020-04-15 Scott Sun
+	    1.新版本
+		
+ HELP:
+ 	<html><body bgcolor="#DDECFE">
+		<font size="3" color="#003DB2"><p>功能简介</p></font>
+		<p> 数据标准化 </p>
+		<br>
+		<font size="3" color="#003DB2"><p>参数配置</p></font>
+		<p> 客户配置 </p>
+		<br>
+		<font size="3" color="#003DB2"><p>注意事项</p></font>
+		<p> æ—  </p>
+		<br>
+	</body></html>	
+*/
+//////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////
+// 引入模块 包
+var $ = require('topcam.scriptfunc').argv();
+var fs = require('fs');
+var _ = require('lodash');
+var database = require("topsin.database");
+database.addConnection($.conf.database_conf, "DFM");
+var QDfm = database.query("DFM");
+if ($.conf.product_type == "aimdfm") {
+	QDfm.updateRow({
+		table: "pdm_aimdfm_task",
+		data: {
+			current_process_title: $.process_title
+		},
+		where: { id: $.task_id }
+	});
+}
+var GEN = $.gen;
+var Job = $.job_name;
+var db = $.db
+var Status = 'ok';
+var resultData = [];
+var PAR = {};
+if ($.hasOwnProperty('script_parameter')){
+	PAR = JSON.parse($.script_parameter);
+}
+
+try {
+    var par = PAR;
+
+
+    QDfm.updateRow({
+		table: "pdm_aimdfm_task",
+		data: {
+			progress: 33.33
+		},
+		where: { id: $.task_id }
+	});
+	if (GEN.hasError()) {
+		Status = 'error';
+		resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
+		return {
+			status: Status,
+			result_data: resultData
+		};
+	} else {
+		resultData.push({ type: "info", title: "操作完成, 请注意检查!" });
+		return {
+			status: Status,
+			result_data: resultData
+		};
+	}
+} catch (e) {
+    Status = 'error';
+    resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
+    return {status: Status, result_data: resultData};
+}
\ No newline at end of file
diff --git a/jtg js/node_modules/@types/console/index.d.ts b/jtg js/node_modules/@types/console/index.d.ts
new file mode 100644
index 0000000..5a3614e
--- /dev/null
+++ b/jtg js/node_modules/@types/console/index.d.ts	
@@ -0,0 +1,12 @@
+declare namespace TopJsConsole {
+    export function log(f:any, ...args):void
+    export function debug(f:any, ...args):void
+    export function info(f:any, ...args):void
+    export function warn(f:any, ...args):void
+    export function error(f:any, ...args):void
+    export function assert(expression:boolean,f:any, ...args):void
+}
+
+export = TopJsConsole;
+
+
diff --git a/jtg js/node_modules/@types/events/index.d.ts b/jtg js/node_modules/@types/events/index.d.ts
new file mode 100644
index 0000000..bc744ca
--- /dev/null
+++ b/jtg js/node_modules/@types/events/index.d.ts	
@@ -0,0 +1,28 @@
+
+declare class TopJsEvents {
+    
+    /**
+     * 绑定事件
+     * @param iEventName : 事件名称
+     * @param iCallback : 事件回调函数
+     * @param iThisObject : 回调函数的this对象
+     */
+    on(iEventName:string, iCallback:(...args)=>any, iThisObject:any):void
+    
+    /**
+     * 清除指定事件的所有回调;
+     * @param iEventName : 事件名称
+     */
+    clearEvent(iEventName):void
+
+    /**
+     * 触发一个事件
+     * @param iEventName : 事件名称
+     * @param args : 事件参数;
+     */
+    emit(iEventName, ...args):void
+}
+
+export = TopJsEvents;
+
+
diff --git a/jtg js/node_modules/@types/fs/index.d.ts b/jtg js/node_modules/@types/fs/index.d.ts
new file mode 100644
index 0000000..7853c2d
--- /dev/null
+++ b/jtg js/node_modules/@types/fs/index.d.ts	
@@ -0,0 +1,335 @@
+import { mkdir } from "fs";
+
+declare namespace TopJSFileSystem {
+
+    export class TextFileStream {
+        /**
+         * 设置文件编码
+         * @param iEncoding 
+         */
+        setCodec(iEncoding:string):void
+
+        /**
+         * 获取设置的文件编码
+         */
+        codec():string
+
+        /**
+         * 设置自动检测Unicode
+         * @param iEnabled 
+         */
+        setAutoDetectUnicode(iEnabled:boolean):void
+
+        /**
+         * 是否自动检测Unicode
+         */
+        isAutoDetectUnicode():boolean
+
+        /**
+         * 设置是否添加编码BOM
+         * @param iGenerated 
+         */
+        setGenerateByteOrderMark(iGenerated:boolean):void
+
+        /**
+         * 是否设置了自动添加BOM
+         */
+        isGenerateByteOrderMark():boolean
+
+        /**
+         * 设置是否每次在写入文件时自动刷新缓存至文件
+         * @param iAutoFlush 
+         */
+        setAutoFlush(iAutoFlush:boolean):void
+
+        /**
+         * 是否每次在写入文件时自动刷新缓存至文件
+         */
+        isAutoFlush():boolean
+
+        /**
+         * 是否读取到文件结尾
+         */
+        atEnd():boolean
+
+        /**
+         * 将文件读取位置重置
+         */
+        reset():void
+
+        /**
+         * 刷新缓存至文件
+         */
+        flush():void
+
+        /**
+         * 寻找文件读取位置
+         * @param iPos 
+         */
+        seek(iPos:Number):boolean
+
+        /**
+         * 获取当前文件读取位置
+         */
+        pos():Number
+
+        /**
+         * 设置自动忽略空格
+         */
+        skipWhiteSpace():void
+
+        /**
+         * 读取一行,iMaxLen为最大读取长度;iMaxLen=0表示不限制大小;
+         * @param iMaxLen 
+         */
+        readLine(iMaxLen:Number=0):string
+
+        /**
+         * 读取全部文件内容
+         */
+        readAll():string
+
+        /**
+         * 读取指定大小文本块
+         * @param iMaxLen 
+         */
+        read(iMaxLen:Number):string
+
+        /**
+         * 写入文件
+         * @param iText 
+         */
+        write(iText:string):void
+
+        /**
+         * 关闭文件句柄
+         */
+        close():void
+    }
+
+    export class RawFileStream {
+        /**
+         * 设置是否每次在写入文件时自动刷新缓存至文件
+         * @param iAutoFlush 
+         */
+        setAutoFlush(iAutoFlush:boolean):void
+
+        /**
+         * 是否每次在写入文件时自动刷新缓存至文件
+         */
+        isAutoFlush():boolean
+
+        /**
+         * 是否读取到文件结尾
+         */
+        atEnd():boolean
+
+        /**
+         * 将文件读取位置重置
+         */
+        reset():void
+
+        /**
+         * 刷新缓存至文件
+         */
+        flush():void
+
+        /**
+         * 寻找文件读取位置
+         * @param iPos 
+         */
+        seek(iPos:Number):void
+
+        /**
+         * 获取当前文件读取位置
+         */
+        pos():Number
+
+
+        /**
+         * 读取全部文件内容
+         */
+        readAll():any
+
+        /**
+         * 读取指定大小文本块
+         * @param iMaxLen 
+         */
+        read(iMaxLen:Number):any
+
+        /**
+         * 写入文件
+         * @param iData
+         */
+        write(iData:any):void
+
+        /**
+         * 关闭文件句柄
+         */
+        close():void
+    
+    }
+
+    export interface FileStat {
+        type:'dir'|'file',
+        isDir:boolean,
+        isFile:boolean,
+        path:string,
+        dir:string,
+        name:string,
+        baseName:string,
+        suffix:string,
+        completeBaseName:string,
+        completeSuffix:string,
+        lastModified:string,
+        lastRead:string,
+        size:string,
+        owner:string,
+        ownerId:Number,
+        group:string,
+        groupId:Number,
+        isSymbolLink:boolean,
+        symbolLinkTarget:string,
+        createTime:string,
+        isExcutable:boolean,
+        isHidden:boolean,
+        isReadable:boolean,
+        isWritable:boolean,
+    }
+
+    export interface WriteFileOptions {
+        encoding:string,
+        append:boolean,
+        withbom:boolean,
+    }
+
+    /**
+     * 找开一个文本文件
+     * @param iFilePath 文件路径
+     * @param iMode 打开方式; r=只读; w=只写; rw=读写; a=以追加模式只写; ra=以追加模式读写;
+     */
+    export function openFile(iFilePath:string, iMode:string='r'):TextFileStream;
+
+    /**
+     * 找开一个二进制文件
+     * @param iFilePath 文件路径
+     * @param iMode 打开方式;默认为只读; r=只读; w=只写; rw=读写; a=以追加模式只写; ra=以追加模式读写;
+     */
+    export function openRawFile(iFilePath:string, iMode:string='r'):RawFileStream;
+
+    /**
+     * 更改文件权限;
+     * @param iPath 
+     * @param iMode 文件权限;Linux文件权限码,如'777','644'
+     */
+    export function chmod(iPath:string, iMode:string):boolean
+    
+    /**
+     * 复制文件, iOptions=false表示如果目标文件已经存在则不覆盖; 为true则强制覆盖;
+     * @param iSrc 
+     * @param iDest 
+     * @param iOptions 
+     */
+    export function copyFile(iSrc:string, iDest:String, iOptions:any=false):boolean
+
+    /**
+     * 判断文件或文件夹是否存在,(任一一种存在都返回true)
+     * @param iPath 
+     */
+    export function exists(iPath:string):boolean
+
+    /**
+     * 判断文件是否存在;
+     * @param iPath 
+     */
+    export function fileExists(iPath:string):boolean
+
+    /**
+     * 判断文件夹是否存在;
+     * @param iPath 
+     */
+    export function dirExists(iPath:string):boolean
+
+    /**
+     * link文件
+     * @param iSrc 
+     * @param iDest 
+     */
+    export function link(iSrc:string, iDest:string):boolean
+    
+    /**
+     * 获取文件信息
+     * @param iPath 
+     */
+    export function stat(iPath):FileStat
+
+    /**
+     * 创建一个文件夹
+     * @param iPath 
+     */
+    export function mkdir(iPath:string):boolean
+    
+    /**
+     * 获取文件的绝对路径
+     * @param iPath 
+     */
+    export function realpath(iPath:string):string
+
+    /**
+     * 重命名或移动文件, iOptions=false表示如果目标文件已经存在则不覆盖; 为true则强制覆盖;
+     * @param iOld 
+     * @param iNew 
+     * @param iOptions 
+     */
+    export function rename(iOld:string, iNew:string, iOptions:any=false):boolean
+
+    /**
+     * 删除文件, iOptions=true表示强制文件夹内的内容; 为false表示只有文件夹为空时才移除;
+     * @param iOld 
+     * @param iOptions 
+     */
+    export function rmdir(iDir:string, iOptions:any=true):boolean
+
+    /**
+     * 删除文件
+     * @param iFile 
+     */
+    export function unlink(iFile:string):boolean
+
+    /**
+     * 获取文件夹下的文件信息列表,iRecursiveLevel表示递归查找多少级,-1表示无限递归,iChildrenKey代表用于表示子文件不会的Key; 如果为空则表示返回结果为一维数组;
+     * @param iDir 
+     * @param iRecursiveLevel 
+     * @param iChildrenKey 
+     */
+    export function listDir(iDir:string, iRecursiveLevel:Number=-1, iChildrenKey:string=''):Array<FileStat>
+
+    /**
+     * 读取文本文件内容
+     * @param iFile 
+     * @param iCodec :文件编码,默认为UTF-8
+     * @param iOptions :预留参数,暂时未使用
+     */
+    export function readFile(iFile:string, iCodec:string='UTF-8',iOptions:any):string
+    
+    /**
+     * 写入一个文本文件
+     * @param iFile 
+     * @param iContent 
+     * @param iOptions : 读写选项;默认为{encoding:'UTF-8', append:false, withbom:false}
+     */
+    export function writeFile(iFile:string, iContent:string, iOptions:WriteFileOptions={encoding:'UTF-8', append:false, withbom:false})
+
+    /**
+     * 获取操作系统临时目录
+     */
+    export function tmpdir():string
+
+    /**
+     * 获取操作系统当前用户HOME目录;
+     */
+    export function homedir():string
+
+}
+
+export = TopJSFileSystem;
diff --git a/jtg js/node_modules/@types/lodash/LICENSE b/jtg js/node_modules/@types/lodash/LICENSE
new file mode 100644
index 0000000..2107107
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/LICENSE	
@@ -0,0 +1,21 @@
+    MIT License
+
+    Copyright (c) Microsoft Corporation. All rights reserved.
+
+    Permission is hereby granted, free of charge, to any person obtaining a copy
+    of this software and associated documentation files (the "Software"), to deal
+    in the Software without restriction, including without limitation the rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in all
+    copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+    SOFTWARE
diff --git a/jtg js/node_modules/@types/lodash/README.md b/jtg js/node_modules/@types/lodash/README.md
new file mode 100644
index 0000000..5c4cb7d
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/README.md	
@@ -0,0 +1,16 @@
+# Installation
+> `npm install --save @types/lodash`
+
+# Summary
+This package contains type definitions for Lo-Dash (http://lodash.com/).
+
+# Details
+Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/lodash
+
+Additional Details
+ * Last updated: Mon, 18 Jun 2018 22:47:05 GMT
+ * Dependencies: none
+ * Global values: _
+
+# Credits
+These definitions were written by Brian Zengel <https://github.com/bczengel>, Ilya Mochalov <https://github.com/chrootsu>, Stepan Mikhaylyuk <https://github.com/stepancar>, AJ Richardson <https://github.com/aj-r>, Junyoung Clare Jang <https://github.com/ailrun>, e-cloud <https://github.com/e-cloud>, Georgii Dolzhykov <https://github.com/thorn0>, Jack Moore <https://github.com/jtmthf>, Dominique Rau <https://github.com/DomiR>.
diff --git a/jtg js/node_modules/@types/lodash/add.d.ts b/jtg js/node_modules/@types/lodash/add.d.ts
new file mode 100644
index 0000000..4650a89
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/add.d.ts	
@@ -0,0 +1,2 @@
+import { add } from "./index";
+export = add;
diff --git a/jtg js/node_modules/@types/lodash/after.d.ts b/jtg js/node_modules/@types/lodash/after.d.ts
new file mode 100644
index 0000000..277ae1e
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/after.d.ts	
@@ -0,0 +1,2 @@
+import { after } from "./index";
+export = after;
diff --git a/jtg js/node_modules/@types/lodash/ary.d.ts b/jtg js/node_modules/@types/lodash/ary.d.ts
new file mode 100644
index 0000000..ac1c72e
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/ary.d.ts	
@@ -0,0 +1,2 @@
+import { ary } from "./index";
+export = ary;
diff --git a/jtg js/node_modules/@types/lodash/assign.d.ts b/jtg js/node_modules/@types/lodash/assign.d.ts
new file mode 100644
index 0000000..5ffc1e3
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/assign.d.ts	
@@ -0,0 +1,2 @@
+import { assign } from "./index";
+export = assign;
diff --git a/jtg js/node_modules/@types/lodash/assignIn.d.ts b/jtg js/node_modules/@types/lodash/assignIn.d.ts
new file mode 100644
index 0000000..3cc54e8
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/assignIn.d.ts	
@@ -0,0 +1,2 @@
+import { assignIn } from "./index";
+export = assignIn;
diff --git a/jtg js/node_modules/@types/lodash/assignInWith.d.ts b/jtg js/node_modules/@types/lodash/assignInWith.d.ts
new file mode 100644
index 0000000..b4c4dfe
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/assignInWith.d.ts	
@@ -0,0 +1,2 @@
+import { assignInWith } from "./index";
+export = assignInWith;
diff --git a/jtg js/node_modules/@types/lodash/assignWith.d.ts b/jtg js/node_modules/@types/lodash/assignWith.d.ts
new file mode 100644
index 0000000..97da10c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/assignWith.d.ts	
@@ -0,0 +1,2 @@
+import { assignWith } from "./index";
+export = assignWith;
diff --git a/jtg js/node_modules/@types/lodash/at.d.ts b/jtg js/node_modules/@types/lodash/at.d.ts
new file mode 100644
index 0000000..49e7147
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/at.d.ts	
@@ -0,0 +1,2 @@
+import { at } from "./index";
+export = at;
diff --git a/jtg js/node_modules/@types/lodash/attempt.d.ts b/jtg js/node_modules/@types/lodash/attempt.d.ts
new file mode 100644
index 0000000..d4b6089
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/attempt.d.ts	
@@ -0,0 +1,2 @@
+import { attempt } from "./index";
+export = attempt;
diff --git a/jtg js/node_modules/@types/lodash/before.d.ts b/jtg js/node_modules/@types/lodash/before.d.ts
new file mode 100644
index 0000000..03c45c8
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/before.d.ts	
@@ -0,0 +1,2 @@
+import { before } from "./index";
+export = before;
diff --git a/jtg js/node_modules/@types/lodash/bind.d.ts b/jtg js/node_modules/@types/lodash/bind.d.ts
new file mode 100644
index 0000000..6367da1
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/bind.d.ts	
@@ -0,0 +1,2 @@
+import { bind } from "./index";
+export = bind;
diff --git a/jtg js/node_modules/@types/lodash/bindAll.d.ts b/jtg js/node_modules/@types/lodash/bindAll.d.ts
new file mode 100644
index 0000000..25d47e3
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/bindAll.d.ts	
@@ -0,0 +1,2 @@
+import { bindAll } from "./index";
+export = bindAll;
diff --git a/jtg js/node_modules/@types/lodash/bindKey.d.ts b/jtg js/node_modules/@types/lodash/bindKey.d.ts
new file mode 100644
index 0000000..128b065
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/bindKey.d.ts	
@@ -0,0 +1,2 @@
+import { bindKey } from "./index";
+export = bindKey;
diff --git a/jtg js/node_modules/@types/lodash/camelCase.d.ts b/jtg js/node_modules/@types/lodash/camelCase.d.ts
new file mode 100644
index 0000000..5c10659
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/camelCase.d.ts	
@@ -0,0 +1,2 @@
+import { camelCase } from "./index";
+export = camelCase;
diff --git a/jtg js/node_modules/@types/lodash/capitalize.d.ts b/jtg js/node_modules/@types/lodash/capitalize.d.ts
new file mode 100644
index 0000000..416f5f5
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/capitalize.d.ts	
@@ -0,0 +1,2 @@
+import { capitalize } from "./index";
+export = capitalize;
diff --git a/jtg js/node_modules/@types/lodash/castArray.d.ts b/jtg js/node_modules/@types/lodash/castArray.d.ts
new file mode 100644
index 0000000..74ea7bd
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/castArray.d.ts	
@@ -0,0 +1,2 @@
+import { castArray } from "./index";
+export = castArray;
diff --git a/jtg js/node_modules/@types/lodash/ceil.d.ts b/jtg js/node_modules/@types/lodash/ceil.d.ts
new file mode 100644
index 0000000..0c6f1fd
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/ceil.d.ts	
@@ -0,0 +1,2 @@
+import { ceil } from "./index";
+export = ceil;
diff --git a/jtg js/node_modules/@types/lodash/chain.d.ts b/jtg js/node_modules/@types/lodash/chain.d.ts
new file mode 100644
index 0000000..d09d2bb
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/chain.d.ts	
@@ -0,0 +1,2 @@
+import { chain } from "./index";
+export = chain;
diff --git a/jtg js/node_modules/@types/lodash/chunk.d.ts b/jtg js/node_modules/@types/lodash/chunk.d.ts
new file mode 100644
index 0000000..125c98f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/chunk.d.ts	
@@ -0,0 +1,2 @@
+import { chunk } from "./index";
+export = chunk;
diff --git a/jtg js/node_modules/@types/lodash/clamp.d.ts b/jtg js/node_modules/@types/lodash/clamp.d.ts
new file mode 100644
index 0000000..df17066
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/clamp.d.ts	
@@ -0,0 +1,2 @@
+import { clamp } from "./index";
+export = clamp;
diff --git a/jtg js/node_modules/@types/lodash/clone.d.ts b/jtg js/node_modules/@types/lodash/clone.d.ts
new file mode 100644
index 0000000..c5884d7
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/clone.d.ts	
@@ -0,0 +1,2 @@
+import { clone } from "./index";
+export = clone;
diff --git a/jtg js/node_modules/@types/lodash/cloneDeep.d.ts b/jtg js/node_modules/@types/lodash/cloneDeep.d.ts
new file mode 100644
index 0000000..b7bd893
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/cloneDeep.d.ts	
@@ -0,0 +1,2 @@
+import { cloneDeep } from "./index";
+export = cloneDeep;
diff --git a/jtg js/node_modules/@types/lodash/cloneDeepWith.d.ts b/jtg js/node_modules/@types/lodash/cloneDeepWith.d.ts
new file mode 100644
index 0000000..3eb368b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/cloneDeepWith.d.ts	
@@ -0,0 +1,2 @@
+import { cloneDeepWith } from "./index";
+export = cloneDeepWith;
diff --git a/jtg js/node_modules/@types/lodash/cloneWith.d.ts b/jtg js/node_modules/@types/lodash/cloneWith.d.ts
new file mode 100644
index 0000000..1e6bf7a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/cloneWith.d.ts	
@@ -0,0 +1,2 @@
+import { cloneWith } from "./index";
+export = cloneWith;
diff --git a/jtg js/node_modules/@types/lodash/common/array.d.ts b/jtg js/node_modules/@types/lodash/common/array.d.ts
new file mode 100644
index 0000000..6d4aff3
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/common/array.d.ts	
@@ -0,0 +1,3708 @@
+import _ = require("../index");
+declare module "../index" {
+    // chunk
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of elements split into groups the length of size. If collection can’t be split evenly, the
+         * final chunk will be the remaining elements.
+         *
+         * @param array The array to process.
+         * @param size The length of each chunk.
+         * @return Returns the new array containing chunks.
+         */
+        chunk<T>(
+            array: List<T> | null | undefined,
+            size?: number
+        ): T[][];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.chunk
+         */
+        chunk<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            size?: number,
+        ): LoDashImplicitWrapper<T[][]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.chunk
+         */
+        chunk<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            size?: number,
+        ): LoDashExplicitWrapper<T[][]>;
+    }
+
+    // compact
+
+    interface LoDashStatic {
+        /**
+         * Creates an array with all falsey values removed. The values false, null, 0, "", undefined, and NaN are
+         * falsey.
+         *
+         * @param array The array to compact.
+         * @return Returns the new array of filtered values.
+         */
+        compact<T>(array: List<T | null | undefined | false | "" | 0> | null | undefined): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.compact
+         */
+        compact<T>(this: LoDashImplicitWrapper<List<T | null | undefined | false | "" | 0> | null | undefined>): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.compact
+         */
+        compact<T>(this: LoDashExplicitWrapper<List<T | null | undefined | false | "" | 0> | null | undefined>): LoDashExplicitWrapper<T[]>;
+    }
+
+    // concat
+
+    interface LoDashStatic {
+        /**
+         * Creates a new array concatenating `array` with any additional arrays
+         * and/or values.
+         *
+         * @category Array
+         * @param array The array to concatenate.
+         * @param [values] The values to concatenate.
+         * @returns Returns the new concatenated array.
+         * @example
+         *
+         * var array = [1];
+         * var other = _.concat(array, 2, [3], [[4]]);
+         *
+         * console.log(other);
+         * // => [1, 2, 3, [4]]
+         *
+         * console.log(array);
+         * // => [1]
+         */
+         concat<T>(array: Many<T>, ...values: Array<Many<T>>): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.compact
+         */
+        concat<T>(this: LoDashImplicitWrapper<Many<T>>, ...values: Array<Many<T>>): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.compact
+         */
+        concat<T>(this: LoDashExplicitWrapper<Many<T>>, ...values: Array<Many<T>>): LoDashExplicitWrapper<T[]>;
+    }
+
+    // difference
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of unique array values not included in the other provided arrays using SameValueZero for
+         * equality comparisons.
+         *
+         * @param array The array to inspect.
+         * @param values The arrays of values to exclude.
+         * @return Returns the new array of filtered values.
+         */
+        difference<T>(
+            array: List<T> | null | undefined,
+            ...values: Array<List<T>>
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.difference
+         */
+        difference<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            ...values: Array<List<T>>
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.difference
+         */
+        difference<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            ...values: Array<List<T>>
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // differenceBy
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.difference except that it accepts iteratee which is invoked for each element of array
+         * and values to generate the criterion by which uniqueness is computed. The iteratee is invoked with one
+         * argument: (value).
+         *
+         * @param array The array to inspect.
+         * @param values The values to exclude.
+         * @param iteratee The iteratee invoked per element.
+         * @returns Returns the new array of filtered values.
+         */
+        differenceBy<T1, T2>(
+            array: List<T1> | null | undefined,
+            values: List<T2>,
+            iteratee: ValueIteratee<T1 | T2>
+        ): T1[];
+
+        /**
+         * @see _.differenceBy
+         */
+        differenceBy<T1, T2, T3>(
+            array: List<T1> | null | undefined,
+            values1: List<T2>,
+            values2: List<T3>,
+            iteratee: ValueIteratee<T1 | T2 | T3>
+        ): T1[];
+
+        /**
+         * @see _.differenceBy
+         */
+        differenceBy<T1, T2, T3, T4>(
+            array: List<T1> | null | undefined,
+            values1: List<T2>,
+            values2: List<T3>,
+            values3: List<T4>,
+            iteratee: ValueIteratee<T1 | T2 | T3 | T4>
+        ): T1[];
+
+        /**
+         * @see _.differenceBy
+         */
+        differenceBy<T1, T2, T3, T4, T5>(
+            array: List<T1> | null | undefined,
+            values1: List<T2>,
+            values2: List<T3>,
+            values3: List<T4>,
+            values4: List<T5>,
+            iteratee: ValueIteratee<T1 | T2 | T3 | T4 | T5>
+        ): T1[];
+
+        /**
+         * @see _.differenceBy
+         */
+        differenceBy<T1, T2, T3, T4, T5, T6>(
+            array: List<T1> | null | undefined,
+            values1: List<T2>,
+            values2: List<T3>,
+            values3: List<T4>,
+            values4: List<T5>,
+            values5: List<T6>,
+            iteratee: ValueIteratee<T1 | T2 | T3 | T4 | T5 | T6>
+        ): T1[];
+
+        /**
+         * @see _.differenceBy
+         */
+        differenceBy<T1, T2, T3, T4, T5, T6, T7>(
+            array: List<T1> | null | undefined,
+            values1: List<T2>,
+            values2: List<T3>,
+            values3: List<T4>,
+            values4: List<T5>,
+            values5: List<T6>,
+            ...values: Array<List<T7> | ValueIteratee<T1 | T2 | T3 | T4 | T5 | T6 | T7>>
+        ): T1[];
+
+        /**
+         * @see _.differenceBy
+         */
+        differenceBy<T>(
+            array: List<T> | null | undefined,
+            ...values: Array<List<T>>
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.differenceBy
+         */
+        differenceBy<T1, T2>(
+            this: LoDashImplicitWrapper<List<T1> | null | undefined>,
+            values: List<T2>,
+            iteratee: ValueIteratee<T1 | T2>
+        ): LoDashImplicitWrapper<T1[]>;
+
+        /**
+         * @see _.differenceBy
+         */
+        differenceBy<T1, T2, T3>(
+            this: LoDashImplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            iteratee: ValueIteratee<T1 | T2 | T3>
+        ): LoDashImplicitWrapper<T1[]>;
+
+        /**
+         * @see _.differenceBy
+         */
+        differenceBy<T1, T2, T3, T4>(
+            this: LoDashImplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            values3: List<T4>,
+            iteratee: ValueIteratee<T1 | T2 | T3 | T4>
+        ): LoDashImplicitWrapper<T1[]>;
+
+        /**
+         * @see _.differenceBy
+         */
+        differenceBy<T1, T2, T3, T4, T5>(
+            this: LoDashImplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            values3: List<T4>,
+            values4: List<T5>,
+            iteratee: ValueIteratee<T1 | T2 | T3 | T4 | T5>
+        ): LoDashImplicitWrapper<T1[]>;
+
+        /**
+         * @see _.differenceBy
+         */
+        differenceBy<T1, T2, T3, T4, T5, T6>(
+            this: LoDashImplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            values3: List<T4>,
+            values4: List<T5>,
+            values5: List<T6>,
+            iteratee: ValueIteratee<T1 | T2 | T3 | T4 | T5 | T6>
+        ): LoDashImplicitWrapper<T1[]>;
+
+        /**
+         * @see _.differenceBy
+         */
+        differenceBy<T1, T2, T3, T4, T5, T6, T7>(
+            this: LoDashImplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            values3: List<T4>,
+            values4: List<T5>,
+            values5: List<T6>,
+            ...values: Array<List<T7> | ValueIteratee<T1 | T2 | T3 | T4 | T5 | T6 | T7>>
+        ): LoDashImplicitWrapper<T1[]>;
+
+        /**
+         * @see _.differenceBy
+         */
+        differenceBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            ...values: Array<List<T>>
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.differenceBy
+         */
+        differenceBy<T1, T2>(
+            this: LoDashExplicitWrapper<List<T1> | null | undefined>,
+            values: List<T2>,
+            iteratee: ValueIteratee<T1 | T2>
+        ): LoDashExplicitWrapper<T1[]>;
+
+        /**
+         * @see _.differenceBy
+         */
+        differenceBy<T1, T2, T3>(
+            this: LoDashExplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            iteratee: ValueIteratee<T1 | T2 | T3>
+        ): LoDashExplicitWrapper<T1[]>;
+
+        /**
+         * @see _.differenceBy
+         */
+        differenceBy<T1, T2, T3, T4>(
+            this: LoDashExplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            values3: List<T4>,
+            iteratee: ValueIteratee<T1 | T2 | T3 | T4>
+        ): LoDashExplicitWrapper<T1[]>;
+
+        /**
+         * @see _.differenceBy
+         */
+        differenceBy<T1, T2, T3, T4, T5>(
+            this: LoDashExplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            values3: List<T4>,
+            values4: List<T5>,
+            iteratee: ValueIteratee<T1 | T2 | T3 | T4 | T5>
+        ): LoDashExplicitWrapper<T1[]>;
+
+        /**
+         * @see _.differenceBy
+         */
+        differenceBy<T1, T2, T3, T4, T5, T6>(
+            this: LoDashExplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            values3: List<T4>,
+            values4: List<T5>,
+            values5: List<T6>,
+            iteratee: ValueIteratee<T1 | T2 | T3 | T4 | T5 | T6>
+        ): LoDashExplicitWrapper<T1[]>;
+
+        /**
+         * @see _.differenceBy
+         */
+        differenceBy<T1, T2, T3, T4, T5, T6, T7>(
+            this: LoDashExplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            values3: List<T4>,
+            values4: List<T5>,
+            values5: List<T6>,
+            ...values: Array<List<T7> | ValueIteratee<T1 | T2 | T3 | T4 | T5 | T6 | T7>>
+        ): LoDashExplicitWrapper<T1[]>;
+
+        /**
+         * @see _.differenceBy
+         */
+        differenceBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            ...values: Array<List<T>>
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // differenceWith
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of unique `array` values not included in the other
+         * provided arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+         * for equality comparisons.
+         *
+         * @category Array
+         * @param [values] The arrays to inspect.
+         * @param [comparator] The comparator invoked per element.
+         * @returns Returns the new array of filtered values.
+         * @example
+         *
+         * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+
+         * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
+         * // => [{ 'x': 2, 'y': 1 }]
+         */
+        differenceWith<T1, T2>(
+            array: List<T1> | null | undefined,
+            values: List<T2>,
+            comparator: Comparator2<T1, T2>
+        ): T1[];
+
+        /**
+         * @see _.differenceWith
+         */
+        differenceWith<T1, T2, T3>(
+            array: List<T1> | null | undefined,
+            values1: List<T2>,
+            values2: List<T3>,
+            comparator: Comparator2<T1, T2 | T3>
+        ): T1[];
+
+        /**
+         * @see _.differenceWith
+         */
+        differenceWith<T1, T2, T3, T4>(
+            array: List<T1> | null | undefined,
+            values1: List<T2>,
+            values2: List<T3>,
+            ...values: Array<List<T4> | Comparator2<T1, T2 | T3 | T4>>
+        ): T1[];
+
+        /**
+         * @see _.differenceWith
+         */
+        differenceWith<T>(
+            array: List<T> | null | undefined,
+            ...values: Array<List<T>>
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.differenceWith
+         */
+        differenceWith<T1, T2>(
+            this: LoDashImplicitWrapper<List<T1> | null | undefined>,
+            values: List<T2>,
+            comparator: Comparator2<T1, T2>
+        ): LoDashImplicitWrapper<T1[]>;
+
+        /**
+         * @see _.differenceWith
+         */
+        differenceWith<T1, T2, T3>(
+            this: LoDashImplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            comparator: Comparator2<T1, T2 | T3>
+        ): LoDashImplicitWrapper<T1[]>;
+
+        /**
+         * @see _.differenceWith
+         */
+        differenceWith<T1, T2, T3, T4>(
+            this: LoDashImplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            ...values: Array<List<T4> | Comparator2<T1, T2 | T3 | T4>>
+        ): LoDashImplicitWrapper<T1[]>;
+
+        /**
+         * @see _.differenceWith
+         */
+        differenceWith<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            ...values: Array<List<T>>
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.differenceWith
+         */
+        differenceWith<T1, T2>(
+            this: LoDashExplicitWrapper<List<T1> | null | undefined>,
+            values: List<T2>,
+            comparator: Comparator2<T1, T2>
+        ): LoDashExplicitWrapper<T1[]>;
+
+        /**
+         * @see _.differenceWith
+         */
+        differenceWith<T1, T2, T3>(
+            this: LoDashExplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            comparator: Comparator2<T1, T2 | T3>
+        ): LoDashExplicitWrapper<T1[]>;
+
+        /**
+         * @see _.differenceWith
+         */
+        differenceWith<T1, T2, T3, T4>(
+            this: LoDashExplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            ...values: Array<List<T4> | Comparator2<T1, T2 | T3 | T4>>
+        ): LoDashExplicitWrapper<T1[]>;
+
+        /**
+         * @see _.differenceWith
+         */
+        differenceWith<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            ...values: Array<List<T>>
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // drop
+
+    interface LoDashStatic {
+        /**
+         * Creates a slice of array with n elements dropped from the beginning.
+         *
+         * @param array The array to query.
+         * @param n The number of elements to drop.
+         * @return Returns the slice of array.
+         */
+        drop<T>(array: List<T> | null | undefined, n?: number): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.drop
+         */
+        drop<T>(this: LoDashImplicitWrapper<List<T> | null | undefined>, n?: number): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.drop
+         */
+        drop<T>(this: LoDashExplicitWrapper<List<T> | null | undefined>, n?: number): LoDashExplicitWrapper<T[]>;
+    }
+
+    // dropRight
+
+    interface LoDashStatic {
+        /**
+         * Creates a slice of array with n elements dropped from the end.
+         *
+         * @param array The array to query.
+         * @param n The number of elements to drop.
+         * @return Returns the slice of array.
+         */
+        dropRight<T>(
+            array: List<T> | null | undefined,
+            n?: number
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.dropRight
+         */
+        dropRight<T>(this: LoDashImplicitWrapper<List<T> | null | undefined>, n?: number): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.dropRight
+         */
+        dropRight<T>(this: LoDashExplicitWrapper<List<T> | null | undefined>, n?: number): LoDashExplicitWrapper<T[]>;
+    }
+
+    // dropRightWhile
+
+    interface LoDashStatic {
+        /**
+         * Creates a slice of array excluding elements dropped from the end. Elements are dropped until predicate
+         * returns falsey. The predicate is invoked with three arguments: (value, index, array).
+         *
+         * @param array The array to query.
+         * @param predicate The function invoked per iteration.
+         * @return Returns the slice of array.
+         */
+        dropRightWhile<T>(
+            array: List<T> | null | undefined,
+            predicate?: ListIteratee<T>
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.dropRightWhile
+         */
+        dropRightWhile<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIteratee<T>
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.dropRightWhile
+         */
+        dropRightWhile<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIteratee<T>
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // dropWhile
+
+    interface LoDashStatic {
+        /**
+         * Creates a slice of array excluding elements dropped from the beginning. Elements are dropped until predicate
+         * returns falsey. The predicate is invoked with three arguments: (value, index, array).
+         *
+         * @param array The array to query.
+         * @param predicate The function invoked per iteration.
+         * @return Returns the slice of array.
+         */
+        dropWhile<T>(
+            array: List<T> | null | undefined,
+            predicate?: ListIteratee<T>
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.dropWhile
+         */
+        dropWhile<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIteratee<T>
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.dropWhile
+         */
+        dropWhile<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIteratee<T>
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // fill
+
+    interface LoDashStatic {
+        /**
+         * Fills elements of array with value from start up to, but not including, end.
+         *
+         * Note: This method mutates array.
+         *
+         * @param array The array to fill.
+         * @param value The value to fill array with.
+         * @param start The start position.
+         * @param end The end position.
+         * @return Returns array.
+         */
+        fill<T>(
+            array: any[] | null | undefined,
+            value: T
+        ): T[];
+
+        /**
+         * @see _.fill
+         */
+        fill<T>(
+            array: List<any> | null | undefined,
+            value: T
+        ): List<T>;
+
+        /**
+         * @see _.fill
+         */
+        fill<T, U>(
+            array: U[] | null | undefined,
+            value: T,
+            start?: number,
+            end?: number
+        ): Array<T | U>;
+
+        /**
+         * @see _.fill
+         */
+        fill<T, U>(
+            array: List<U> | null | undefined,
+            value: T,
+            start?: number,
+            end?: number
+        ): List<T | U>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.fill
+         */
+        fill<T>(
+            this: LoDashImplicitWrapper<any[] | null | undefined>,
+            value: T
+        ): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.fill
+         */
+        fill<T>(
+            this: LoDashImplicitWrapper<List<any> | null | undefined>,
+            value: T
+        ): LoDashImplicitWrapper<List<T>>;
+
+        /**
+         * @see _.fill
+         */
+        fill<T, U>(
+            this: LoDashImplicitWrapper<U[] | null | undefined>,
+            value: T,
+            start?: number,
+            end?: number
+        ): LoDashImplicitWrapper<Array<T | U>>;
+
+        /**
+         * @see _.fill
+         */
+        fill<T, U>(
+            this: LoDashImplicitWrapper<List<U> | null | undefined>,
+            value: T,
+            start?: number,
+            end?: number
+        ): LoDashImplicitWrapper<List<T | U>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.fill
+         */
+        fill<T>(
+            this: LoDashExplicitWrapper<any[] | null | undefined>,
+            value: T
+        ): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.fill
+         */
+        fill<T>(
+            this: LoDashExplicitWrapper<List<any> | null | undefined>,
+            value: T
+        ): LoDashExplicitWrapper<List<T>>;
+
+        /**
+         * @see _.fill
+         */
+        fill<T, U>(
+            this: LoDashExplicitWrapper<U[] | null | undefined>,
+            value: T,
+            start?: number,
+            end?: number
+        ): LoDashExplicitWrapper<Array<T | U>>;
+
+        /**
+         * @see _.fill
+         */
+        fill<T, U>(
+            this: LoDashExplicitWrapper<List<U> | null | undefined>,
+            value: T,
+            start?: number,
+            end?: number
+        ): LoDashExplicitWrapper<List<T | U>>;
+    }
+
+    // findIndex
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.find except that it returns the index of the first element predicate returns truthy
+         * for instead of the element itself.
+         *
+         * @param array The array to search.
+         * @param predicate The function invoked per iteration.
+         * @param fromIndex The index to search from.
+         * @return Returns the index of the found element, else -1.
+         */
+        findIndex<T>(
+            array: List<T> | null | undefined,
+            predicate?: ListIterateeCustom<T, boolean>,
+            fromIndex?: number
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.findIndex
+         */
+        findIndex<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIterateeCustom<T, boolean>,
+            fromIndex?: number
+        ): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.findIndex
+         */
+        findIndex<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIterateeCustom<T, boolean>,
+            fromIndex?: number
+        ): LoDashExplicitWrapper<number>;
+    }
+
+    // findLastIndex
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.findIndex except that it iterates over elements of collection from right to left.
+         *
+         * @param array The array to search.
+         * @param predicate The function invoked per iteration.
+         * @param fromIndex The index to search from.
+         * @return Returns the index of the found element, else -1.
+         */
+        findLastIndex<T>(
+            array: List<T> | null | undefined,
+            predicate?: ListIterateeCustom<T, boolean>,
+            fromIndex?: number
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.findLastIndex
+         */
+        findLastIndex<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIterateeCustom<T, boolean>,
+            fromIndex?: number
+        ): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.findLastIndex
+         */
+        findLastIndex<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIterateeCustom<T, boolean>,
+            fromIndex?: number
+        ): LoDashExplicitWrapper<number>;
+    }
+
+    // first
+
+    interface LoDashStatic {
+        first: typeof _.head; // tslint:disable-line:no-unnecessary-qualifier
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.head
+         */
+        first<T>(this: LoDashImplicitWrapper<List<T> | null | undefined>): T | undefined;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.head
+         */
+        first<T>(this: LoDashExplicitWrapper<List<T> | null | undefined>): LoDashExplicitWrapper<T | undefined>;
+    }
+
+    interface RecursiveArray<T> extends Array<T|RecursiveArray<T>> {}
+    interface ListOfRecursiveArraysOrValues<T> extends List<T|RecursiveArray<T>> {}
+
+    // flatten
+
+    interface LoDashStatic {
+        /**
+         * Flattens `array` a single level deep.
+         *
+         * @param array The array to flatten.
+         * @return Returns the new flattened array.
+         */
+        flatten<T>(array: List<Many<T>> | null | undefined): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.flatten
+         */
+        flatten<T>(this: LoDashImplicitWrapper<List<Many<T>> | null | undefined>): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.flatten
+         */
+        flatten<T>(this: LoDashExplicitWrapper<List<Many<T>> | null | undefined>): LoDashExplicitWrapper<T[]>;
+    }
+
+    // flattenDeep
+
+    interface LoDashStatic {
+        /**
+         * Recursively flattens a nested array.
+         *
+         * @param array The array to recursively flatten.
+         * @return Returns the new flattened array.
+         */
+        flattenDeep<T>(array: ListOfRecursiveArraysOrValues<T> | null | undefined): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.flattenDeep
+         */
+        flattenDeep<T>(this: LoDashImplicitWrapper<ListOfRecursiveArraysOrValues<T> | null | undefined>): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.flattenDeep
+         */
+        flattenDeep<T>(this: LoDashExplicitWrapper<ListOfRecursiveArraysOrValues<T> | null | undefined>): LoDashExplicitWrapper<T[]>;
+    }
+
+    // flattenDepth
+
+    interface LoDashStatic {
+        /**
+         * Recursively flatten array up to depth times.
+         *
+         * @param array The array to recursively flatten.
+         * @param number The maximum recursion depth.
+         * @return Returns the new flattened array.
+         */
+        flattenDepth<T>(array: ListOfRecursiveArraysOrValues<T> | null | undefined, depth?: number): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.flattenDeep
+         */
+        flattenDepth<T>(this: LoDashImplicitWrapper<ListOfRecursiveArraysOrValues<T> | null | undefined>, depth?: number): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.flattenDeep
+         */
+        flattenDepth<T>(this: LoDashExplicitWrapper<ListOfRecursiveArraysOrValues<T> | null | undefined>, depth?: number): LoDashExplicitWrapper<T[]>;
+    }
+
+    // fromPairs
+
+    interface LoDashStatic {
+        /**
+         * The inverse of `_.toPairs`; this method returns an object composed
+         * from key-value `pairs`.
+         *
+         * @category Array
+         * @param pairs The key-value pairs.
+         * @returns Returns the new object.
+         * @example
+         *
+         * _.fromPairs([['fred', 30], ['barney', 40]]);
+         * // => { 'fred': 30, 'barney': 40 }
+         */
+        fromPairs<T>(
+            pairs: List<[PropertyName, T]> | null | undefined
+        ): Dictionary<T>;
+
+        /**
+         @see _.fromPairs
+         */
+        fromPairs(
+            pairs: List<any[]> | null | undefined
+        ): Dictionary<any>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.fromPairs
+         */
+        fromPairs<T>(
+          this: LoDashImplicitWrapper<List<[PropertyName, T]> | null | undefined>
+        ): LoDashImplicitWrapper<Dictionary<T>>;
+
+        /**
+         @see _.fromPairs
+         */
+        fromPairs(
+            this: LoDashImplicitWrapper<List<any[]> | null | undefined>
+        ): LoDashImplicitWrapper<Dictionary<any>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.fromPairs
+         */
+        fromPairs<T>(
+          this: LoDashExplicitWrapper<List<[PropertyName, T]> | null | undefined>
+        ): LoDashExplicitWrapper<Dictionary<T>>;
+
+        /**
+         @see _.fromPairs
+         */
+        fromPairs(
+            this: LoDashExplicitWrapper<List<any[]> | null | undefined>
+        ): LoDashExplicitWrapper<Dictionary<any>>;
+    }
+
+    // head
+
+    interface LoDashStatic {
+        /**
+         * Gets the first element of array.
+         *
+         * @alias _.first
+         *
+         * @param array The array to query.
+         * @return Returns the first element of array.
+         */
+        head<T>(array: List<T> | null | undefined): T | undefined;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.head
+         */
+        head<T>(this: LoDashImplicitWrapper<List<T> | null | undefined>): T | undefined;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.head
+         */
+        head<T>(this: LoDashExplicitWrapper<List<T> | null | undefined>): LoDashExplicitWrapper<T | undefined>;
+    }
+
+    // indexOf
+
+    interface LoDashStatic {
+        /**
+         * Gets the index at which the first occurrence of `value` is found in `array`
+         * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+         * for equality comparisons. If `fromIndex` is negative, it's used as the offset
+         * from the end of `array`.
+         *
+         * @category Array
+         * @param array The array to search.
+         * @param value The value to search for.
+         * @param [fromIndex=0] The index to search from.
+         * @returns Returns the index of the matched value, else `-1`.
+         * @example
+         *
+         * _.indexOf([1, 2, 1, 2], 2);
+         * // => 1
+         *
+         * // using `fromIndex`
+         * _.indexOf([1, 2, 1, 2], 2, 2);
+         * // => 3
+         */
+        indexOf<T>(
+            array: List<T> | null | undefined,
+            value: T,
+            fromIndex?: number
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.indexOf
+         */
+        indexOf<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            value: T,
+            fromIndex?: number
+        ): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.indexOf
+         */
+        indexOf<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            value: T,
+            fromIndex?: number
+        ): LoDashExplicitWrapper<number>;
+    }
+
+    // initial
+
+    interface LoDashStatic {
+        /**
+         * Gets all but the last element of array.
+         *
+         * @param array The array to query.
+         * @return Returns the slice of array.
+         */
+        initial<T>(array: List<T> | null | undefined): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.initial
+         */
+        initial<T>(this: LoDashImplicitWrapper<List<T> | null | undefined>): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.initial
+         */
+        initial<T>(this: LoDashExplicitWrapper<List<T> | null | undefined>): LoDashExplicitWrapper<T[]>;
+    }
+
+    // intersection
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of unique values that are included in all of the provided arrays using SameValueZero for
+         * equality comparisons.
+         *
+         * @param arrays The arrays to inspect.
+         * @return Returns the new array of shared values.
+         */
+        intersection<T>(...arrays: Array<List<T>>): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.intersection
+         */
+        intersection<T>(
+            this: LoDashImplicitWrapper<List<T>>,
+            ...arrays: Array<List<T>>
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.intersection
+         */
+        intersection<T>(
+            this: LoDashExplicitWrapper<List<T>>,
+            ...arrays: Array<List<T>>
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // intersectionBy
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.intersection` except that it accepts `iteratee`
+         * which is invoked for each element of each `arrays` to generate the criterion
+         * by which uniqueness is computed. The iteratee is invoked with one argument: (value).
+         *
+         * @category Array
+         * @param [arrays] The arrays to inspect.
+         * @param [iteratee=_.identity] The iteratee invoked per element.
+         * @returns Returns the new array of shared values.
+         * @example
+         *
+         * _.intersectionBy([2.1, 1.2], [4.3, 2.4], Math.floor);
+         * // => [2.1]
+         *
+         * // using the `_.property` iteratee shorthand
+         * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
+         * // => [{ 'x': 1 }]
+         */
+        intersectionBy<T1, T2>(
+            array: List<T1> | null,
+            values: List<T2>,
+            iteratee: ValueIteratee<T1 | T2>
+        ): T1[];
+
+        /**
+         * @see _.intersectionBy
+         */
+        intersectionBy<T1, T2, T3>(
+            array: List<T1> | null,
+            values1: List<T2>,
+            values2: List<T3>,
+            iteratee: ValueIteratee<T1 | T2 | T3>
+        ): T1[];
+
+        /**
+         * @see _.intersectionBy
+         */
+        intersectionBy<T1, T2, T3, T4>(
+            array: List<T1> | null | undefined,
+            values1: List<T2>,
+            values2: List<T3>,
+            ...values: Array<List<T4> | ValueIteratee<T1 | T2 | T3 | T4>>
+        ): T1[];
+
+        /**
+         * @see _.intersectionBy
+         */
+        intersectionBy<T>(
+            array?: List<T> | null,
+            ...values: Array<List<T>>
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.intersectionBy
+         */
+        intersectionBy<T1, T2>(
+            this: LoDashImplicitWrapper<List<T1> | null | undefined>,
+            values: List<T2>,
+            iteratee: ValueIteratee<T1 | T2>
+        ): LoDashImplicitWrapper<T1[]>;
+
+        /**
+         * @see _.intersectionBy
+         */
+        intersectionBy<T1, T2, T3>(
+            this: LoDashImplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            iteratee: ValueIteratee<T1 | T2 | T3>
+        ): LoDashImplicitWrapper<T1[]>;
+
+        /**
+         * @see _.intersectionBy
+         */
+        intersectionBy<T1, T2, T3, T4>(
+            this: LoDashImplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            ...values: Array<List<T4> | ValueIteratee<T1 | T2 | T3 | T4>>
+        ): LoDashImplicitWrapper<T1[]>;
+
+        /**
+         * @see _.intersectionBy
+         */
+        intersectionBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            ...values: Array<List<T>>
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.intersectionBy
+         */
+        intersectionBy<T1, T2>(
+            this: LoDashExplicitWrapper<List<T1> | null | undefined>,
+            values: List<T2>,
+            iteratee: ValueIteratee<T1 | T2>
+        ): LoDashExplicitWrapper<T1[]>;
+
+        /**
+         * @see _.intersectionBy
+         */
+        intersectionBy<T1, T2, T3>(
+            this: LoDashExplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            iteratee: ValueIteratee<T1 | T2 | T3>
+        ): LoDashExplicitWrapper<T1[]>;
+
+        /**
+         * @see _.intersectionBy
+         */
+        intersectionBy<T1, T2, T3, T4>(
+            this: LoDashExplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            ...values: Array<List<T4> | ValueIteratee<T1 | T2 | T3 | T4>>
+        ): LoDashExplicitWrapper<T1[]>;
+
+        /**
+         * @see _.intersectionBy
+         */
+        intersectionBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            ...values: Array<List<T>>
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // intersectionWith
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of unique `array` values not included in the other
+         * provided arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+         * for equality comparisons.
+         *
+         * @category Array
+         * @param [values] The arrays to inspect.
+         * @param [comparator] The comparator invoked per element.
+         * @returns Returns the new array of filtered values.
+         * @example
+         *
+         * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+         * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
+
+         * _.intersectionWith(objects, others, _.isEqual);
+         * // => [{ 'x': 1, 'y': 2 }]
+         */
+        intersectionWith<T1, T2>(
+            array: List<T1> | null | undefined,
+            values: List<T2>,
+            comparator: Comparator2<T1, T2>
+        ): T1[];
+
+        /**
+         * @see _.intersectionWith
+         */
+        intersectionWith<T1, T2, T3>(
+            array: List<T1> | null | undefined,
+            values1: List<T2>,
+            values2: List<T3>,
+            comparator: Comparator2<T1, T2 | T3>
+        ): T1[];
+
+        /**
+         * @see _.intersectionWith
+         */
+        intersectionWith<T1, T2, T3, T4>(
+            array: List<T1> | null | undefined,
+            values1: List<T2>,
+            values2: List<T3>,
+            ...values: Array<List<T4> | Comparator2<T1, T2 | T3 | T4>>
+        ): T1[];
+
+        /**
+         * @see _.intersectionWith
+         */
+        intersectionWith<T>(
+            array?: List<T> | null,
+            ...values: Array<List<T>>
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.intersectionWith
+         */
+        intersectionWith<T1, T2>(
+            this: LoDashImplicitWrapper<List<T1> | null | undefined>,
+            values: List<T2>,
+            comparator: Comparator2<T1, T2>
+        ): LoDashImplicitWrapper<T1[]>;
+
+        /**
+         * @see _.intersectionWith
+         */
+        intersectionWith<T1, T2, T3>(
+            this: LoDashImplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            comparator: Comparator2<T1, T2 | T3>
+        ): LoDashImplicitWrapper<T1[]>;
+
+        /**
+         * @see _.intersectionWith
+         */
+        intersectionWith<T1, T2, T3, T4>(
+            this: LoDashImplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            ...values: Array<List<T4> | Comparator2<T1, T2 | T3 | T4>>
+        ): LoDashImplicitWrapper<T1[]>;
+
+        /**
+         * @see _.intersectionWith
+         */
+        intersectionWith<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            ...values: Array<List<T>>
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.intersectionWith
+         */
+        intersectionWith<T1, T2>(
+            this: LoDashExplicitWrapper<List<T1> | null | undefined>,
+            values: List<T2>,
+            comparator: Comparator2<T1, T2>
+        ): LoDashExplicitWrapper<T1[]>;
+
+        /**
+         * @see _.intersectionWith
+         */
+        intersectionWith<T1, T2, T3>(
+            this: LoDashExplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            comparator: Comparator2<T1, T2 | T3>
+        ): LoDashExplicitWrapper<T1[]>;
+
+        /**
+         * @see _.intersectionWith
+         */
+        intersectionWith<T1, T2, T3, T4>(
+            this: LoDashExplicitWrapper<List<T1> | null | undefined>,
+            values1: List<T2>,
+            values2: List<T3>,
+            ...values: Array<List<T4> | Comparator2<T1, T2 | T3 | T4>>
+        ): LoDashExplicitWrapper<T1[]>;
+
+        /**
+         * @see _.intersectionWith
+         */
+        intersectionWith<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            ...values: Array<List<T>>
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // join
+
+    interface LoDashStatic {
+        /**
+         * Converts all elements in `array` into a string separated by `separator`.
+         *
+         * @param array The array to convert.
+         * @param separator The element separator.
+         * @returns Returns the joined string.
+         */
+        join(
+            array: List<any> | null | undefined,
+            separator?: string
+        ): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.join
+         */
+        join(separator?: string): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.join
+         */
+        join(separator?: string): LoDashExplicitWrapper<string>;
+    }
+
+    // last
+
+    interface LoDashStatic {
+        /**
+         * Gets the last element of array.
+         *
+         * @param array The array to query.
+         * @return Returns the last element of array.
+         */
+        last<T>(array: List<T> | null | undefined): T | undefined;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.last
+         */
+        last<T>(this: LoDashImplicitWrapper<List<T> | null | undefined>): T | undefined;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.last
+         */
+        last<T>(this: LoDashExplicitWrapper<List<T> | null | undefined>): LoDashExplicitWrapper<T | undefined>;
+    }
+
+    // lastIndexOf
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.indexOf except that it iterates over elements of array from right to left.
+         *
+         * @param array The array to search.
+         * @param value The value to search for.
+         * @param fromIndex The index to search from or true to perform a binary search on a sorted array.
+         * @return Returns the index of the matched value, else -1.
+         */
+        lastIndexOf<T>(
+            array: List<T> | null | undefined,
+            value: T,
+            fromIndex?: true|number
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.indexOf
+         */
+        lastIndexOf<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            value: T,
+            fromIndex?: true|number
+        ): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.indexOf
+         */
+        lastIndexOf<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            value: T,
+            fromIndex?: true|number
+        ): LoDashExplicitWrapper<number>;
+    }
+
+    // nth
+
+    interface LoDashStatic {
+        /**
+         * Gets the element at index `n` of `array`. If `n` is negative, the nth element from the end is returned.
+         *
+         * @param array array The array to query.
+         * @param value The index of the element to return.
+         * @return Returns the nth element of `array`.
+         */
+        nth<T>(
+            array: List<T> | null | undefined,
+            n?: number
+        ): T | undefined;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.nth
+         */
+        nth<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            n?: number
+        ): T | undefined;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.nth
+         */
+        nth<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            n?: number
+        ): LoDashExplicitWrapper<T | undefined>;
+    }
+
+    // pull
+
+    interface LoDashStatic {
+        /**
+         * Removes all provided values from array using SameValueZero for equality comparisons.
+         *
+         * Note: Unlike _.without, this method mutates array.
+         *
+         * @param array The array to modify.
+         * @param values The values to remove.
+         * @return Returns array.
+         */
+        pull<T>(
+            array: T[],
+            ...values: T[]
+        ): T[];
+
+        /**
+         * @see _.pull
+         */
+        pull<T>(
+            array: List<T>,
+            ...values: T[]
+        ): List<T>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.pull
+         */
+        pull<T>(
+            this: LoDashImplicitWrapper<List<T>>,
+            ...values: T[]
+        ): this;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.pull
+         */
+        pull<T>(
+            this: LoDashExplicitWrapper<List<T>>,
+            ...values: T[]
+        ): this;
+    }
+
+    // pullAll
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.pull` except that it accepts an array of values to remove.
+         *
+         * **Note:** Unlike `_.difference`, this method mutates `array`.
+         *
+         * @category Array
+         * @param array The array to modify.
+         * @param values The values to remove.
+         * @returns Returns `array`.
+         * @example
+         *
+         * var array = [1, 2, 3, 1, 2, 3];
+         *
+         * _.pull(array, [2, 3]);
+         * console.log(array);
+         * // => [1, 1]
+         */
+        pullAll<T>(
+            array: T[],
+            values?: List<T>,
+        ): T[];
+
+        /**
+         * @see _.pullAll
+         */
+        pullAll<T>(
+            array: List<T>,
+            values?: List<T>,
+        ): List<T>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.pullAll
+         */
+        pullAll<T>(
+            this: LoDashImplicitWrapper<List<T>>,
+            values?: List<T>
+        ): this;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.pullAll
+         */
+        pullAll<T>(
+            this: LoDashExplicitWrapper<List<T>>,
+            values?: List<T>
+        ): this;
+    }
+
+    // pullAllBy
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.pullAll` except that it accepts `iteratee` which is
+         * invoked for each element of `array` and `values` to to generate the criterion
+         * by which uniqueness is computed. The iteratee is invoked with one argument: (value).
+         *
+         * **Note:** Unlike `_.differenceBy`, this method mutates `array`.
+         *
+         * @category Array
+         * @param array The array to modify.
+         * @param values The values to remove.
+         * @param [iteratee=_.identity] The iteratee invoked per element.
+         * @returns Returns `array`.
+         * @example
+         *
+         * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
+         *
+         * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
+         * console.log(array);
+         * // => [{ 'x': 2 }]
+         */
+        pullAllBy<T>(
+            array: T[],
+            values?: List<T>,
+            iteratee?: ValueIteratee<T>
+        ): T[];
+
+        /**
+         * @see _.pullAllBy
+         */
+        pullAllBy<T>(
+            array: List<T>,
+            values?: List<T>,
+            iteratee?: ValueIteratee<T>
+        ): List<T>;
+
+        /**
+         * @see _.pullAllBy
+         */
+        pullAllBy<T1, T2>(
+            array: T1[],
+            values: List<T2>,
+            iteratee: ValueIteratee<T1 | T2>
+        ): T1[];
+
+        /**
+         * @see _.pullAllBy
+         */
+        pullAllBy<T1, T2>(
+            array: List<T1>,
+            values: List<T2>,
+            iteratee: ValueIteratee<T1 | T2>
+        ): List<T1>;
+    }
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * @see _.pullAllBy
+         */
+        pullAllBy<T>(
+            this: LoDashWrapper<List<T>>,
+            values?: List<T>,
+            iteratee?: ValueIteratee<T>
+        ): this;
+
+        /**
+         * @see _.pullAllBy
+         */
+        pullAllBy<T1, T2>(
+            this: LoDashWrapper<List<T1>>,
+            values: List<T2>,
+            iteratee: ValueIteratee<T1 | T2>
+        ): this;
+    }
+
+    // pullAllWith
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.pullAll` except that it accepts `comparator` which is
+         * invoked to compare elements of array to values. The comparator is invoked with
+         * two arguments: (arrVal, othVal).
+         *
+         * **Note:** Unlike `_.differenceWith`, this method mutates `array`.
+         *
+         * @category Array
+         * @param array The array to modify.
+         * @param values The values to remove.
+         * @param [iteratee=_.identity] The iteratee invoked per element.
+         * @returns Returns `array`.
+         * @example
+         *
+         * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
+         *
+         * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
+         * console.log(array);
+         * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
+         */
+        pullAllWith<T>(
+            array: T[],
+            values?: List<T>,
+            comparator?: Comparator<T>
+        ): T[];
+
+        /**
+         * @see _.pullAllWith
+         */
+        pullAllWith<T>(
+            array: List<T>,
+            values?: List<T>,
+            comparator?: Comparator<T>
+        ): List<T>;
+
+        /**
+         * @see _.pullAllWith
+         */
+        pullAllWith<T1, T2>(
+            array: T1[],
+            values: List<T2>,
+            comparator: Comparator2<T1, T2>
+        ): T1[];
+
+        /**
+         * @see _.pullAllWith
+         */
+        pullAllWith<T1, T2>(
+            array: List<T1>,
+            values: List<T2>,
+            comparator: Comparator2<T1, T2>
+        ): List<T1>;
+    }
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * @see _.pullAllWith
+         */
+        pullAllWith<T>(
+            this: LoDashWrapper<List<T>>,
+            values?: List<T>,
+            comparator?: Comparator<T>
+        ): this;
+
+        /**
+         * @see _.pullAllWith
+         */
+        pullAllWith<T1, T2>(
+            this: LoDashWrapper<List<T1>>,
+            values: List<T2>,
+            comparator: Comparator2<T1, T2>
+        ): this;
+    }
+
+    // pullAt
+
+    interface LoDashStatic {
+        /**
+         * Removes elements from array corresponding to the given indexes and returns an array of the removed elements.
+         * Indexes may be specified as an array of indexes or as individual arguments.
+         *
+         * Note: Unlike _.at, this method mutates array.
+         *
+         * @param array The array to modify.
+         * @param indexes The indexes of elements to remove, specified as individual indexes or arrays of indexes.
+         * @return Returns the new array of removed elements.
+         */
+        pullAt<T>(
+            array: T[],
+            ...indexes: Array<Many<number>>
+        ): T[];
+
+        /**
+         * @see _.pullAt
+         */
+        pullAt<T>(
+            array: List<T>,
+            ...indexes: Array<Many<number>>
+        ): List<T>;
+    }
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * @see _.pullAt
+         */
+        pullAt(...indexes: Array<Many<number>>): this;
+    }
+
+    // remove
+
+    interface LoDashStatic {
+        /**
+         * Removes all elements from array that predicate returns truthy for and returns an array of the removed
+         * elements. The predicate is invoked with three arguments: (value, index, array).
+         *
+         * Note: Unlike _.filter, this method mutates array.
+         *
+         * @param array The array to modify.
+         * @param predicate The function invoked per iteration.
+         * @return Returns the new array of removed elements.
+         */
+        remove<T>(
+            array: List<T>,
+            predicate?: ListIteratee<T>
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.remove
+         */
+        remove<T>(
+            this: LoDashImplicitWrapper<List<T>>,
+            predicate?: ListIteratee<T>
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.remove
+         */
+        remove<T>(
+            this: LoDashExplicitWrapper<List<T>>,
+            predicate?: ListIteratee<T>
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // reverse
+
+    interface LoDashStatic {
+        /**
+         * Reverses `array` so that the first element becomes the last, the second
+         * element becomes the second to last, and so on.
+         *
+         * **Note:** This method mutates `array` and is based on
+         * [`Array#reverse`](https://mdn.io/Array/reverse).
+         *
+         * @category Array
+         * @returns Returns `array`.
+         * @example
+         *
+         * var array = [1, 2, 3];
+         *
+         * _.reverse(array);
+         * // => [3, 2, 1]
+         *
+         * console.log(array);
+         * // => [3, 2, 1]
+         */
+        reverse<TList extends List<any>>(
+            array: TList,
+        ): TList;
+    }
+
+    // slice
+
+    interface LoDashStatic {
+        /**
+         * Creates a slice of array from start up to, but not including, end.
+         *
+         * @param array The array to slice.
+         * @param start The start position.
+         * @param end The end position.
+         * @return Returns the slice of array.
+         */
+        slice<T>(
+            array: List<T> | null | undefined,
+            start?: number,
+            end?: number
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.slice
+         */
+        slice<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            start?: number,
+            end?: number
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.slice
+         */
+        slice<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            start?: number,
+            end?: number
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // sortedIndex
+
+    interface LoDashStatic {
+        /**
+         * Uses a binary search to determine the lowest index at which `value` should
+         * be inserted into `array` in order to maintain its sort order.
+         *
+         * @category Array
+         * @param array The sorted array to inspect.
+         * @param value The value to evaluate.
+         * @returns Returns the index at which `value` should be inserted into `array`.
+         * @example
+         *
+         * _.sortedIndex([30, 50], 40);
+         * // => 1
+         *
+         * _.sortedIndex([4, 5], 4);
+         * // => 0
+         */
+        sortedIndex<T>(
+            array: List<T> | null | undefined,
+            value: T
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.sortedIndex
+         */
+        sortedIndex<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            value: T
+        ): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.sortedIndex
+         */
+        sortedIndex<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            value: T
+        ): LoDashExplicitWrapper<number>;
+    }
+
+    // sortedIndexBy
+
+    interface LoDashStatic {
+        /**
+         * Uses a binary search to determine the lowest index at which `value` should
+         * be inserted into `array` in order to maintain its sort order.
+         *
+         * @category Array
+         * @param array The sorted array to inspect.
+         * @param value The value to evaluate.
+         * @returns Returns the index at which `value` should be inserted into `array`.
+         * @example
+         *
+         * _.sortedIndex([30, 50], 40);
+         * // => 1
+         *
+         * _.sortedIndex([4, 5], 4);
+         * // => 0
+         */
+        sortedIndex<T>(
+            array: List<T> | null | undefined,
+            value: T
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.sortedIndex
+         */
+        sortedIndex<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            value: T
+        ): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.sortedIndex
+         */
+        sortedIndex<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            value: T
+        ): LoDashExplicitWrapper<number>;
+    }
+
+    // _.sortedIndexBy
+    interface LoDashStatic {
+        /**
+         * This method is like `_.sortedIndex` except that it accepts `iteratee`
+         * which is invoked for `value` and each element of `array` to compute their
+         * sort ranking. The iteratee is invoked with one argument: (value).
+         *
+         * @category Array
+         * @param array The sorted array to inspect.
+         * @param value The value to evaluate.
+         * @param [iteratee=_.identity] The iteratee invoked per element.
+         * @returns Returns the index at which `value` should be inserted into `array`.
+         * @example
+         *
+         * var dict = { 'thirty': 30, 'forty': 40, 'fifty': 50 };
+         *
+         * _.sortedIndexBy(['thirty', 'fifty'], 'forty', _.propertyOf(dict));
+         * // => 1
+         *
+         * // using the `_.property` iteratee shorthand
+         * _.sortedIndexBy([{ 'x': 4 }, { 'x': 5 }], { 'x': 4 }, 'x');
+         * // => 0
+         */
+        sortedIndexBy<T>(
+            array: List<T> | null | undefined,
+            value: T,
+            iteratee?: ValueIteratee<T>
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.sortedIndexBy
+         */
+        sortedIndexBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            value: T,
+            iteratee?: ValueIteratee<T>
+        ): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.sortedIndexBy
+         */
+        sortedIndexBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            value: T,
+            iteratee?: ValueIteratee<T>
+        ): LoDashExplicitWrapper<number>;
+    }
+
+    // sortedIndexOf
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.indexOf` except that it performs a binary
+         * search on a sorted `array`.
+         *
+         * @category Array
+         * @param array The array to search.
+         * @param value The value to search for.
+         * @returns Returns the index of the matched value, else `-1`.
+         * @example
+         *
+         * _.sortedIndexOf([1, 1, 2, 2], 2);
+         * // => 2
+         */
+        sortedIndexOf<T>(
+            array: List<T> | null | undefined,
+            value: T
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.sortedIndexOf
+         */
+        sortedIndexOf<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            value: T
+        ): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.sortedIndexOf
+         */
+        sortedIndexOf<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            value: T
+        ): LoDashExplicitWrapper<number>;
+    }
+
+    // sortedLastIndex
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.sortedIndex` except that it returns the highest
+         * index at which `value` should be inserted into `array` in order to
+         * maintain its sort order.
+         *
+         * @category Array
+         * @param array The sorted array to inspect.
+         * @param value The value to evaluate.
+         * @returns Returns the index at which `value` should be inserted into `array`.
+         * @example
+         *
+         * _.sortedLastIndex([4, 5], 4);
+         * // => 1
+         */
+        sortedLastIndex<T>(
+            array: List<T> | null | undefined,
+            value: T
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.sortedLastIndex
+         */
+        sortedLastIndex<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            value: T
+        ): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.sortedLastIndex
+         */
+        sortedLastIndex<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            value: T
+        ): LoDashExplicitWrapper<number>;
+    }
+
+    // sortedLastIndexBy
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.sortedLastIndex` except that it accepts `iteratee`
+         * which is invoked for `value` and each element of `array` to compute their
+         * sort ranking. The iteratee is invoked with one argument: (value).
+         *
+         * @category Array
+         * @param array The sorted array to inspect.
+         * @param value The value to evaluate.
+         * @param [iteratee=_.identity] The iteratee invoked per element.
+         * @returns Returns the index at which `value` should be inserted into `array`.
+         * @example
+         *
+         * // using the `_.property` iteratee shorthand
+         * _.sortedLastIndexBy([{ 'x': 4 }, { 'x': 5 }], { 'x': 4 }, 'x');
+         * // => 1
+         */
+        sortedLastIndexBy<T>(
+            array: List<T> | null | undefined,
+            value: T,
+            iteratee: ValueIteratee<T>
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.sortedLastIndexBy
+         */
+        sortedLastIndexBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            value: T,
+            iteratee: ValueIteratee<T>
+        ): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.sortedLastIndexBy
+         */
+        sortedLastIndexBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            value: T,
+            iteratee: ValueIteratee<T>
+        ): LoDashExplicitWrapper<number>;
+    }
+
+    // sortedLastIndexOf
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.lastIndexOf` except that it performs a binary
+         * search on a sorted `array`.
+         *
+         * @category Array
+         * @param array The array to search.
+         * @param value The value to search for.
+         * @returns Returns the index of the matched value, else `-1`.
+         * @example
+         *
+         * _.sortedLastIndexOf([1, 1, 2, 2], 2);
+         * // => 3
+         */
+        sortedLastIndexOf<T>(
+            array: List<T> | null | undefined,
+            value: T
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.sortedLastIndexOf
+         */
+        sortedLastIndexOf<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            value: T
+        ): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.sortedLastIndexOf
+         */
+        sortedLastIndexOf<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            value: T
+        ): LoDashExplicitWrapper<number>;
+    }
+
+    // sortedUniq
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.uniq` except that it's designed and optimized
+         * for sorted arrays.
+         *
+         * @category Array
+         * @param array The array to inspect.
+         * @returns Returns the new duplicate free array.
+         * @example
+         *
+         * _.sortedUniq([1, 1, 2]);
+         * // => [1, 2]
+         */
+        sortedUniq<T>(
+            array: List<T> | null | undefined
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.sortedUniq
+         */
+        sortedUniq<T>(this: LoDashImplicitWrapper<List<T> | null | undefined>): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.sortedUniq
+         */
+        sortedUniq<T>(this: LoDashExplicitWrapper<List<T> | null | undefined>): LoDashExplicitWrapper<T[]>;
+    }
+
+    // sortedUniqBy
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.uniqBy` except that it's designed and optimized
+         * for sorted arrays.
+         *
+         * @category Array
+         * @param array The array to inspect.
+         * @param [iteratee] The iteratee invoked per element.
+         * @returns Returns the new duplicate free array.
+         * @example
+         *
+         * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
+         * // => [1.1, 2.2]
+         */
+        sortedUniqBy<T>(
+            array: List<T> | null | undefined,
+            iteratee: ValueIteratee<T>
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.sortedUniqBy
+         */
+        sortedUniqBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            iteratee: ValueIteratee<T>
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.sortedUniqBy
+         */
+        sortedUniqBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            iteratee: ValueIteratee<T>
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // tail
+
+    interface LoDashStatic {
+        /**
+         * Gets all but the first element of array.
+         *
+         * @param array The array to query.
+         * @return Returns the slice of array.
+         */
+        tail<T>(array: List<T> | null | undefined): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.tail
+         */
+        tail<T>(this: LoDashImplicitWrapper<List<T> | null | undefined>): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.tail
+         */
+        tail<T>(this: LoDashExplicitWrapper<List<T> | null | undefined>): LoDashExplicitWrapper<T[]>;
+    }
+
+    // take
+
+    interface LoDashStatic {
+        /**
+         * Creates a slice of array with n elements taken from the beginning.
+         *
+         * @param array The array to query.
+         * @param n The number of elements to take.
+         * @return Returns the slice of array.
+         */
+        take<T>(
+            array: List<T> | null | undefined,
+            n?: number
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.take
+         */
+        take<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            n?: number
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.take
+         */
+        take<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            n?: number
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // takeRight
+
+    interface LoDashStatic {
+        /**
+         * Creates a slice of array with n elements taken from the end.
+         *
+         * @param array The array to query.
+         * @param n The number of elements to take.
+         * @return Returns the slice of array.
+         */
+        takeRight<T>(
+            array: List<T> | null | undefined,
+            n?: number
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.takeRight
+         */
+        takeRight<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            n?: number
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.takeRight
+         */
+        takeRight<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            n?: number
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // takeRightWhile
+
+    interface LoDashStatic {
+        /**
+         * Creates a slice of array with elements taken from the end. Elements are taken until predicate returns
+         * falsey. The predicate is invoked with three arguments: (value, index, array).
+         *
+         * @param array The array to query.
+         * @param predicate The function invoked per iteration.
+         * @return Returns the slice of array.
+         */
+        takeRightWhile<T>(
+            array: List<T> | null | undefined,
+            predicate?: ListIteratee<T>
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.takeRightWhile
+         */
+        takeRightWhile<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIteratee<T>
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.takeRightWhile
+         */
+        takeRightWhile<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIteratee<T>
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // takeWhile
+
+    interface LoDashStatic {
+        /**
+         * Creates a slice of array with elements taken from the beginning. Elements are taken until predicate returns
+         * falsey. The predicate is invoked with three arguments: (value, index, array).
+         *
+         * @param array The array to query.
+         * @param predicate The function invoked per iteration.
+         * @return Returns the slice of array.
+         */
+        takeWhile<T>(
+            array: List<T> | null | undefined,
+            predicate?: ListIteratee<T>
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.takeWhile
+         */
+        takeWhile<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIteratee<T>
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.takeWhile
+         */
+        takeWhile<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIteratee<T>
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // union
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of unique values, in order, from all of the provided arrays using SameValueZero for
+         * equality comparisons.
+         *
+         * @param arrays The arrays to inspect.
+         * @return Returns the new array of combined values.
+         */
+        union<T>(...arrays: Array<List<T> | null | undefined>): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.union
+         */
+        union<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            ...arrays: Array<List<T> | null | undefined>
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.union
+         */
+        union<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            ...arrays: Array<List<T> | null | undefined>
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // unionBy
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.union` except that it accepts `iteratee` which is
+         * invoked for each element of each `arrays` to generate the criterion by which
+         * uniqueness is computed. The iteratee is invoked with one argument: (value).
+         *
+         * @param arrays The arrays to inspect.
+         * @param iteratee The iteratee invoked per element.
+         * @return Returns the new array of combined values.
+         */
+        unionBy<T>(
+            arrays: List<T> | null | undefined,
+            iteratee?: ValueIteratee<T>
+        ): T[];
+
+        /**
+         * @see _.unionBy
+         */
+        unionBy<T>(
+            arrays1: List<T> | null | undefined,
+            arrays2: List<T> | null | undefined,
+            iteratee?: ValueIteratee<T>
+        ): T[];
+
+        /**
+         * @see _.unionBy
+         */
+        unionBy<T>(
+            arrays1: List<T> | null | undefined,
+            arrays2: List<T> | null | undefined,
+            arrays3: List<T> | null | undefined,
+            iteratee?: ValueIteratee<T>
+        ): T[];
+
+        /**
+         * @see _.unionBy
+         */
+        unionBy<T>(
+            arrays1: List<T> | null | undefined,
+            arrays2: List<T> | null | undefined,
+            arrays3: List<T> | null | undefined,
+            arrays4: List<T> | null | undefined,
+            iteratee?: ValueIteratee<T>
+        ): T[];
+
+        /**
+         * @see _.unionBy
+         */
+        unionBy<T>(
+            arrays1: List<T> | null | undefined,
+            arrays2: List<T> | null | undefined,
+            arrays3: List<T> | null | undefined,
+            arrays4: List<T> | null | undefined,
+            arrays5: List<T> | null | undefined,
+            ...iteratee: Array<ValueIteratee<T> | List<T> | null | undefined>
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.unionBy
+         */
+        unionBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            iteratee?: ValueIteratee<T>
+        ): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.unionBy
+         */
+        unionBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            arrays2: List<T> | null | undefined,
+            iteratee?: ValueIteratee<T>
+        ): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.unionBy
+         */
+        unionBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            arrays2: List<T> | null | undefined,
+            arrays3: List<T> | null | undefined,
+            iteratee?: ValueIteratee<T>
+        ): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.unionBy
+         */
+        unionBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            arrays2: List<T> | null | undefined,
+            arrays3: List<T> | null | undefined,
+            arrays4: List<T> | null | undefined,
+            iteratee?: ValueIteratee<T>
+        ): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.unionBy
+         */
+        unionBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            arrays2: List<T> | null | undefined,
+            arrays3: List<T> | null | undefined,
+            arrays4: List<T> | null | undefined,
+            arrays5: List<T> | null | undefined,
+            ...iteratee: Array<ValueIteratee<T> | List<T> | null | undefined>
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.unionBy
+         */
+        unionBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            iteratee?: ValueIteratee<T>
+        ): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.unionBy
+         */
+        unionBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            arrays2: List<T> | null | undefined,
+            iteratee?: ValueIteratee<T>
+        ): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.unionBy
+         */
+        unionBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            arrays2: List<T> | null | undefined,
+            arrays3: List<T> | null | undefined,
+            iteratee?: ValueIteratee<T>
+        ): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.unionBy
+         */
+        unionBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            arrays2: List<T> | null | undefined,
+            arrays3: List<T> | null | undefined,
+            arrays4: List<T> | null | undefined,
+            iteratee?: ValueIteratee<T>
+        ): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.unionBy
+         */
+        unionBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            arrays2: List<T> | null | undefined,
+            arrays3: List<T> | null | undefined,
+            arrays4: List<T> | null | undefined,
+            arrays5: List<T> | null | undefined,
+            ...iteratee: Array<ValueIteratee<T> | List<T> | null | undefined>
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // unionWith
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.union` except that it accepts `comparator` which
+         * is invoked to compare elements of `arrays`. The comparator is invoked
+         * with two arguments: (arrVal, othVal).
+         *
+         * @category Array
+         * @param [arrays] The arrays to inspect.
+         * @param [comparator] The comparator invoked per element.
+         * @returns Returns the new array of combined values.
+         * @example
+         *
+         * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+         * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
+         *
+         * _.unionWith(objects, others, _.isEqual);
+         * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
+         */
+        unionWith<T>(
+            arrays: List<T> | null | undefined,
+            comparator?: Comparator<T>
+        ): T[];
+
+        /**
+         * @see _.unionBy
+         */
+        unionWith<T>(
+            arrays: List<T> | null | undefined,
+            arrays2: List<T> | null | undefined,
+            comparator?: Comparator<T>
+        ): T[];
+
+        /**
+         * @see _.unionWith
+         */
+        unionWith<T>(
+            arrays: List<T> | null | undefined,
+            arrays2: List<T> | null | undefined,
+            arrays3: List<T> | null | undefined,
+            ...comparator: Array<Comparator<T> | List<T> | null | undefined>
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.unionWith
+         */
+        unionWith<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            comparator?: Comparator<T>
+        ): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.unionWith
+         */
+        unionWith<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            arrays2: List<T> | null | undefined,
+            comparator?: Comparator<T>
+        ): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.unionWith
+         */
+        unionWith<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            arrays2: List<T> | null | undefined,
+            arrays3: List<T> | null | undefined,
+            ...comparator: Array<Comparator<T> | List<T> | null | undefined>
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.unionWith
+         */
+        unionWith<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            comparator?: Comparator<T>
+        ): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.unionWith
+         */
+        unionWith<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            arrays2: List<T> | null | undefined,
+            comparator?: Comparator<T>
+        ): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.unionWith
+         */
+        unionWith<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            arrays2: List<T> | null | undefined,
+            arrays3: List<T> | null | undefined,
+            ...comparator: Array<Comparator<T> | List<T> | null | undefined>
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // uniq
+
+    interface LoDashStatic {
+        /**
+         * Creates a duplicate-free version of an array, using
+         * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+         * for equality comparisons, in which only the first occurrence of each element
+         * is kept.
+         *
+         * @category Array
+         * @param array The array to inspect.
+         * @returns Returns the new duplicate free array.
+         * @example
+         *
+         * _.uniq([2, 1, 2]);
+         * // => [2, 1]
+         */
+        uniq<T>(
+            array: List<T> | null | undefined
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.uniq
+         */
+        uniq<T>(this: LoDashImplicitWrapper<List<T> | null | undefined>): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.uniq
+         */
+        uniq<T>(this: LoDashExplicitWrapper<List<T> | null | undefined>): LoDashExplicitWrapper<T[]>;
+    }
+
+    // uniqBy
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.uniq` except that it accepts `iteratee` which is
+         * invoked for each element in `array` to generate the criterion by which
+         * uniqueness is computed. The iteratee is invoked with one argument: (value).
+         *
+         * @category Array
+         * @param array The array to inspect.
+         * @param [iteratee=_.identity] The iteratee invoked per element.
+         * @returns Returns the new duplicate free array.
+         * @example
+         *
+         * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
+         * // => [2.1, 1.2]
+         *
+         * // using the `_.property` iteratee shorthand
+         * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
+         * // => [{ 'x': 1 }, { 'x': 2 }]
+         */
+        uniqBy<T>(
+            array: List<T> | null | undefined,
+            iteratee: ValueIteratee<T>
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.uniqBy
+         */
+        uniqBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            iteratee: ValueIteratee<T>
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.uniqBy
+         */
+        uniqBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            iteratee: ValueIteratee<T>
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // uniqWith
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.uniq` except that it accepts `comparator` which
+         * is invoked to compare elements of `array`. The comparator is invoked with
+         * two arguments: (arrVal, othVal).
+         *
+         * @category Array
+         * @param array The array to inspect.
+         * @param [comparator] The comparator invoked per element.
+         * @returns Returns the new duplicate free array.
+         * @example
+         *
+         * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 },  { 'x': 1, 'y': 2 }];
+         *
+         * _.uniqWith(objects, _.isEqual);
+         * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
+         */
+        uniqWith<T>(
+            array: List<T> | null | undefined,
+            comparator?: Comparator<T>
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.uniqWith
+         */
+        uniqWith<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            comparator?: Comparator<T>
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.uniqWith
+         */
+        uniqWith<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            comparator?: Comparator<T>
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // unzip
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.zip except that it accepts an array of grouped elements and creates an array
+         * regrouping the elements to their pre-zip configuration.
+         *
+         * @param array The array of grouped elements to process.
+         * @return Returns the new array of regrouped elements.
+         */
+        unzip<T>(array: T[][] | List<List<T>> | null | undefined): T[][];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.unzip
+         */
+        unzip<T>(this: LoDashImplicitWrapper<T[][] | List<List<T>> | null | undefined>): LoDashImplicitWrapper<T[][]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.unzip
+         */
+        unzip<T>(this: LoDashExplicitWrapper<T[][] | List<List<T>> | null | undefined>): LoDashExplicitWrapper<T[][]>;
+    }
+
+    // unzipWith
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.unzip except that it accepts an iteratee to specify how regrouped values should be
+         * combined. The iteratee is invoked with four arguments: (accumulator, value, index, group).
+         *
+         * @param array The array of grouped elements to process.
+         * @param iteratee The function to combine regrouped values.
+         * @return Returns the new array of regrouped elements.
+         */
+        unzipWith<T, TResult>(
+            array: List<List<T>> | null | undefined,
+            iteratee: (...values: T[]) => TResult
+        ): TResult[];
+
+        /**
+         * @see _.unzipWith
+         */
+        unzipWith<T>(
+            array: List<List<T>> | null | undefined
+        ): T[][];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.unzipWith
+         */
+        unzipWith<T, TResult>(
+            this: LoDashImplicitWrapper<List<List<T>> | null | undefined>,
+            iteratee: (...values: T[]) => TResult
+        ): LoDashImplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.unzipWith
+         */
+        unzipWith<T>(
+            this: LoDashImplicitWrapper<List<List<T>> | null | undefined>
+        ): LoDashImplicitWrapper<T[][]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.unzipWith
+         */
+        unzipWith<T, TResult>(
+            this: LoDashExplicitWrapper<List<List<T>> | null | undefined>,
+            iteratee: (...values: T[]) => TResult
+        ): LoDashExplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.unzipWith
+         */
+        unzipWith<T>(
+            this: LoDashExplicitWrapper<List<List<T>> | null | undefined>
+        ): LoDashExplicitWrapper<T[][]>;
+    }
+
+    // without
+
+    interface LoDashStatic {
+        /**
+         * Creates an array excluding all provided values using SameValueZero for equality comparisons.
+         *
+         * @param array The array to filter.
+         * @param values The values to exclude.
+         * @return Returns the new array of filtered values.
+         */
+        without<T>(
+            array: List<T> | null | undefined,
+            ...values: T[]
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.without
+         */
+        without<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            ...values: T[]
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.without
+         */
+        without<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            ...values: T[]
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // xor
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of unique values that is the symmetric difference of the provided arrays.
+         *
+         * @param arrays The arrays to inspect.
+         * @return Returns the new array of values.
+         */
+        xor<T>(...arrays: Array<List<T> | null | undefined>): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.xor
+         */
+        xor<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            ...arrays: Array<List<T> | null | undefined>
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.xor
+         */
+        xor<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            ...arrays: Array<List<T> | null | undefined>
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // xorBy
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.xor` except that it accepts `iteratee` which is
+         * invoked for each element of each `arrays` to generate the criterion by which
+         * uniqueness is computed. The iteratee is invoked with one argument: (value).
+         *
+         * @category Array
+         * @param [arrays] The arrays to inspect.
+         * @param [iteratee=_.identity] The iteratee invoked per element.
+         * @returns Returns the new array of values.
+         * @example
+         *
+         * _.xorBy([2.1, 1.2], [4.3, 2.4], Math.floor);
+         * // => [1.2, 4.3]
+         *
+         * // using the `_.property` iteratee shorthand
+         * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
+         * // => [{ 'x': 2 }]
+         */
+        xorBy<T>(
+            arrays: List<T> | null | undefined,
+            iteratee?: ValueIteratee<T>
+        ): T[];
+
+        /**
+         * @see _.xorBy
+         */
+        xorBy<T>(
+            arrays: List<T> | null | undefined,
+            arrays2: List<T> | null | undefined,
+            iteratee?: ValueIteratee<T>
+        ): T[];
+
+        /**
+         * @see _.xorBy
+         */
+        xorBy<T>(
+            arrays: List<T> | null | undefined,
+            arrays2: List<T> | null | undefined,
+            arrays3: List<T> | null | undefined,
+            ...iteratee: Array<ValueIteratee<T> | List<T> | null | undefined>
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.xor
+         */
+        xorBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            iteratee?: ValueIteratee<T>
+        ): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.xorBy
+         */
+        xorBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            arrays2: List<T> | null | undefined,
+            iteratee?: ValueIteratee<T>
+        ): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.xorBy
+         */
+        xorBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            arrays2: List<T> | null | undefined,
+            arrays3: List<T> | null | undefined,
+            ...iteratee: Array<ValueIteratee<T> | List<T> | null | undefined>
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.xorBy
+         */
+        xorBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            iteratee?: ValueIteratee<T>
+        ): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.xorBy
+         */
+        xorBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            arrays2: List<T> | null | undefined,
+            iteratee?: ValueIteratee<T>
+        ): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.xorBy
+         */
+        xorBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            arrays2: List<T> | null | undefined,
+            arrays3: List<T> | null | undefined,
+            ...iteratee: Array<ValueIteratee<T> | List<T> | null | undefined>
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // xorWith
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.xor` except that it accepts `comparator` which is
+         * invoked to compare elements of `arrays`. The comparator is invoked with
+         * two arguments: (arrVal, othVal).
+         *
+         * @category Array
+         * @param [arrays] The arrays to inspect.
+         * @param [comparator] The comparator invoked per element.
+         * @returns Returns the new array of values.
+         * @example
+         *
+         * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+         * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
+         *
+         * _.xorWith(objects, others, _.isEqual);
+         * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
+         */
+        xorWith<T>(
+            arrays: List<T> | null | undefined,
+            comparator?: Comparator<T>
+        ): T[];
+
+        /**
+         * @see _.xorWith
+         */
+        xorWith<T>(
+            arrays: List<T> | null | undefined,
+            arrays2: List<T> | null | undefined,
+            comparator?: Comparator<T>
+        ): T[];
+
+        /**
+         * @see _.xorWith
+         */
+        xorWith<T>(
+            arrays: List<T> | null | undefined,
+            arrays2: List<T> | null | undefined,
+            arrays3: List<T> | null | undefined,
+            ...comparator: Array<Comparator<T> | List<T> | null | undefined>
+        ): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.xorWith
+         */
+        xorWith<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            comparator?: Comparator<T>
+        ): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.xorWith
+         */
+        xorWith<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            arrays2: List<T> | null | undefined,
+            comparator?: Comparator<T>
+        ): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.xorWith
+         */
+        xorWith<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            arrays2: List<T> | null | undefined,
+            arrays3: List<T> | null | undefined,
+            ...comparator: Array<Comparator<T> | List<T> | null | undefined>
+        ): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.xorWith
+         */
+        xorWith<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            comparator?: Comparator<T>
+        ): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.xorWith
+         */
+        xorWith<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            arrays2: List<T> | null | undefined,
+            comparator?: Comparator<T>
+        ): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.xorWith
+         */
+        xorWith<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            arrays2: List<T> | null | undefined,
+            arrays3: List<T> | null | undefined,
+            ...comparator: Array<Comparator<T> | List<T> | null | undefined>
+        ): LoDashExplicitWrapper<T[]>;
+    }
+
+    // zip
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of grouped elements, the first of which contains the first elements of the given arrays,
+         * the second of which contains the second elements of the given arrays, and so on.
+         *
+         * @param arrays The arrays to process.
+         * @return Returns the new array of grouped elements.
+         */
+        zip<T1, T2>(arrays1: List<T1>, arrays2: List<T2>): Array<[T1 | undefined, T2 | undefined]>;
+
+        /**
+         * @see _.zip
+         */
+        zip<T1, T2, T3>(arrays1: List<T1>, arrays2: List<T2>, arrays3: List<T3>): Array<[T1 | undefined, T2 | undefined, T3 | undefined]>;
+
+        /**
+         * @see _.zip
+         */
+        zip<T1, T2, T3, T4>(arrays1: List<T1>, arrays2: List<T2>, arrays3: List<T3>, arrays4: List<T4>): Array<[T1 | undefined, T2 | undefined, T3 | undefined, T4 | undefined]>;
+
+        /**
+         * @see _.zip
+         */
+        zip<T1, T2, T3, T4, T5>(arrays1: List<T1>, arrays2: List<T2>, arrays3: List<T3>, arrays4: List<T4>, arrays5: List<T5>): Array<[T1 | undefined, T2 | undefined, T3 | undefined, T4 | undefined, T5 | undefined]>;
+
+        /**
+         * @see _.zip
+         */
+        zip<T>(...arrays: Array<List<T> | null | undefined>): Array<Array<T | undefined>>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.zip
+         */
+        zip<T1, T2>(
+            this: LoDashImplicitWrapper<List<T1>>,
+            arrays2: List<T2>,
+        ): LoDashImplicitWrapper<Array<[T1 | undefined, T2 | undefined]>>;
+
+        /**
+         * @see _.zip
+         */
+        zip<T1, T2, T3>(
+            this: LoDashImplicitWrapper<List<T1>>,
+            arrays2: List<T2>,
+            arrays3: List<T3>,
+        ): LoDashImplicitWrapper<Array<[T1 | undefined, T2 | undefined, T3 | undefined]>>;
+
+        /**
+         * @see _.zip
+         */
+        zip<T1, T2, T3, T4>(
+            this: LoDashImplicitWrapper<List<T1>>,
+            arrays2: List<T2>,
+            arrays3: List<T3>,
+            arrays4: List<T4>,
+        ): LoDashImplicitWrapper<Array<[T1 | undefined, T2 | undefined, T3 | undefined, T4 | undefined]>>;
+
+        /**
+         * @see _.zip
+         */
+        zip<T1, T2, T3, T4, T5>(
+            this: LoDashImplicitWrapper<List<T1>>,
+            arrays2: List<T2>,
+            arrays3: List<T3>,
+            arrays4: List<T4>,
+            arrays5: List<T5>,
+        ): LoDashImplicitWrapper<Array<[T1 | undefined, T2 | undefined, T3 | undefined, T4 | undefined, T5 | undefined]>>;
+
+        /**
+         * @see _.zip
+         */
+        zip<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            ...arrays: Array<List<T> | null | undefined>
+        ): LoDashImplicitWrapper<Array<Array<T | undefined>>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.zip
+         */
+        zip<T1, T2>(
+            this: LoDashExplicitWrapper<List<T1>>,
+            arrays2: List<T2>,
+        ): LoDashExplicitWrapper<Array<[T1 | undefined, T2 | undefined]>>;
+
+        /**
+         * @see _.zip
+         */
+        zip<T1, T2, T3>(
+            this: LoDashExplicitWrapper<List<T1>>,
+            arrays2: List<T2>,
+            arrays3: List<T3>,
+        ): LoDashExplicitWrapper<Array<[T1 | undefined, T2 | undefined, T3 | undefined]>>;
+
+        /**
+         * @see _.zip
+         */
+        zip<T1, T2, T3, T4>(
+            this: LoDashExplicitWrapper<List<T1>>,
+            arrays2: List<T2>,
+            arrays3: List<T3>,
+            arrays4: List<T4>,
+        ): LoDashExplicitWrapper<Array<[T1 | undefined, T2 | undefined, T3 | undefined, T4 | undefined]>>;
+
+        /**
+         * @see _.zip
+         */
+        zip<T1, T2, T3, T4, T5>(
+            this: LoDashExplicitWrapper<List<T1>>,
+            arrays2: List<T2>,
+            arrays3: List<T3>,
+            arrays4: List<T4>,
+            arrays5: List<T5>,
+        ): LoDashExplicitWrapper<Array<[T1 | undefined, T2 | undefined, T3 | undefined, T4 | undefined, T5 | undefined]>>;
+
+        /**
+         * @see _.zip
+         */
+        zip<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            ...arrays: Array<List<T> | null | undefined>
+        ): LoDashExplicitWrapper<Array<Array<T | undefined>>>;
+    }
+
+    // zipObject
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.fromPairs except that it accepts two arrays, one of property
+         * identifiers and one of corresponding values.
+         *
+         * @param props The property names.
+         * @param values The property values.
+         * @return Returns the new object.
+         */
+        zipObject<T>(
+            props: List<PropertyName>,
+            values: List<T>
+        ): Dictionary<T>;
+
+        /**
+         * @see _.zipObject
+         */
+        zipObject(
+            props?: List<PropertyName>
+        ): Dictionary<undefined>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.zipObject
+         */
+        zipObject<T>(
+            this: LoDashImplicitWrapper<List<PropertyName>>,
+            values: List<T>
+        ): LoDashImplicitWrapper<Dictionary<T>>;
+
+        /**
+         * @see _.zipObject
+         */
+        zipObject(
+            this: LoDashImplicitWrapper<List<PropertyName>>
+        ): LoDashImplicitWrapper<Dictionary<undefined>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.zipObject
+         */
+        zipObject<T>(
+            this: LoDashExplicitWrapper<List<PropertyName>>,
+            values: List<T>
+        ): LoDashExplicitWrapper<Dictionary<T>>;
+
+        /**
+         * @see _.zipObject
+         */
+        zipObject(
+            this: LoDashExplicitWrapper<List<PropertyName>>
+        ): LoDashExplicitWrapper<Dictionary<undefined>>;
+    }
+
+    // zipObjectDeep
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.zipObject except that it supports property paths.
+         *
+         * @param paths The property names.
+         * @param values The property values.
+         * @return Returns the new object.
+         */
+        zipObjectDeep(
+            paths?: List<PropertyPath>,
+            values?: List<any>
+        ): object;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.zipObjectDeep
+         */
+        zipObjectDeep(
+            this: LoDashImplicitWrapper<List<PropertyPath>>,
+            values?: List<any>
+        ): LoDashImplicitWrapper<object>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.zipObjectDeep
+         */
+        zipObjectDeep(
+            this: LoDashExplicitWrapper<List<PropertyPath>>,
+            values?: List<any>
+        ): LoDashExplicitWrapper<object>;
+    }
+
+    // zipWith
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.zip except that it accepts an iteratee to specify how grouped values should be
+         * combined. The iteratee is invoked with four arguments: (accumulator, value, index,
+         * group).
+         * @param arrays The arrays to process.
+         * @param iteratee The function to combine grouped values.
+         * @return Returns the new array of grouped elements.
+         */
+        zipWith<T, TResult>(
+            arrays: List<T>,
+            iteratee: (value1: T) => TResult
+        ): TResult[];
+
+        /**
+         * @see _.zipWith
+         */
+        zipWith<T1, T2, TResult>(
+            arrays1: List<T1>,
+            arrays2: List<T2>,
+            iteratee: (value1: T1, value2: T2) => TResult
+        ): TResult[];
+
+        /**
+         * @see _.zipWith
+         */
+        zipWith<T1, T2, T3, TResult>(
+            arrays1: List<T1>,
+            arrays2: List<T2>,
+            arrays3: List<T3>,
+            iteratee: (value1: T1, value2: T2, value3: T3) => TResult
+        ): TResult[];
+
+        /**
+         * @see _.zipWith
+         */
+        zipWith<T1, T2, T3, T4, TResult>(
+            arrays1: List<T1>,
+            arrays2: List<T2>,
+            arrays3: List<T3>,
+            arrays4: List<T4>,
+            iteratee: (value1: T1, value2: T2, value3: T3, value4: T4) => TResult
+        ): TResult[];
+
+        /**
+         * @see _.zipWith
+         */
+        zipWith<T1, T2, T3, T4, T5, TResult>(
+            arrays1: List<T1>,
+            arrays2: List<T2>,
+            arrays3: List<T3>,
+            arrays4: List<T4>,
+            arrays5: List<T5>,
+            iteratee: (value1: T1, value2: T2, value3: T3, value4: T4, value5: T5) => TResult
+        ): TResult[];
+
+        /**
+         * @see _.zipWith
+         */
+        zipWith<T, TResult>(
+            ...iteratee: Array<((...group: T[]) => TResult) | List<T> | null | undefined>
+        ): TResult[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.zipWith
+         */
+        zipWith<T, TResult>(
+            this: LoDashImplicitWrapper<List<T>>,
+            iteratee: (value1: T) => TResult
+        ): LoDashImplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.zipWith
+         */
+        zipWith<T1, T2, TResult>(
+            this: LoDashImplicitWrapper<List<T1>>,
+            arrays2: List<T2>,
+            iteratee: (value1: T1, value2: T2) => TResult
+        ): LoDashImplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.zipWith
+         */
+        zipWith<T1, T2, T3, TResult>(
+            this: LoDashImplicitWrapper<List<T1>>,
+            arrays2: List<T2>,
+            arrays3: List<T3>,
+            iteratee: (value1: T1, value2: T2, value3: T3) => TResult
+        ): LoDashImplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.zipWith
+         */
+        zipWith<T1, T2, T3, T4, TResult>(
+            this: LoDashImplicitWrapper<List<T1>>,
+            arrays2: List<T2>,
+            arrays3: List<T3>,
+            arrays4: List<T4>,
+            iteratee: (value1: T1, value2: T2, value3: T3, value4: T4) => TResult
+        ): LoDashImplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.zipWith
+         */
+        zipWith<T1, T2, T3, T4, T5, TResult>(
+            this: LoDashImplicitWrapper<List<T1>>,
+            arrays2: List<T2>,
+            arrays3: List<T3>,
+            arrays4: List<T4>,
+            arrays5: List<T5>,
+            iteratee: (value1: T1, value2: T2, value3: T3, value4: T4, value5: T5) => TResult
+        ): LoDashImplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.zipWith
+         */
+        zipWith<T, TResult>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            ...iteratee: Array<((...group: T[]) => TResult) | List<T> | null | undefined>
+        ): LoDashImplicitWrapper<TResult[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.zipWith
+         */
+        zipWith<T, TResult>(
+            this: LoDashExplicitWrapper<List<T>>,
+            iteratee: (value1: T) => TResult
+        ): LoDashExplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.zipWith
+         */
+        zipWith<T1, T2, TResult>(
+            this: LoDashExplicitWrapper<List<T1>>,
+            arrays2: List<T2>,
+            iteratee: (value1: T1, value2: T2) => TResult
+        ): LoDashExplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.zipWith
+         */
+        zipWith<T1, T2, T3, TResult>(
+            this: LoDashExplicitWrapper<List<T1>>,
+            arrays2: List<T2>,
+            arrays3: List<T3>,
+            iteratee: (value1: T1, value2: T2, value3: T3) => TResult
+        ): LoDashExplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.zipWith
+         */
+        zipWith<T1, T2, T3, T4, TResult>(
+            this: LoDashExplicitWrapper<List<T1>>,
+            arrays2: List<T2>,
+            arrays3: List<T3>,
+            arrays4: List<T4>,
+            iteratee: (value1: T1, value2: T2, value3: T3, value4: T4) => TResult
+        ): LoDashExplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.zipWith
+         */
+        zipWith<T1, T2, T3, T4, T5, TResult>(
+            this: LoDashExplicitWrapper<List<T1>>,
+            arrays2: List<T2>,
+            arrays3: List<T3>,
+            arrays4: List<T4>,
+            arrays5: List<T5>,
+            iteratee: (value1: T1, value2: T2, value3: T3, value4: T4, value5: T5) => TResult
+        ): LoDashExplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.zipWith
+         */
+        zipWith<T, TResult>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            ...iteratee: Array<((...group: T[]) => TResult) | List<T> | null | undefined>
+        ): LoDashExplicitWrapper<TResult[]>;
+    }
+}
diff --git a/jtg js/node_modules/@types/lodash/common/collection.d.ts b/jtg js/node_modules/@types/lodash/common/collection.d.ts
new file mode 100644
index 0000000..2e38422
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/common/collection.d.ts	
@@ -0,0 +1,2575 @@
+import _ = require("../index");
+declare module "../index" {
+    // countBy
+
+    interface LoDashStatic {
+        /**
+         * Creates an object composed of keys generated from the results of running each element of collection through
+         * iteratee. The corresponding value of each key is the number of times the key was returned by iteratee. The
+         * iteratee is invoked with one argument: (value).
+         *
+         * @param collection The collection to iterate over.
+         * @param iteratee The function invoked per iteration.
+         * @return Returns the composed aggregate object.
+         */
+        countBy<T>(
+            collection: List<T> | null | undefined,
+            iteratee?: ValueIteratee<T>
+        ): Dictionary<number>;
+
+        /**
+         * @see _.countBy
+         */
+        countBy<T extends object>(
+            collection: T | null | undefined,
+            iteratee?: ValueIteratee<T[keyof T]>
+        ): Dictionary<number>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.countBy
+         */
+        countBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            iteratee?: ValueIteratee<T>
+        ): LoDashImplicitWrapper<Dictionary<number>>;
+
+        /**
+         * @see _.countBy
+         */
+        countBy<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            iteratee?: ValueIteratee<T[keyof T]>
+        ): LoDashImplicitWrapper<Dictionary<number>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.countBy
+         */
+        countBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            iteratee?: ValueIteratee<T>
+        ): LoDashExplicitWrapper<Dictionary<number>>;
+
+        /**
+         * @see _.countBy
+         */
+        countBy<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            iteratee?: ValueIteratee<T[keyof T]>
+        ): LoDashExplicitWrapper<Dictionary<number>>;
+    }
+
+    // each
+
+    interface LoDashStatic {
+        each: typeof _.forEach; // tslint:disable-line:no-unnecessary-qualifier
+    }
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * @see _.forEach
+         */
+        each<T>(
+            this: LoDashWrapper<T[] | null | undefined>,
+            iteratee?: ArrayIterator<T, any>
+        ): this;
+
+        /**
+         * @see _.forEach
+         */
+        each(
+            this: LoDashWrapper<string | null | undefined>,
+            iteratee?: StringIterator<any>
+        ): this;
+
+        /**
+         * @see _.forEach
+         */
+        each<T>(
+            this: LoDashWrapper<List<T> | null | undefined>,
+            iteratee?: ListIterator<T, any>
+        ): this;
+
+        /**
+         * @see _.forEach
+         */
+        each<T extends object>(
+            this: LoDashWrapper<T | null | undefined>,
+            iteratee?: ObjectIterator<T, any>
+        ): this;
+    }
+
+    // eachRight
+
+    interface LoDashStatic {
+        eachRight: typeof _.forEachRight; // tslint:disable-line:no-unnecessary-qualifier
+    }
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * @see _.forEachRight
+         */
+        eachRight<T>(
+            this: LoDashWrapper<T[] | null | undefined>,
+            iteratee?: ArrayIterator<T, any>
+        ): this;
+
+        /**
+         * @see _.forEachRight
+         */
+        eachRight(
+            this: LoDashWrapper<string | null | undefined>,
+            iteratee?: StringIterator<any>
+        ): this;
+
+        /**
+         * @see _.forEachRight
+         */
+        eachRight<T>(
+            this: LoDashWrapper<List<T> | null | undefined>,
+            iteratee?: ListIterator<T, any>
+        ): this;
+
+        /**
+         * @see _.forEachRight
+         */
+        eachRight<T extends object>(
+            this: LoDashWrapper<T | null | undefined>,
+            iteratee?: ObjectIterator<T, any>
+        ): this;
+    }
+
+    // every
+
+    interface LoDashStatic {
+        /**
+         * Checks if predicate returns truthy for all elements of collection. Iteration is stopped once predicate
+         * returns falsey. The predicate is invoked with three arguments: (value, index|key, collection).
+         *
+         * @param collection The collection to iterate over.
+         * @param predicate The function invoked per iteration.
+         * @return Returns true if all elements pass the predicate check, else false.
+         */
+        every<T>(
+            collection: List<T> | null | undefined,
+            predicate?: ListIterateeCustom<T, boolean>
+        ): boolean;
+
+        /**
+         * @see _.every
+         */
+        every<T extends object>(
+            collection: T | null | undefined,
+            predicate?: ObjectIterateeCustom<T, boolean>
+        ): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.every
+         */
+        every<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIterateeCustom<T, boolean>
+        ): boolean;
+
+        /**
+         * @see _.every
+         */
+        every<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            predicate?: ObjectIterateeCustom<T, boolean>
+        ): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.every
+         */
+        every<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIterateeCustom<T, boolean>
+        ): LoDashExplicitWrapper<boolean>;
+
+        /**
+         * @see _.every
+         */
+        every<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            predicate?: ObjectIterateeCustom<T, boolean>
+        ): LoDashExplicitWrapper<boolean>;
+    }
+
+    // filter
+
+    interface LoDashStatic {
+        /**
+         * Iterates over elements of collection, returning an array of all elements predicate returns truthy for. The
+         * predicate is invoked with three arguments: (value, index|key, collection).
+         *
+         * @param collection The collection to iterate over.
+         * @param predicate The function invoked per iteration.
+         * @return Returns the new filtered array.
+         */
+        filter(
+            collection: string | null | undefined,
+            predicate?: StringIterator<boolean>
+        ): string[];
+
+        /**
+         * @see _.filter
+         */
+        filter<T, S extends T>(
+            collection: List<T> | null | undefined,
+            predicate: ListIteratorTypeGuard<T, S>
+        ): S[];
+
+        /**
+         * @see _.filter
+         */
+        filter<T>(
+            collection: List<T> | null | undefined,
+            predicate?: ListIterateeCustom<T, boolean>
+        ): T[];
+
+        /**
+         * @see _.filter
+         */
+        filter<T extends object, S extends T[keyof T]>(
+            collection: T | null | undefined,
+            predicate: ObjectIteratorTypeGuard<T, S>
+        ): S[];
+
+        /**
+         * @see _.filter
+         */
+        filter<T extends object>(
+            collection: T | null | undefined,
+            predicate?: ObjectIterateeCustom<T, boolean>
+        ): Array<T[keyof T]>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.filter
+         */
+        filter(
+            this: LoDashImplicitWrapper<string | null | undefined>,
+            predicate?: StringIterator<boolean>
+        ): LoDashImplicitWrapper<string[]>;
+
+        /**
+         * @see _.filter
+         */
+        filter<T, S extends T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            predicate: ListIteratorTypeGuard<T, S>
+        ): LoDashImplicitWrapper<S[]>;
+
+        /**
+         * @see _.filter
+         */
+        filter<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIterateeCustom<T, boolean>
+        ): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.filter
+         */
+        filter<T extends object, S extends T[keyof T]>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            predicate: ObjectIteratorTypeGuard<T, S>
+        ): LoDashImplicitWrapper<S[]>;
+
+        /**
+         * @see _.filter
+         */
+        filter<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            predicate?: ObjectIterateeCustom<T, boolean>
+        ): LoDashImplicitWrapper<Array<T[keyof T]>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.filter
+         */
+        filter(
+            this: LoDashExplicitWrapper<string | null | undefined>,
+            predicate?: StringIterator<boolean>
+        ): LoDashExplicitWrapper<string[]>;
+
+        /**
+         * @see _.filter
+         */
+        filter<T, S extends T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            predicate: ListIteratorTypeGuard<T, S>
+        ): LoDashExplicitWrapper<S[]>;
+
+        /**
+         * @see _.filter
+         */
+        filter<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIterateeCustom<T, boolean>
+        ): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.filter
+         */
+        filter<T extends object, S extends T[keyof T]>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            predicate: ObjectIteratorTypeGuard<T, S>
+        ): LoDashExplicitWrapper<S[]>;
+
+        /**
+         * @see _.filter
+         */
+        filter<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            predicate?: ObjectIterateeCustom<T, boolean>
+        ): LoDashExplicitWrapper<Array<T[keyof T]>>;
+    }
+
+    // find
+
+    interface LoDashStatic {
+        /**
+         * Iterates over elements of collection, returning the first element predicate returns truthy for.
+         * The predicate is invoked with three arguments: (value, index|key, collection).
+         *
+         * @param collection The collection to search.
+         * @param predicate The function invoked per iteration.
+         * @param fromIndex The index to search from.
+         * @return Returns the matched element, else undefined.
+         */
+        find<T, S extends T>(
+            collection: List<T> | null | undefined,
+            predicate: ListIteratorTypeGuard<T, S>,
+            fromIndex?: number
+        ): S|undefined;
+
+        /**
+         * @see _.find
+         */
+        find<T>(
+            collection: List<T> | null | undefined,
+            predicate?: ListIterateeCustom<T, boolean>,
+            fromIndex?: number
+        ): T|undefined;
+
+        /**
+         * @see _.find
+         */
+        find<T extends object, S extends T[keyof T]>(
+            collection: T | null | undefined,
+            predicate: ObjectIteratorTypeGuard<T, S>,
+            fromIndex?: number
+        ): S|undefined;
+
+        /**
+         * @see _.find
+         */
+        find<T extends object>(
+            collection: T | null | undefined,
+            predicate?: ObjectIterateeCustom<T, boolean>,
+            fromIndex?: number
+        ): T[keyof T]|undefined;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.find
+         */
+        find<T, S extends T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            predicate: ListIteratorTypeGuard<T, S>,
+            fromIndex?: number
+        ): S|undefined;
+
+        /**
+         * @see _.find
+         */
+        find<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIterateeCustom<T, boolean>,
+            fromIndex?: number
+        ): T|undefined;
+
+        /**
+         * @see _.find
+         */
+        find<T extends object, S extends T[keyof T]>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            predicate: ObjectIteratorTypeGuard<T, S>,
+            fromIndex?: number
+        ): S|undefined;
+
+        /**
+         * @see _.find
+         */
+        find<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            predicate?: ObjectIterateeCustom<T, boolean>,
+            fromIndex?: number
+        ): T[keyof T]|undefined;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.find
+         */
+        find<T, S extends T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            predicate: ListIteratorTypeGuard<T, S>,
+            fromIndex?: number
+        ): LoDashExplicitWrapper<S|undefined>;
+
+        /**
+         * @see _.find
+         */
+        find<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIterateeCustom<T, boolean>,
+            fromIndex?: number
+        ): LoDashExplicitWrapper<T|undefined>;
+
+        /**
+         * @see _.find
+         */
+        find<T extends object, S extends T[keyof T]>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            predicate: ObjectIteratorTypeGuard<T, S>,
+            fromIndex?: number
+        ): LoDashExplicitWrapper<S|undefined>;
+
+        /**
+         * @see _.find
+         */
+        find<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            predicate?: ObjectIterateeCustom<T, boolean>,
+            fromIndex?: number
+        ): LoDashExplicitWrapper<T[keyof T]|undefined>;
+    }
+
+    // findLast
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.find except that it iterates over elements of a collection from
+         * right to left.
+         * @param collection Searches for a value in this list.
+         * @param predicate The function called per iteration.
+         * @param fromIndex The index to search from.
+         * @return The found element, else undefined.
+         */
+        findLast<T, S extends T>(
+            collection: List<T> | null | undefined,
+            predicate: ListIteratorTypeGuard<T, S>,
+            fromIndex?: number
+        ): S|undefined;
+
+        /**
+         * @see _.findLast
+         */
+        findLast<T>(
+            collection: List<T> | null | undefined,
+            predicate?: ListIterateeCustom<T, boolean>,
+            fromIndex?: number
+        ): T|undefined;
+
+        /**
+         * @see _.findLast
+         */
+        findLast<T extends object, S extends T[keyof T]>(
+            collection: T | null | undefined,
+            predicate: ObjectIteratorTypeGuard<T, S>,
+            fromIndex?: number
+        ): S|undefined;
+
+        /**
+         * @see _.findLast
+         */
+        findLast<T extends object>(
+            collection: T | null | undefined,
+            predicate?: ObjectIterateeCustom<T, boolean>,
+            fromIndex?: number
+        ): T[keyof T]|undefined;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.findLast
+         */
+        findLast<T, S extends T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            predicate: ListIteratorTypeGuard<T, S>,
+            fromIndex?: number
+        ): S | undefined;
+
+        /**
+         * @see _.findLast
+         */
+        findLast<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIterateeCustom<T, boolean>,
+            fromIndex?: number
+        ): T | undefined;
+
+        /**
+         * @see _.findLast
+         */
+        findLast<T extends object, S extends T[keyof T]>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            predicate: ObjectIteratorTypeGuard<T, S>,
+            fromIndex?: number
+        ): S|undefined;
+
+        /**
+         * @see _.findLast
+         */
+        findLast<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            predicate?: ObjectIterateeCustom<T, boolean>,
+            fromIndex?: number
+        ): T[keyof T]|undefined;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.findLast
+         */
+        findLast<T, S extends T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            predicate: ListIteratorTypeGuard<T, S>,
+            fromIndex?: number
+        ): LoDashExplicitWrapper<S | undefined>;
+
+        /**
+         * @see _.findLast
+         */
+        findLast<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIterateeCustom<T, boolean>,
+            fromIndex?: number
+        ): LoDashExplicitWrapper<T | undefined>;
+
+        /**
+         * @see _.findLast
+         */
+        findLast<T extends object, S extends T[keyof T]>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            predicate: ObjectIteratorTypeGuard<T, S>,
+            fromIndex?: number
+        ): LoDashExplicitWrapper<S|undefined>;
+
+        /**
+         * @see _.findLast
+         */
+        findLast<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            predicate?: ObjectIterateeCustom<T, boolean>,
+            fromIndex?: number
+        ): LoDashExplicitWrapper<T[keyof T]|undefined>;
+    }
+
+    // flatMap
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of flattened values by running each element in collection through iteratee
+         * and concating its result to the other mapped values. The iteratee is invoked with three arguments:
+         * (value, index|key, collection).
+         *
+         * @param collection The collection to iterate over.
+         * @param iteratee The function invoked per iteration.
+         * @return Returns the new flattened array.
+         */
+        flatMap<T>(
+            collection: List<Many<T>> | Dictionary<Many<T>> | NumericDictionary<Many<T>> | null | undefined
+        ): T[];
+
+        /**
+         * @see _.flatMap
+         */
+        flatMap(
+            collection: object | null | undefined
+        ): any[];
+
+        /**
+         * @see _.flatMap
+         */
+        flatMap<T, TResult>(
+            collection: List<T> | null | undefined,
+            iteratee: ListIterator<T, Many<TResult>>
+        ): TResult[];
+
+        /**
+         * @see _.flatMap
+         */
+        flatMap<T extends object, TResult>(
+            collection: T | null | undefined,
+            iteratee: ObjectIterator<T, Many<TResult>>
+        ): TResult[];
+
+        /**
+         * @see _.flatMap
+         */
+        flatMap(
+            collection: object | null | undefined,
+            iteratee: string
+        ): any[];
+
+        /**
+         * @see _.flatMap
+         */
+        flatMap(
+            collection: object | null | undefined,
+            iteratee: object
+        ): boolean[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.flatMap
+         */
+        flatMap<T>(this: LoDashImplicitWrapper<List<Many<T>> | Dictionary<Many<T>> | NumericDictionary<Many<T>> | null | undefined>): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.flatMap
+         */
+        flatMap(): LoDashImplicitWrapper<any[]>;
+
+        /**
+         * @see _.flatMap
+         */
+        flatMap<T, TResult>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            iteratee: ListIterator<T, Many<TResult>>
+        ): LoDashImplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.flatMap
+         */
+        flatMap<T extends object, TResult>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            iteratee: ObjectIterator<T, Many<TResult>>
+        ): LoDashImplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.flatMap
+         */
+        flatMap(
+            iteratee: string
+        ): LoDashImplicitWrapper<any[]>;
+
+        /**
+         * @see _.flatMap
+         */
+        flatMap(
+            iteratee: object
+        ): LoDashImplicitWrapper<boolean[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.flatMap
+         */
+        flatMap<T>(this: LoDashExplicitWrapper<List<Many<T>> | Dictionary<Many<T>> | NumericDictionary<Many<T>> | null | undefined>): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.flatMap
+         */
+        flatMap(): LoDashExplicitWrapper<any[]>;
+
+        /**
+         * @see _.flatMap
+         */
+        flatMap<T, TResult>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            iteratee: ListIterator<T, Many<TResult>>
+        ): LoDashExplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.flatMap
+         */
+        flatMap<T extends object, TResult>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            iteratee: ObjectIterator<T, Many<TResult>>
+        ): LoDashExplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.flatMap
+         */
+        flatMap(
+            iteratee: string
+        ): LoDashExplicitWrapper<any[]>;
+
+        /**
+         * @see _.flatMap
+         */
+        flatMap(
+            iteratee: object
+        ): LoDashExplicitWrapper<boolean[]>;
+    }
+
+    // flatMapDeep
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.flatMap` except that it recursively flattens the
+         * mapped results.
+         *
+         * @since 4.7.0
+         * @category Collection
+         * @param collection The collection to iterate over.
+         * @param [iteratee=_.identity] The function invoked per iteration.
+         * @returns Returns the new flattened array.
+         * @example
+         *
+         * function duplicate(n) {
+         *   return [[[n, n]]];
+         * }
+         *
+         * _.flatMapDeep([1, 2], duplicate);
+         * // => [1, 1, 2, 2]
+         */
+        flatMapDeep<T>(
+            collection: List<ListOfRecursiveArraysOrValues<T> | T> | Dictionary<ListOfRecursiveArraysOrValues<T> | T> | NumericDictionary<ListOfRecursiveArraysOrValues<T> | T> | null | undefined
+        ): T[];
+
+        /**
+         * @see _.flatMapDeep
+         */
+        flatMapDeep<T, TResult>(
+            collection: List<T> | null | undefined,
+            iteratee: ListIterator<T, ListOfRecursiveArraysOrValues<TResult> | TResult>
+        ): TResult[];
+
+        /**
+         * @see _.flatMapDeep
+         */
+        flatMapDeep<T extends object, TResult>(
+            collection: T | null | undefined,
+            iteratee: ObjectIterator<T, ListOfRecursiveArraysOrValues<TResult> | TResult>
+        ): TResult[];
+
+        /**
+         * @see _.flatMapDeep
+         */
+        flatMapDeep(
+            collection: object | null | undefined,
+            iteratee: string
+        ): any[];
+
+        /**
+         * @see _.flatMapDeep
+         */
+        flatMapDeep(
+            collection: object | null | undefined,
+            iteratee: object
+        ): boolean[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.flatMapDeep
+         */
+        flatMapDeep<T>(
+            this: LoDashImplicitWrapper<List<ListOfRecursiveArraysOrValues<T> | T> | Dictionary<ListOfRecursiveArraysOrValues<T> | T> | NumericDictionary<ListOfRecursiveArraysOrValues<T> | T> | null | undefined>
+        ): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.flatMapDeep
+         */
+        flatMapDeep<T, TResult>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            iteratee: ListIterator<T, ListOfRecursiveArraysOrValues<TResult> | TResult>
+        ): LoDashImplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.flatMapDeep
+         */
+        flatMapDeep<T extends object, TResult>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            iteratee: ObjectIterator<T, ListOfRecursiveArraysOrValues<TResult> | TResult>
+        ): LoDashImplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.flatMapDeep
+         */
+        flatMapDeep(
+            this: LoDashImplicitWrapper<object | null | undefined>,
+            iteratee: string
+        ): LoDashImplicitWrapper<any[]>;
+
+        /**
+         * @see _.flatMapDeep
+         */
+        flatMapDeep(
+            this: LoDashImplicitWrapper<object | null | undefined>,
+            iteratee: object
+        ): LoDashImplicitWrapper<boolean[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.flatMapDeep
+         */
+        flatMapDeep<T>(
+            this: LoDashExplicitWrapper<List<ListOfRecursiveArraysOrValues<T> | T> | Dictionary<ListOfRecursiveArraysOrValues<T> | T> | NumericDictionary<ListOfRecursiveArraysOrValues<T> | T> | null | undefined>
+        ): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.flatMapDeep
+         */
+        flatMapDeep<T, TResult>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            iteratee: ListIterator<T, ListOfRecursiveArraysOrValues<TResult> | TResult>
+        ): LoDashExplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.flatMapDeep
+         */
+        flatMapDeep<T extends object, TResult>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            iteratee: ObjectIterator<T, ListOfRecursiveArraysOrValues<TResult> | TResult>
+        ): LoDashExplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.flatMapDeep
+         */
+        flatMapDeep(
+            this: LoDashExplicitWrapper<object | null | undefined>,
+            iteratee: string
+        ): LoDashExplicitWrapper<any[]>;
+
+        /**
+         * @see _.flatMapDeep
+         */
+        flatMapDeep(
+            this: LoDashExplicitWrapper<object | null | undefined>,
+            iteratee: object
+        ): LoDashExplicitWrapper<boolean[]>;
+    }
+
+    // flatMapDepth
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.flatMap` except that it recursively flattens the
+         * mapped results up to `depth` times.
+         *
+         * @since 4.7.0
+         * @category Collection
+         * @param collection The collection to iterate over.
+         * @param [iteratee=_.identity] The function invoked per iteration.
+         * @param [depth=1] The maximum recursion depth.
+         * @returns Returns the new flattened array.
+         * @example
+         *
+         * function duplicate(n) {
+         *   return [[[n, n]]];
+         * }
+         *
+         * _.flatMapDepth([1, 2], duplicate, 2);
+         * // => [[1, 1], [2, 2]]
+         */
+        flatMapDepth<T>(
+            collection: List<ListOfRecursiveArraysOrValues<T> | T> | Dictionary<ListOfRecursiveArraysOrValues<T> | T> | NumericDictionary<ListOfRecursiveArraysOrValues<T> | T> | null | undefined
+        ): T[];
+
+        /**
+         * @see _.flatMapDepth
+         */
+        flatMapDepth<T, TResult>(
+            collection: List<T> | null | undefined,
+            iteratee: ListIterator<T, ListOfRecursiveArraysOrValues<TResult> | TResult>,
+            depth?: number
+        ): TResult[];
+
+        /**
+         * @see _.flatMapDepth
+         */
+        flatMapDepth<T extends object, TResult>(
+            collection: T | null | undefined,
+            iteratee: ObjectIterator<T, ListOfRecursiveArraysOrValues<TResult> | TResult>,
+            depth?: number
+        ): TResult[];
+
+        /**
+         * @see _.flatMapDepth
+         */
+        flatMapDepth(
+            collection: object | null | undefined,
+            iteratee: string,
+            depth?: number
+        ): any[];
+
+        /**
+         * @see _.flatMapDepth
+         */
+        flatMapDepth(
+            collection: object | null | undefined,
+            iteratee: object,
+            depth?: number
+        ): boolean[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.flatMapDepth
+         */
+        flatMapDepth<T>(
+            this: LoDashImplicitWrapper<List<ListOfRecursiveArraysOrValues<T> | T> | Dictionary<ListOfRecursiveArraysOrValues<T> | T> | NumericDictionary<ListOfRecursiveArraysOrValues<T> | T> | null | undefined>
+        ): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.flatMapDepth
+         */
+        flatMapDepth<T, TResult>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            iteratee: ListIterator<T, ListOfRecursiveArraysOrValues<TResult> | TResult>,
+            depth?: number
+        ): LoDashImplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.flatMapDepth
+         */
+        flatMapDepth<T extends object, TResult>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            iteratee: ObjectIterator<T, ListOfRecursiveArraysOrValues<TResult> | TResult>,
+            depth?: number
+        ): LoDashImplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.flatMapDepth
+         */
+        flatMapDepth(
+            this: LoDashImplicitWrapper<object | null | undefined>,
+            iteratee: string,
+            depth?: number
+        ): LoDashImplicitWrapper<any[]>;
+
+        /**
+         * @see _.flatMapDepth
+         */
+        flatMapDepth(
+            this: LoDashImplicitWrapper<object | null | undefined>,
+            iteratee: object,
+            depth?: number
+        ): LoDashImplicitWrapper<boolean[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.flatMapDepth
+         */
+        flatMapDepth<T>(
+            this: LoDashExplicitWrapper<List<ListOfRecursiveArraysOrValues<T> | T> | Dictionary<ListOfRecursiveArraysOrValues<T> | T> | NumericDictionary<ListOfRecursiveArraysOrValues<T> | T> | null | undefined>
+        ): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.flatMapDepth
+         */
+        flatMapDepth<T, TResult>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            iteratee: ListIterator<T, ListOfRecursiveArraysOrValues<TResult> | TResult>,
+            depth?: number
+        ): LoDashExplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.flatMapDepth
+         */
+        flatMapDepth<T extends object, TResult>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            iteratee: ObjectIterator<T, ListOfRecursiveArraysOrValues<TResult> | TResult>,
+            depth?: number
+        ): LoDashExplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.flatMapDepth
+         */
+        flatMapDepth(
+            this: LoDashExplicitWrapper<object | null | undefined>,
+            iteratee: string,
+            depth?: number
+        ): LoDashExplicitWrapper<any[]>;
+
+        /**
+         * @see _.flatMapDepth
+         */
+        flatMapDepth(
+            this: LoDashExplicitWrapper<object | null | undefined>,
+            iteratee: object,
+            depth?: number
+        ): LoDashExplicitWrapper<boolean[]>;
+    }
+
+    // forEach
+
+    interface LoDashStatic {
+        /**
+         * Iterates over elements of collection invoking iteratee for each element. The iteratee is invoked with three arguments:
+         * (value, index|key, collection). Iteratee functions may exit iteration early by explicitly returning false.
+         *
+         * Note: As with other "Collections" methods, objects with a "length" property are iterated like arrays. To
+         * avoid this behavior _.forIn or _.forOwn may be used for object iteration.
+         *
+         * @alias _.each
+         *
+         * @param collection The collection to iterate over.
+         * @param iteratee The function invoked per iteration.
+         */
+        forEach<T>(
+            collection: T[],
+            iteratee?: ArrayIterator<T, any>
+        ): T[];
+
+        /**
+         * @see _.forEach
+         */
+        forEach(
+            collection: string,
+            iteratee?: StringIterator<any>
+        ): string;
+
+        /**
+         * @see _.forEach
+         */
+        forEach<T>(
+            collection: List<T>,
+            iteratee?: ListIterator<T, any>
+        ): List<T>;
+
+        /**
+         * @see _.forEach
+         */
+        forEach<T extends object>(
+            collection: T,
+            iteratee?: ObjectIterator<T, any>
+        ): T;
+
+        /**
+         * @see _.forEach
+         */
+        forEach<T, TArray extends T[] | null | undefined>(
+            collection: TArray & (T[] | null | undefined),
+            iteratee?: ArrayIterator<T, any>
+        ): TArray;
+
+        /**
+         * @see _.forEach
+         */
+        forEach<TString extends string | null | undefined>(
+            collection: TString,
+            iteratee?: StringIterator<any>
+        ): TString;
+
+        /**
+         * @see _.forEach
+         */
+        forEach<T, TList extends List<T> | null | undefined>(
+            collection: TList & (List<T> | null | undefined),
+            iteratee?: ListIterator<T, any>
+        ): TList;
+
+        /**
+         * @see _.forEach
+         */
+        forEach<T extends object>(
+            collection: T | null | undefined,
+            iteratee?: ObjectIterator<T, any>
+        ): T | null | undefined;
+    }
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * @see _.forEach
+         */
+        forEach<T>(
+            this: LoDashWrapper<T[] | null | undefined>,
+            iteratee?: ArrayIterator<T, any>
+        ): this;
+
+        /**
+         * @see _.forEach
+         */
+        forEach(
+            this: LoDashWrapper<string | null | undefined>,
+            iteratee?: StringIterator<any>
+        ): this;
+
+        /**
+         * @see _.forEach
+         */
+        forEach<T>(
+            this: LoDashWrapper<List<T> | null | undefined>,
+            iteratee?: ListIterator<T, any>
+        ): this;
+
+        /**
+         * @see _.forEach
+         */
+        forEach<T extends object>(
+            this: LoDashWrapper<T | null | undefined>,
+            iteratee?: ObjectIterator<T, any>
+        ): this;
+    }
+
+    // forEachRight
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.forEach except that it iterates over elements of collection from right to left.
+         *
+         * @alias _.eachRight
+         *
+         * @param collection The collection to iterate over.
+         * @param iteratee The function called per iteration.
+         */
+        forEachRight<T>(
+            collection: T[],
+            iteratee?: ArrayIterator<T, any>
+        ): T[];
+
+        /**
+         * @see _.forEachRight
+         */
+        forEachRight(
+            collection: string,
+            iteratee?: StringIterator<any>
+        ): string;
+
+        /**
+         * @see _.forEachRight
+         */
+        forEachRight<T>(
+            collection: List<T>,
+            iteratee?: ListIterator<T, any>
+        ): List<T>;
+
+        /**
+         * @see _.forEachRight
+         */
+        forEachRight<T extends object>(
+            collection: T,
+            iteratee?: ObjectIterator<T, any>
+        ): T;
+
+        /**
+         * @see _.forEachRight
+         */
+        forEachRight<T, TArray extends T[] | null | undefined>(
+            collection: TArray & (T[] | null | undefined),
+            iteratee?: ArrayIterator<T, any>
+        ): TArray;
+
+        /**
+         * @see _.forEachRight
+         */
+        forEachRight<TString extends string | null | undefined>(
+            collection: TString,
+            iteratee?: StringIterator<any>
+        ): TString;
+
+        /**
+         * @see _.forEachRight
+         */
+        forEachRight<T, TList extends List<T> | null | undefined>(
+            collection: TList & (List<T> | null | undefined),
+            iteratee?: ListIterator<T, any>
+        ): TList;
+
+        /**
+         * @see _.forEachRight
+         */
+        forEachRight<T extends object>(
+            collection: T | null | undefined,
+            iteratee?: ObjectIterator<T, any>
+        ): T | null | undefined;
+    }
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * @see _.forEachRight
+         */
+        forEachRight<T>(
+            this: LoDashWrapper<T[] | null | undefined>,
+            iteratee?: ArrayIterator<T, any>
+        ): this;
+
+        /**
+         * @see _.forEachRight
+         */
+        forEachRight(
+            this: LoDashWrapper<string | null | undefined>,
+            iteratee?: StringIterator<any>
+        ): this;
+
+        /**
+         * @see _.forEachRight
+         */
+        forEachRight<T>(
+            this: LoDashWrapper<List<T> | null | undefined>,
+            iteratee?: ListIterator<T, any>
+        ): this;
+
+        /**
+         * @see _.forEachRight
+         */
+        forEachRight<T extends object>(
+            this: LoDashWrapper<T | null | undefined>,
+            iteratee?: ObjectIterator<T, any>
+        ): this;
+    }
+
+    // groupBy
+
+    interface LoDashStatic {
+        /**
+         * Creates an object composed of keys generated from the results of running each element of collection through
+         * iteratee. The corresponding value of each key is an array of the elements responsible for generating the
+         * key. The iteratee is invoked with one argument: (value).
+         *
+         * @param collection The collection to iterate over.
+         * @param iteratee The function invoked per iteration.
+         * @return Returns the composed aggregate object.
+         */
+        groupBy<T>(
+            collection: List<T> | null | undefined,
+            iteratee?: ValueIteratee<T>
+        ): Dictionary<T[]>;
+
+        /**
+         * @see _.groupBy
+         */
+        groupBy<T extends object>(
+            collection: T | null | undefined,
+            iteratee?: ValueIteratee<T[keyof T]>
+        ): Dictionary<Array<T[keyof T]>>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.groupBy
+         */
+        groupBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            iteratee?: ValueIteratee<T>
+        ): LoDashImplicitWrapper<Dictionary<T[]>>;
+
+        /**
+         * @see _.groupBy
+         */
+        groupBy<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            iteratee?: ValueIteratee<T[keyof T]>
+        ): LoDashImplicitWrapper<Dictionary<Array<T[keyof T]>>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.groupBy
+         */
+        groupBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            iteratee?: ValueIteratee<T>
+        ): LoDashExplicitWrapper<Dictionary<T[]>>;
+
+        /**
+         * @see _.groupBy
+         */
+        groupBy<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            iteratee?: ValueIteratee<T[keyof T]>
+        ): LoDashExplicitWrapper<Dictionary<Array<T[keyof T]>>>;
+    }
+
+    // includes
+
+    interface LoDashStatic {
+        /**
+         * Checks if target is in collection using SameValueZero for equality comparisons. If fromIndex is negative,
+         * it’s used as the offset from the end of collection.
+         *
+         * @param collection The collection to search.
+         * @param target The value to search for.
+         * @param fromIndex The index to search from.
+         * @return True if the target element is found, else false.
+         */
+        includes<T>(
+            collection: List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined,
+            target: T,
+            fromIndex?: number
+        ): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.includes
+         */
+        includes<T>(
+            this: LoDashImplicitWrapper<List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            target: T,
+            fromIndex?: number
+        ): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.includes
+         */
+        includes<T>(
+            this: LoDashExplicitWrapper<List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            target: T,
+            fromIndex?: number
+        ): LoDashExplicitWrapper<boolean>;
+    }
+
+    // invokeMap
+
+    interface LoDashStatic {
+        /**
+        * Invokes the method named by methodName on each element in the collection returning
+        * an array of the results of each invoked method. Additional arguments will be provided
+        * to each invoked method. If methodName is a function it will be invoked for, and this
+        * bound to, each element in the collection.
+        * @param collection The collection to iterate over.
+        * @param methodName The name of the method to invoke.
+        * @param args Arguments to invoke the method with.
+        **/
+        invokeMap(
+            collection: object | null | undefined,
+            methodName: string,
+            ...args: any[]): any[];
+
+        /**
+        * @see _.invokeMap
+        **/
+        invokeMap<TResult>(
+            collection: object | null | undefined,
+            method: (...args: any[]) => TResult,
+            ...args: any[]): TResult[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+        * @see _.invokeMap
+        **/
+        invokeMap(
+            methodName: string,
+            ...args: any[]): LoDashImplicitWrapper<any[]>;
+
+        /**
+        * @see _.invokeMap
+        **/
+        invokeMap<TResult>(
+            method: (...args: any[]) => TResult,
+            ...args: any[]): LoDashImplicitWrapper<TResult[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+        * @see _.invokeMap
+        **/
+        invokeMap(
+            methodName: string,
+            ...args: any[]): LoDashExplicitWrapper<any[]>;
+
+        /**
+        * @see _.invokeMap
+        **/
+        invokeMap<TResult>(
+            method: (...args: any[]) => TResult,
+            ...args: any[]): LoDashExplicitWrapper<TResult[]>;
+    }
+
+    // keyBy
+
+    interface LoDashStatic {
+        /**
+         * Creates an object composed of keys generated from the results of running each element of collection through
+         * iteratee. The corresponding value of each key is the last element responsible for generating the key. The
+         * iteratee function is invoked with one argument: (value).
+         *
+         * @param collection The collection to iterate over.
+         * @param iteratee The function invoked per iteration.
+         * @return Returns the composed aggregate object.
+         */
+        keyBy<T>(
+            collection: List<T> | null | undefined,
+            iteratee?: ValueIterateeCustom<T, PropertyName>
+        ): Dictionary<T>;
+
+        /**
+         * @see _.keyBy
+         */
+        keyBy<T extends object>(
+            collection: T | null | undefined,
+            iteratee?: ValueIterateeCustom<T[keyof T], PropertyName>
+        ): Dictionary<T[keyof T]>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.keyBy
+         */
+        keyBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            iteratee?: ValueIterateeCustom<T, PropertyName>
+        ): LoDashImplicitWrapper<Dictionary<T>>;
+
+        /**
+         * @see _.keyBy
+         */
+        keyBy<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            iteratee?: ValueIterateeCustom<T[keyof T], PropertyName>
+        ): LoDashImplicitWrapper<Dictionary<T[keyof T]>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.keyBy
+         */
+        keyBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            iteratee?: ValueIterateeCustom<T, PropertyName>
+        ): LoDashExplicitWrapper<Dictionary<T>>;
+
+        /**
+         * @see _.keyBy
+         */
+        keyBy<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            iteratee?: ValueIterateeCustom<T[keyof T], PropertyName>
+        ): LoDashExplicitWrapper<Dictionary<T[keyof T]>>;
+    }
+
+    // map
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of values by running each element in collection through iteratee. The iteratee is
+         * invoked with three arguments: (value, index|key, collection).
+         *
+         * Many lodash methods are guarded to work as iteratees for methods like _.every, _.filter, _.map, _.mapValues,
+         * _.reject, and _.some.
+         *
+         * The guarded methods are:
+         * ary, callback, chunk, clone, create, curry, curryRight, drop, dropRight, every, fill, flatten, invert, max,
+         * min, parseInt, slice, sortBy, take, takeRight, template, trim, trimLeft, trimRight, trunc, random, range,
+         * sample, some, sum, uniq, and words
+         *
+         * @param collection The collection to iterate over.
+         * @param iteratee The function invoked per iteration.
+         * @return Returns the new mapped array.
+         */
+        map<T, TResult>(
+            collection: T[] | null | undefined,
+            iteratee: ArrayIterator<T, TResult>
+        ): TResult[];
+
+        /**
+         * @see _.map
+         */
+        map<T, TResult>(
+            collection: List<T> | null | undefined,
+            iteratee: ListIterator<T, TResult>
+        ): TResult[];
+
+        /**
+         * @see _.map
+         */
+        map<T>(collection: List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined): T[];
+
+        /**
+         * @see _.map
+         */
+        map<T extends object, TResult>(
+            collection: T | null | undefined,
+            iteratee: ObjectIterator<T, TResult>
+        ): TResult[];
+
+        /** @see _.map */
+        map<T, K extends keyof T>(
+            collection: List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined,
+            iteratee: K
+        ): Array<T[K]>;
+
+        /**
+         * @see _.map
+         */
+        map<T>(
+            collection: List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined,
+            iteratee?: string
+        ): any[];
+
+        /**
+         * @see _.map
+         */
+        map<T>(
+            collection: List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined,
+            iteratee?: object
+        ): boolean[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.map
+         */
+        map<T, TResult>(
+            this: LoDashImplicitWrapper<T[] | null | undefined>,
+            iteratee: ArrayIterator<T, TResult>
+        ): LoDashImplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.map
+         */
+        map<T, TResult>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            iteratee: ListIterator<T, TResult>
+        ): LoDashImplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.map
+         */
+        map<T>(this: LoDashImplicitWrapper<List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined>): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.map
+         */
+        map<T extends object, TResult>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            iteratee: ObjectIterator<T, TResult>
+        ): LoDashImplicitWrapper<TResult[]>;
+
+        /** @see _.map */
+        map<T, K extends keyof T>(
+            this: LoDashImplicitWrapper<List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            iteratee: K
+        ): LoDashImplicitWrapper<Array<T[K]>>;
+
+        /**
+         * @see _.map
+         */
+        map<T>(
+            this: LoDashImplicitWrapper<List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            iteratee?: string
+        ): LoDashImplicitWrapper<any[]>;
+
+        /**
+         * @see _.map
+         */
+        map<T>(
+            this: LoDashImplicitWrapper<List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            iteratee?: object
+        ): LoDashImplicitWrapper<boolean[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.map
+         */
+        map<T, TResult>(
+            this: LoDashExplicitWrapper<T[] | null | undefined>,
+            iteratee: ArrayIterator<T, TResult>
+        ): LoDashExplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.map
+         */
+        map<T, TResult>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            iteratee: ListIterator<T, TResult>
+        ): LoDashExplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.map
+         */
+        map<T>(this: LoDashExplicitWrapper<List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined>): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.map
+         */
+        map<T extends object, TResult>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            iteratee: ObjectIterator<T, TResult>
+        ): LoDashExplicitWrapper<TResult[]>;
+
+        /** @see _.map */
+        map<T, K extends keyof T>(
+            this: LoDashExplicitWrapper<List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            iteratee: K
+        ): LoDashExplicitWrapper<Array<T[K]>>;
+
+        /**
+         * @see _.map
+         */
+        map<T>(
+            this: LoDashExplicitWrapper<List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            iteratee?: string
+        ): LoDashExplicitWrapper<any[]>;
+
+        /**
+         * @see _.map
+         */
+        map<T>(
+            this: LoDashExplicitWrapper<List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            iteratee?: object
+        ): LoDashExplicitWrapper<boolean[]>;
+    }
+
+    // orderBy
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.sortBy` except that it allows specifying the sort
+         * orders of the iteratees to sort by. If `orders` is unspecified, all values
+         * are sorted in ascending order. Otherwise, specify an order of "desc" for
+         * descending or "asc" for ascending sort order of corresponding values.
+         *
+         * @category Collection
+         * @param collection The collection to iterate over.
+         * @param [iteratees=[_.identity]] The iteratees to sort by.
+         * @param [orders] The sort orders of `iteratees`.
+         * @param- {Object} [guard] Enables use as an iteratee for functions like `_.reduce`.
+         * @returns Returns the new sorted array.
+         * @example
+         *
+         * var users = [
+         *   { 'user': 'fred',   'age': 48 },
+         *   { 'user': 'barney', 'age': 34 },
+         *   { 'user': 'fred',   'age': 42 },
+         *   { 'user': 'barney', 'age': 36 }
+         * ];
+         *
+         * // sort by `user` in ascending order and by `age` in descending order
+         * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
+         * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]
+         */
+        orderBy<T>(
+            collection: List<T> | null | undefined,
+            iteratees?: Many<ListIterator<T, NotVoid>>,
+            orders?: Many<boolean|string>
+        ): T[];
+
+        /**
+         * @see _.orderBy
+         */
+        orderBy<T>(
+            collection: List<T> | null | undefined,
+            iteratees?: Many<ListIteratee<T>>,
+            orders?: Many<boolean|string>
+        ): T[];
+
+        /**
+         * @see _.orderBy
+         */
+        orderBy<T extends object>(
+            collection: T | null | undefined,
+            iteratees?: Many<ObjectIterator<T, NotVoid>>,
+            orders?: Many<boolean|string>
+        ): Array<T[keyof T]>;
+
+        /**
+         * @see _.orderBy
+         */
+        orderBy<T extends object>(
+            collection: T | null | undefined,
+            iteratees?: Many<ObjectIteratee<T>>,
+            orders?: Many<boolean|string>
+        ): Array<T[keyof T]>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.orderBy
+         */
+        orderBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            iteratees?: Many<ListIterator<T, NotVoid>>,
+            orders?: Many<boolean|string>
+        ): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.orderBy
+         */
+        orderBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            iteratees?: Many<ListIteratee<T>>,
+            orders?: Many<boolean|string>
+        ): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.orderBy
+         */
+        orderBy<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            iteratees?: Many<ObjectIterator<T, NotVoid>>,
+            orders?: Many<boolean|string>
+        ): LoDashImplicitWrapper<Array<T[keyof T]>>;
+
+        /**
+         * @see _.orderBy
+         */
+        orderBy<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            iteratees?: Many<ObjectIteratee<T>>,
+            orders?: Many<boolean|string>
+        ): LoDashImplicitWrapper<Array<T[keyof T]>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.orderBy
+         */
+        orderBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            iteratees?: Many<ListIterator<T, NotVoid>>,
+            orders?: Many<boolean|string>
+        ): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.orderBy
+         */
+        orderBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            iteratees?: Many<ListIteratee<T>>,
+            orders?: Many<boolean|string>
+        ): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.orderBy
+         */
+        orderBy<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            iteratees?: Many<ObjectIterator<T, NotVoid>>,
+            orders?: Many<boolean|string>
+        ): LoDashExplicitWrapper<Array<T[keyof T]>>;
+
+        /**
+         * @see _.orderBy
+         */
+        orderBy<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            iteratees?: Many<ObjectIteratee<T>>,
+            orders?: Many<boolean|string>
+        ): LoDashExplicitWrapper<Array<T[keyof T]>>;
+    }
+
+    // partition
+
+    interface LoDashStatic {
+        /**
+        * Creates an array of elements split into two groups, the first of which contains elements predicate returns truthy for,
+        * while the second of which contains elements predicate returns falsey for.
+        * The predicate is invoked with three arguments: (value, index|key, collection).
+        *
+        * @param collection The collection to iterate over.
+        * @param callback The function called per iteration.
+        * @return Returns the array of grouped elements.
+        **/
+        partition<T>(
+            collection: List<T> | null | undefined,
+            callback: ValueIteratee<T>
+        ): [T[], T[]];
+
+        /**
+         * @see _.partition
+         */
+        partition<T extends object>(
+            collection: T | null | undefined,
+            callback: ValueIteratee<T[keyof T]>
+        ): [Array<T[keyof T]>, Array<T[keyof T]>];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.partition
+         */
+        partition<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            callback: ValueIteratee<T>
+        ): LoDashImplicitWrapper<[T[], T[]]>;
+
+        /**
+         * @see _.partition
+         */
+        partition<T>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            callback: ValueIteratee<T[keyof T]>
+        ): LoDashImplicitWrapper<[Array<T[keyof T]>, Array<T[keyof T]>]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.partition
+         */
+        partition<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            callback: ValueIteratee<T>
+        ): LoDashExplicitWrapper<[T[], T[]]>;
+
+        /**
+         * @see _.partition
+         */
+        partition<T>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            callback: ValueIteratee<T[keyof T]>
+        ): LoDashExplicitWrapper<[Array<T[keyof T]>, Array<T[keyof T]>]>;
+    }
+
+    // reduce
+
+    interface LoDashStatic {
+        /**
+        * Reduces a collection to a value which is the accumulated result of running each
+        * element in the collection through the callback, where each successive callback execution
+        * consumes the return value of the previous execution. If accumulator is not provided the
+        * first element of the collection will be used as the initial accumulator value. The callback
+        * is invoked with four arguments: (accumulator, value, index|key, collection).
+        * @param collection The collection to iterate over.
+        * @param callback The function called per iteration.
+        * @param accumulator Initial value of the accumulator.
+        * @return Returns the accumulated value.
+        **/
+        reduce<T, TResult>(
+            collection: T[] | null | undefined,
+            callback: MemoListIterator<T, TResult, T[]>,
+            accumulator: TResult
+        ): TResult;
+
+        /**
+        * @see _.reduce
+        **/
+        reduce<T, TResult>(
+            collection: List<T> | null | undefined,
+            callback: MemoListIterator<T, TResult, List<T>>,
+            accumulator: TResult
+        ): TResult;
+
+        /**
+        * @see _.reduce
+        **/
+        reduce<T extends object, TResult>(
+            collection: T | null | undefined,
+            callback: MemoObjectIterator<T[keyof T], TResult, T>,
+            accumulator: TResult
+        ): TResult;
+
+        /**
+        * @see _.reduce
+        **/
+        reduce<T>(
+            collection: T[] | null | undefined,
+            callback: MemoListIterator<T, T, T[]>
+        ): T | undefined;
+
+        /**
+         * @see _.reduce
+         **/
+        reduce<T>(
+            collection: List<T> | null | undefined,
+            callback: MemoListIterator<T, T, List<T>>
+        ): T | undefined;
+
+        /**
+        * @see _.reduce
+        **/
+        reduce<T extends object>(
+            collection: T | null | undefined,
+            callback: MemoObjectIterator<T[keyof T], T[keyof T], T>
+        ): T[keyof T] | undefined;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+         /**
+        * @see _.reduce
+        **/
+        reduce<T, TResult>(
+            this: LoDashImplicitWrapper<T[] | null | undefined>,
+            callback: MemoListIterator<T, TResult, T[]>,
+            accumulator: TResult
+        ): TResult;
+
+        /**
+         * @see _.reduce
+         **/
+        reduce<T, TResult>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            callback: MemoListIterator<T, TResult, List<T>>,
+            accumulator: TResult
+        ): TResult;
+
+        /**
+        * @see _.reduce
+        **/
+        reduce<T extends object, TResult>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            callback: MemoObjectIterator<T[keyof T], TResult, T>,
+            accumulator: TResult
+        ): TResult;
+
+        /**
+        * @see _.reduce
+        **/
+        reduce<T>(
+            this: LoDashImplicitWrapper<T[] | null | undefined>,
+            callback: MemoListIterator<T, T, T[]>
+        ): T | undefined;
+
+        /**
+        * @see _.reduce
+        **/
+        reduce<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            callback: MemoListIterator<T, T, List<T>>
+        ): T | undefined;
+
+        /**
+        * @see _.reduce
+        **/
+        reduce<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            callback: MemoObjectIterator<T[keyof T], T[keyof T], T>
+        ): T[keyof T] | undefined;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+        * @see _.reduce
+        **/
+        reduce<T, TResult>(
+            this: LoDashExplicitWrapper<T[] | null | undefined>,
+            callback: MemoListIterator<T, TResult, T[]>,
+            accumulator: TResult
+        ): LoDashExplicitWrapper<TResult>;
+
+        /**
+        * @see _.reduce
+        **/
+        reduce<T, TResult>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            callback: MemoListIterator<T, TResult, List<T>>,
+            accumulator: TResult
+        ): LoDashExplicitWrapper<TResult>;
+
+        /**
+        * @see _.reduce
+        **/
+        reduce<T extends object, TResult>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            callback: MemoObjectIterator<T[keyof T], TResult, T>,
+            accumulator: TResult
+        ): LoDashExplicitWrapper<TResult>;
+
+        /**
+        * @see _.reduce
+        **/
+        reduce<T>(
+            this: LoDashExplicitWrapper<T[] | null | undefined>,
+            callback: MemoListIterator<T, T, T[]>
+        ): LoDashExplicitWrapper<T | undefined>;
+
+        /**
+        * @see _.reduce
+        **/
+        reduce<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            callback: MemoListIterator<T, T, List<T>>
+        ): LoDashExplicitWrapper<T | undefined>;
+
+        /**
+        * @see _.reduce
+        **/
+        reduce<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            callback: MemoObjectIterator<T[keyof T], T[keyof T], T>
+        ): LoDashExplicitWrapper<T[keyof T] | undefined>;
+    }
+
+    // reduceRight
+
+    interface LoDashStatic {
+        /**
+        * This method is like _.reduce except that it iterates over elements of a collection from
+        * right to left.
+        * @param collection The collection to iterate over.
+        * @param callback The function called per iteration.
+        * @param accumulator Initial value of the accumulator.
+        * @return The accumulated value.
+        **/
+        reduceRight<T, TResult>(
+            collection: T[] | null | undefined,
+            callback: MemoListIterator<T, TResult, T[]>,
+            accumulator: TResult
+        ): TResult;
+
+        /**
+        * @see _.reduceRight
+        **/
+        reduceRight<T, TResult>(
+            collection: List<T> | null | undefined,
+            callback: MemoListIterator<T, TResult, List<T>>,
+            accumulator: TResult
+        ): TResult;
+
+        /**
+        * @see _.reduceRight
+        **/
+        reduceRight<T extends object, TResult>(
+            collection: T | null | undefined,
+            callback: MemoObjectIterator<T[keyof T], TResult, T>,
+            accumulator: TResult
+        ): TResult;
+
+        /**
+        * @see _.reduceRight
+        **/
+        reduceRight<T>(
+            collection: T[] | null | undefined,
+            callback: MemoListIterator<T, T, T[]>
+        ): T | undefined;
+
+        /**
+        * @see _.reduceRight
+        **/
+        reduceRight<T>(
+            collection: List<T> | null | undefined,
+            callback: MemoListIterator<T, T, List<T>>
+        ): T | undefined;
+
+        /**
+        * @see _.reduceRight
+        **/
+        reduceRight<T extends object>(
+            collection: T | null | undefined,
+            callback: MemoObjectIterator<T[keyof T], T[keyof T], T>
+        ): T[keyof T] | undefined;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+         /**
+        * @see _.reduceRight
+        **/
+        reduceRight<T, TResult>(
+            this: LoDashImplicitWrapper<T[] | null | undefined>,
+            callback: MemoListIterator<T, TResult, T[]>,
+            accumulator: TResult
+        ): TResult;
+
+        /**
+        * @see _.reduceRight
+        **/
+        reduceRight<T, TResult>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            callback: MemoListIterator<T, TResult, List<T>>,
+            accumulator: TResult
+        ): TResult;
+
+        /**
+        * @see _.reduceRight
+        **/
+        reduceRight<T extends object, TResult>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            callback: MemoObjectIterator<T[keyof T], TResult, T>,
+            accumulator: TResult
+        ): TResult;
+
+        /**
+        * @see _.reduceRight
+        **/
+        reduceRight<T>(
+            this: LoDashImplicitWrapper<T[] | null | undefined>,
+            callback: MemoListIterator<T, T, T[]>
+        ): T | undefined;
+
+        /**
+        * @see _.reduceRight
+        **/
+        reduceRight<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            callback: MemoListIterator<T, T, List<T>>
+        ): T | undefined;
+
+        /**
+        * @see _.reduceRight
+        **/
+        reduceRight<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            callback: MemoObjectIterator<T[keyof T], T[keyof T], T>
+        ): T[keyof T] | undefined;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+        * @see _.reduceRight
+        **/
+        reduceRight<T, TResult>(
+            this: LoDashExplicitWrapper<T[] | null | undefined>,
+            callback: MemoListIterator<T, TResult, T[]>,
+            accumulator: TResult
+        ): LoDashExplicitWrapper<TResult>;
+
+        /**
+        * @see _.reduceRight
+        **/
+        reduceRight<T, TResult>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            callback: MemoListIterator<T, TResult, List<T>>,
+            accumulator: TResult
+        ): LoDashExplicitWrapper<TResult>;
+
+        /**
+        * @see _.reduceRight
+        **/
+        reduceRight<T extends object, TResult>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            callback: MemoObjectIterator<T[keyof T], TResult, T>,
+            accumulator: TResult
+        ): LoDashExplicitWrapper<TResult>;
+
+        /**
+        * @see _.reduceRight
+        **/
+        reduceRight<T>(
+            this: LoDashExplicitWrapper<T[] | null | undefined>,
+            callback: MemoListIterator<T, T, T[]>
+        ): LoDashExplicitWrapper<T | undefined>;
+
+        /**
+        * @see _.reduceRight
+        **/
+        reduceRight<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            callback: MemoListIterator<T, T, List<T>>
+        ): LoDashExplicitWrapper<T | undefined>;
+
+        /**
+        * @see _.reduceRight
+        **/
+        reduceRight<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            callback: MemoObjectIterator<T[keyof T], T[keyof T], T>
+        ): LoDashExplicitWrapper<T[keyof T] | undefined>;
+    }
+
+    // reject
+
+    interface LoDashStatic {
+        /**
+         * The opposite of _.filter; this method returns the elements of collection that predicate does not return
+         * truthy for.
+         *
+         * @param collection The collection to iterate over.
+         * @param predicate The function invoked per iteration.
+         * @return Returns the new filtered array.
+         */
+        reject(
+            collection: string | null | undefined,
+            predicate?: StringIterator<boolean>
+        ): string[];
+
+        /**
+         * @see _.reject
+         */
+        reject<T>(
+            collection: List<T> | null | undefined,
+            predicate?: ListIterateeCustom<T, boolean>
+        ): T[];
+
+        /**
+         * @see _.reject
+         */
+        reject<T extends object>(
+            collection: T | null | undefined,
+            predicate?: ObjectIterateeCustom<T, boolean>
+        ): Array<T[keyof T]>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.reject
+         */
+        reject(
+            this: LoDashImplicitWrapper<string | null | undefined>,
+            predicate?: StringIterator<boolean>
+        ): LoDashImplicitWrapper<string[]>;
+
+        /**
+         * @see _.reject
+         */
+        reject<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIterateeCustom<T, boolean>
+        ): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.reject
+         */
+        reject<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            predicate?: ObjectIterateeCustom<T, boolean>
+        ): LoDashImplicitWrapper<Array<T[keyof T]>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.reject
+         */
+        reject(
+            this: LoDashExplicitWrapper<string | null | undefined>,
+            predicate?: StringIterator<boolean>
+        ): LoDashExplicitWrapper<string[]>;
+
+        /**
+         * @see _.reject
+         */
+        reject<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIterateeCustom<T, boolean>
+        ): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.reject
+         */
+        reject<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            predicate?: ObjectIterateeCustom<T, boolean>
+        ): LoDashExplicitWrapper<Array<T[keyof T]>>;
+    }
+
+    // sample
+
+    interface LoDashStatic {
+        /**
+         * Gets a random element from collection.
+         *
+         * @param collection The collection to sample.
+         * @return Returns the random element.
+         */
+        sample<T>(
+            collection: List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined
+        ): T | undefined;
+
+        /**
+         * @see _.sample
+         */
+        sample<T extends object>(
+            collection: T | null | undefined
+        ): T[keyof T] | undefined;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.sample
+         */
+        sample<T>(
+            this: LoDashImplicitWrapper<List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined>
+        ): T | undefined;
+
+        /**
+         * @see _.sample
+         */
+        sample<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>
+        ): T[keyof T] | undefined;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.sample
+         */
+        sample<T>(
+            this: LoDashExplicitWrapper<List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined>
+        ): LoDashExplicitWrapper<T | undefined>;
+
+        /**
+         * @see _.sample
+         */
+        sample<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>
+        ): LoDashExplicitWrapper<T[keyof T] | undefined>;
+    }
+
+    // sampleSize
+
+    interface LoDashStatic {
+        /**
+         * Gets n random elements at unique keys from collection up to the size of collection.
+         *
+         * @param collection The collection to sample.
+         * @param n The number of elements to sample.
+         * @return Returns the random elements.
+         */
+        sampleSize<T>(
+            collection: List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined,
+            n?: number
+        ): T[];
+
+        /**
+         * @see _.sampleSize
+         */
+        sampleSize<T extends object>(
+            collection: T | null | undefined,
+            n?: number
+        ): Array<T[keyof T]>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.sampleSize
+         */
+        sampleSize<T>(
+            this: LoDashImplicitWrapper<List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            n?: number
+        ): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.sampleSize
+         */
+        sampleSize<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            n?: number
+        ): LoDashImplicitWrapper<Array<T[keyof T]>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.sampleSize
+         */
+        sampleSize<T>(
+            this: LoDashExplicitWrapper<List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            n?: number
+        ): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.sampleSize
+         */
+        sampleSize<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            n?: number
+        ): LoDashExplicitWrapper<Array<T[keyof T]>>;
+    }
+
+    // shuffle
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of shuffled values, using a version of the Fisher-Yates shuffle.
+         *
+         * @param collection The collection to shuffle.
+         * @return Returns the new shuffled array.
+         */
+        shuffle<T>(collection: List<T> | null | undefined): T[];
+
+        /**
+         * @see _.shuffle
+         */
+        shuffle<T extends object>(collection: T | null | undefined): Array<T[keyof T]>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.shuffle
+         */
+        shuffle<T>(this: LoDashImplicitWrapper<List<T> | null | undefined>): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.shuffle
+         */
+        shuffle<T extends object>(this: LoDashImplicitWrapper<T | null | undefined>): LoDashImplicitWrapper<Array<T[keyof T]>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.shuffle
+         */
+        shuffle<T>(this: LoDashExplicitWrapper<List<T> | null | undefined>): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.shuffle
+         */
+        shuffle<T extends object>(this: LoDashExplicitWrapper<T | null | undefined>): LoDashExplicitWrapper<Array<T[keyof T]>>;
+    }
+
+    // size
+
+    interface LoDashStatic {
+        /**
+         * Gets the size of collection by returning its length for array-like values or the number of own enumerable
+         * properties for objects.
+         *
+         * @param collection The collection to inspect.
+         * @return Returns the size of collection.
+         */
+        size(collection: object | string | null | undefined): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.size
+         */
+        size(): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.size
+         */
+        size(): LoDashExplicitWrapper<number>;
+    }
+
+    // some
+
+    interface LoDashStatic {
+        /**
+         * Checks if predicate returns truthy for any element of collection. Iteration is stopped once predicate
+         * returns truthy. The predicate is invoked with three arguments: (value, index|key, collection).
+         *
+         * @param collection The collection to iterate over.
+         * @param predicate The function invoked per iteration.
+         * @return Returns true if any element passes the predicate check, else false.
+         */
+        some<T>(
+            collection: List<T> | null | undefined,
+            predicate?: ListIterateeCustom<T, boolean>
+        ): boolean;
+
+        /**
+         * @see _.some
+         */
+        some<T extends object>(
+            collection: T | null | undefined,
+            predicate?: ObjectIterateeCustom<T, boolean>
+        ): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.some
+         */
+        some<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIterateeCustom<T, boolean>
+        ): boolean;
+
+        /**
+         * @see _.some
+         */
+        some<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            predicate?: ObjectIterateeCustom<T, boolean>
+        ): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.some
+         */
+        some<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            predicate?: ListIterateeCustom<T, boolean>
+        ): LoDashExplicitWrapper<boolean>;
+
+        /**
+         * @see _.some
+         */
+        some<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            predicate?: ObjectIterateeCustom<T, boolean>
+        ): LoDashExplicitWrapper<boolean>;
+    }
+
+    // sortBy
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of elements, sorted in ascending order by the results of
+         * running each element in a collection through each iteratee. This method
+         * performs a stable sort, that is, it preserves the original sort order of
+         * equal elements. The iteratees are invoked with one argument: (value).
+         *
+         * @category Collection
+         * @param collection The collection to iterate over.
+         * @param [iteratees=[_.identity]]
+         *  The iteratees to sort by, specified individually or in arrays.
+         * @returns Returns the new sorted array.
+         * @example
+         *
+         * var users = [
+         *   { 'user': 'fred',   'age': 48 },
+         *   { 'user': 'barney', 'age': 36 },
+         *   { 'user': 'fred',   'age': 42 },
+         *   { 'user': 'barney', 'age': 34 }
+         * ];
+         *
+         * _.sortBy(users, function(o) { return o.user; });
+         * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]
+         *
+         * _.sortBy(users, ['user', 'age']);
+         * // => objects for [['barney', 34], ['barney', 36], ['fred', 42], ['fred', 48]]
+         *
+         * _.sortBy(users, 'user', function(o) {
+         *   return Math.floor(o.age / 10);
+         * });
+         * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]
+         */
+        sortBy<T>(
+            collection: List<T> | null | undefined,
+            ...iteratees: Array<Many<ListIteratee<T>>>
+        ): T[];
+
+        /**
+         * @see _.sortBy
+         */
+        sortBy<T extends object>(
+            collection: T | null | undefined,
+            ...iteratees: Array<Many<ObjectIteratee<T>>>
+        ): Array<T[keyof T]>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.sortBy
+         */
+        sortBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            ...iteratees: Array<Many<ListIteratee<T>>>
+        ): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.sortBy
+         */
+        sortBy<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            ...iteratees: Array<Many<ObjectIteratee<T>>>
+        ): LoDashImplicitWrapper<Array<T[keyof T]>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.sortBy
+         */
+        sortBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            ...iteratees: Array<Many<ListIteratee<T>>>
+        ): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.sortBy
+         */
+        sortBy<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            ...iteratees: Array<Many<ObjectIteratee<T>>>
+        ): LoDashExplicitWrapper<Array<T[keyof T]>>;
+    }
+}
diff --git a/jtg js/node_modules/@types/lodash/common/common.d.ts b/jtg js/node_modules/@types/lodash/common/common.d.ts
new file mode 100644
index 0000000..d0856a0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/common/common.d.ts	
@@ -0,0 +1,268 @@
+import _ = require("../index");
+// tslint:disable-next-line:strict-export-declare-modifiers
+type GlobalPartial<T> = Partial<T>;
+declare module "../index" {
+    type PartialObject<T> = GlobalPartial<T>;
+    type Many<T> = T | T[]; // TODO: Should be ReadonlyArray<T>, but requires ts2.5 to not infinitely loop
+    interface LoDashStatic {
+        /**
+        * Creates a lodash object which wraps value to enable implicit method chain sequences.
+        * Methods that operate on and return arrays, collections, and functions can be chained together.
+        * Methods that retrieve a single value or may return a primitive value will automatically end the
+        * chain sequence and return the unwrapped value. Otherwise, the value must be unwrapped with value().
+        *
+        * Explicit chain sequences, which must be unwrapped with value(), may be enabled using _.chain.
+        *
+        * The execution of chained methods is lazy, that is, it's deferred until value() is
+        * implicitly or explicitly called.
+        *
+        * Lazy evaluation allows several methods to support shortcut fusion. Shortcut fusion
+        * is an optimization to merge iteratee calls; this avoids the creation of intermediate
+        * arrays and can greatly reduce the number of iteratee executions. Sections of a chain
+        * sequence qualify for shortcut fusion if the section is applied to an array and iteratees
+        * accept only one argument. The heuristic for whether a section qualifies for shortcut
+        * fusion is subject to change.
+        *
+        * Chaining is supported in custom builds as long as the value() method is directly or
+        * indirectly included in the build.
+        *
+        * In addition to lodash methods, wrappers have Array and String methods.
+        * The wrapper Array methods are:
+        * concat, join, pop, push, shift, sort, splice, and unshift.
+        * The wrapper String methods are:
+        * replace and split.
+        *
+        * The wrapper methods that support shortcut fusion are:
+        * at, compact, drop, dropRight, dropWhile, filter, find, findLast, head, initial, last,
+        * map, reject, reverse, slice, tail, take, takeRight, takeRightWhile, takeWhile, and toArray
+        *
+        * The chainable wrapper methods are:
+        * after, ary, assign, assignIn, assignInWith, assignWith, at, before, bind, bindAll, bindKey,
+        * castArray, chain, chunk, commit, compact, concat, conforms, constant, countBy, create,
+        * curry, debounce, defaults, defaultsDeep, defer, delay, difference, differenceBy, differenceWith,
+        * drop, dropRight, dropRightWhile, dropWhile, extend, extendWith, fill, filter, flatMap,
+        * flatMapDeep, flatMapDepth, flatten, flattenDeep, flattenDepth, flip, flow, flowRight,
+        * fromPairs, functions, functionsIn, groupBy, initial, intersection, intersectionBy, intersectionWith,
+        * invert, invertBy, invokeMap, iteratee, keyBy, keys, keysIn, map, mapKeys, mapValues,
+        * matches, matchesProperty, memoize, merge, mergeWith, method, methodOf, mixin, negate,
+        * nthArg, omit, omitBy, once, orderBy, over, overArgs, overEvery, overSome, partial, partialRight,
+        * partition, pick, pickBy, plant, property, propertyOf, pull, pullAll, pullAllBy, pullAllWith, pullAt,
+        * push, range, rangeRight, rearg, reject, remove, rest, reverse, sampleSize, set, setWith,
+        * shuffle, slice, sort, sortBy, sortedUniq, sortedUniqBy, splice, spread, tail, take,
+        * takeRight, takeRightWhile, takeWhile, tap, throttle, thru, toArray, toPairs, toPairsIn,
+        * toPath, toPlainObject, transform, unary, union, unionBy, unionWith, uniq, uniqBy, uniqWith,
+        * unset, unshift, unzip, unzipWith, update, updateWith, values, valuesIn, without, wrap,
+        * xor, xorBy, xorWith, zip, zipObject, zipObjectDeep, and zipWith.
+        *
+        * The wrapper methods that are not chainable by default are:
+        * add, attempt, camelCase, capitalize, ceil, clamp, clone, cloneDeep, cloneDeepWith, cloneWith,
+        * conformsTo, deburr, defaultTo, divide, each, eachRight, endsWith, eq, escape, escapeRegExp,
+        * every, find, findIndex, findKey, findLast, findLastIndex, findLastKey, first, floor, forEach,
+        * forEachRight, forIn, forInRight, forOwn, forOwnRight, get, gt, gte, has, hasIn, head,
+        * identity, includes, indexOf, inRange, invoke, isArguments, isArray, isArrayBuffer,
+        * isArrayLike, isArrayLikeObject, isBoolean, isBuffer, isDate, isElement, isEmpty, isEqual, isEqualWith,
+        * isError, isFinite, isFunction, isInteger, isLength, isMap, isMatch, isMatchWith, isNaN,
+        * isNative, isNil, isNull, isNumber, isObject, isObjectLike, isPlainObject, isRegExp,
+        * isSafeInteger, isSet, isString, isUndefined, isTypedArray, isWeakMap, isWeakSet, join,
+        * kebabCase, last, lastIndexOf, lowerCase, lowerFirst, lt, lte, max, maxBy, mean, meanBy,
+        * min, minBy, multiply, noConflict, noop, now, nth, pad, padEnd, padStart, parseInt, pop,
+        * random, reduce, reduceRight, repeat, result, round, runInContext, sample, shift, size,
+        * snakeCase, some, sortedIndex, sortedIndexBy, sortedLastIndex, sortedLastIndexBy, startCase,
+        * startsWith, stubArray, stubFalse, stubObject, stubString, stubTrue, subtract, sum, sumBy,
+        * template, times, toFinite, toInteger, toJSON, toLength, toLower, toNumber, toSafeInteger,
+        * toString, toUpper, trim, trimEnd, trimStart, truncate, unescape, uniqueId, upperCase,
+        * upperFirst, value, and words.
+        **/
+        <T>(value: T): LoDashImplicitWrapper<T>;
+
+        /**
+        * The semantic version number.
+        **/
+        VERSION: string;
+
+        /**
+        * By default, the template delimiters used by Lo-Dash are similar to those in embedded Ruby
+        * (ERB). Change the following template settings to use alternative delimiters.
+        **/
+        templateSettings: TemplateSettings;
+    }
+
+    /**
+    * By default, the template delimiters used by Lo-Dash are similar to those in embedded Ruby
+    * (ERB). Change the following template settings to use alternative delimiters.
+    **/
+    interface TemplateSettings {
+        /**
+        * The "escape" delimiter.
+        **/
+        escape?: RegExp;
+
+        /**
+        * The "evaluate" delimiter.
+        **/
+        evaluate?: RegExp;
+
+        /**
+        * An object to import into the template as local variables.
+        **/
+        imports?: Dictionary<any>;
+
+        /**
+        * The "interpolate" delimiter.
+        **/
+        interpolate?: RegExp;
+
+        /**
+        * Used to reference the data object in the template text.
+        **/
+        variable?: string;
+    }
+
+    /**
+     * Creates a cache object to store key/value pairs.
+     */
+    interface MapCache {
+        /**
+         * Removes `key` and its value from the cache.
+         * @param key The key of the value to remove.
+         * @return Returns `true` if the entry was removed successfully, else `false`.
+         */
+        delete(key: string): boolean;
+
+        /**
+         * Gets the cached value for `key`.
+         * @param key The key of the value to get.
+         * @return Returns the cached value.
+         */
+        get(key: string): any;
+
+        /**
+         * Checks if a cached value for `key` exists.
+         * @param key The key of the entry to check.
+         * @return Returns `true` if an entry for `key` exists, else `false`.
+         */
+        has(key: string): boolean;
+
+        /**
+         * Sets `value` to `key` of the cache.
+         * @param key The key of the value to cache.
+         * @param value The value to cache.
+         * @return Returns the cache object.
+         */
+        set(key: string, value: any): Dictionary<any>;
+
+        /**
+         * Removes all key-value entries from the map.
+         */
+        clear(): void;
+    }
+    interface MapCacheConstructor {
+        new (): MapCache;
+    }
+
+    interface LoDashImplicitWrapper<TValue> extends LoDashWrapper<TValue> {
+        pop<T>(this: LoDashImplicitWrapper<List<T> | null | undefined>): T | undefined;
+        push<T>(this: LoDashImplicitWrapper<List<T> | null | undefined>, ...items: T[]): this;
+        shift<T>(this: LoDashImplicitWrapper<List<T> | null | undefined>): T | undefined;
+        sort<T>(this: LoDashImplicitWrapper<List<T> | null | undefined>, compareFn?: (a: T, b: T) => number): this;
+        splice<T>(this: LoDashImplicitWrapper<List<T> | null | undefined>, start: number, deleteCount?: number, ...items: T[]): this;
+        unshift<T>(this: LoDashImplicitWrapper<List<T> | null | undefined>, ...items: T[]): this;
+    }
+
+    interface LoDashExplicitWrapper<TValue> extends LoDashWrapper<TValue> {
+        pop<T>(this: LoDashExplicitWrapper<List<T> | null | undefined>): LoDashExplicitWrapper<T | undefined>;
+        push<T>(this: LoDashExplicitWrapper<List<T> | null | undefined>, ...items: T[]): this;
+        shift<T>(this: LoDashExplicitWrapper<List<T> | null | undefined>): LoDashExplicitWrapper<T | undefined>;
+        sort<T>(this: LoDashExplicitWrapper<List<T> | null | undefined>, compareFn?: (a: T, b: T) => number): this;
+        splice<T>(this: LoDashExplicitWrapper<List<T> | null | undefined>, start: number, deleteCount?: number, ...items: T[]): this;
+        unshift<T>(this: LoDashExplicitWrapper<List<T> | null | undefined>, ...items: T[]): this;
+    }
+
+    type NotVoid = {} | null | undefined;
+    type ArrayIterator<T, TResult> = (value: T, index: number, collection: T[]) => TResult;
+    type ListIterator<T, TResult> = (value: T, index: number, collection: List<T>) => TResult;
+    type ListIteratee<T> = ListIterator<T, NotVoid> | string | [string, any] | PartialDeep<T>;
+    type ListIterateeCustom<T, TResult> = ListIterator<T, TResult> | string | [string, any] | PartialDeep<T>;
+    type ListIteratorTypeGuard<T, S extends T> = (value: T, index: number, collection: List<T>) => value is S;
+
+    // Note: key should be string, not keyof T, because the actual object may contain extra properties that were not specified in the type.
+    type ObjectIterator<TObject, TResult> = (value: TObject[keyof TObject], key: string, collection: TObject) => TResult;
+    type ObjectIteratee<TObject> = ObjectIterator<TObject, NotVoid> | string | [string, any] | PartialDeep<TObject[keyof TObject]>;
+    type ObjectIterateeCustom<TObject, TResult> = ObjectIterator<TObject, TResult> | string | [string, any] | PartialDeep<TObject[keyof TObject]>;
+    type ObjectIteratorTypeGuard<TObject, S extends TObject[keyof TObject]> = (value: TObject[keyof TObject], key: string, collection: TObject) => value is S;
+
+    type StringIterator<TResult> = (char: string, index: number, string: string) => TResult;
+
+    /** @deprecated Use MemoVoidArrayIterator or MemoVoidDictionaryIterator instead. */
+    type MemoVoidIterator<T, TResult> = (prev: TResult, curr: T, indexOrKey: any, list: T[]) => void;
+
+    /** @deprecated Use MemoListIterator or MemoObjectIterator instead. */
+    type MemoIterator<T, TResult> = (prev: TResult, curr: T, indexOrKey: any, list: T[]) => TResult;
+    type MemoListIterator<T, TResult, TList> = (prev: TResult, curr: T, index: number, list: TList) => TResult;
+    type MemoObjectIterator<T, TResult, TList> = (prev: TResult, curr: T, key: string, list: TList) => TResult;
+    type MemoIteratorCapped<T, TResult> = (prev: TResult, curr: T) => TResult;
+    type MemoIteratorCappedRight<T, TResult> = (curr: T, prev: TResult) => TResult;
+
+    type MemoVoidArrayIterator<T, TResult> = (acc: TResult, curr: T, index: number, arr: T[]) => void;
+    type MemoVoidDictionaryIterator<T, TResult> = (acc: TResult, curr: T, key: string, dict: Dictionary<T>) => void;
+    type MemoVoidIteratorCapped<T, TResult> = (acc: TResult, curr: T) => void;
+
+    type ValueIteratee<T> = ((value: T) => NotVoid) | string | [string, any] | PartialDeep<T>;
+    type ValueIterateeCustom<T, TResult> = ((value: T) => TResult) | string | [string, any] | PartialDeep<T>;
+    type ValueIteratorTypeGuard<T, S extends T> = (value: T) => value is S;
+    type ValueKeyIteratee<T> = ((value: T, key: string) => NotVoid) | string | [string, any] | PartialDeep<T>;
+    type Comparator<T> = (a: T, b: T) => boolean;
+    type Comparator2<T1, T2> = (a: T1, b: T2) => boolean;
+
+    type PropertyName = string | number | symbol;
+    type PropertyPath = Many<PropertyName>;
+
+    type Omit<T, K extends keyof T> = Pick<T, ({ [P in keyof T]: P } & { [P in K]: never } & { [x: string]: never })[keyof T]>;
+
+    /** Common interface between Arrays and jQuery objects */
+    type List<T> = ArrayLike<T>;
+
+    interface Dictionary<T> {
+        [index: string]: T;
+    }
+
+    interface NumericDictionary<T> {
+        [index: number]: T;
+    }
+
+    // Crazy typedef needed get _.omit to work properly with Dictionary and NumericDictionary
+    type AnyKindOfDictionary =
+        | Dictionary<{} | null | undefined>
+        | NumericDictionary<{} | null | undefined>;
+
+    interface Cancelable {
+        cancel(): void;
+        flush(): void;
+    }
+
+    type PartialDeep<T> = {
+        [P in keyof T]?: PartialDeep<T[P]>;
+    };
+
+    // For backwards compatibility
+    type LoDashImplicitArrayWrapper<T> = LoDashImplicitWrapper<T[]>;
+    type LoDashImplicitNillableArrayWrapper<T> = LoDashImplicitWrapper<T[] | null | undefined>;
+    type LoDashImplicitObjectWrapper<T> = LoDashImplicitWrapper<T>;
+    type LoDashImplicitNillableObjectWrapper<T> = LoDashImplicitWrapper<T | null | undefined>;
+    type LoDashImplicitNumberArrayWrapper = LoDashImplicitWrapper<number[]>;
+    type LoDashImplicitStringWrapper = LoDashImplicitWrapper<string>;
+    type LoDashExplicitArrayWrapper<T> = LoDashExplicitWrapper<T[]>;
+    type LoDashExplicitNillableArrayWrapper<T> = LoDashExplicitWrapper<T[] | null | undefined>;
+    type LoDashExplicitObjectWrapper<T> = LoDashExplicitWrapper<T>;
+    type LoDashExplicitNillableObjectWrapper<T> = LoDashExplicitWrapper<T | null | undefined>;
+    type LoDashExplicitNumberArrayWrapper = LoDashExplicitWrapper<number[]>;
+    type LoDashExplicitStringWrapper = LoDashExplicitWrapper<string>;
+
+    type DictionaryIterator<T, TResult> = ObjectIterator<Dictionary<T>, TResult>;
+    type DictionaryIteratee<T> = ObjectIteratee<Dictionary<T>>;
+    type DictionaryIteratorTypeGuard<T, S extends T> = ObjectIteratorTypeGuard<Dictionary<T>, S>;
+    // NOTE: keys of objects at run time are always strings, even when a NumericDictionary is being iterated.
+    type NumericDictionaryIterator<T, TResult> = (value: T, key: string, collection: NumericDictionary<T>) => TResult;
+    type NumericDictionaryIteratee<T> = NumericDictionaryIterator<T, NotVoid> | string | [string, any] | PartialDeep<T>;
+    type NumericDictionaryIterateeCustom<T, TResult> = NumericDictionaryIterator<T, TResult> | string | [string, any] | PartialDeep<T>;
+}
diff --git a/jtg js/node_modules/@types/lodash/common/date.d.ts b/jtg js/node_modules/@types/lodash/common/date.d.ts
new file mode 100644
index 0000000..79131e4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/common/date.d.ts	
@@ -0,0 +1,27 @@
+import _ = require("../index");
+declare module "../index" {
+    // now
+
+    interface LoDashStatic {
+        /**
+         * Gets the number of milliseconds that have elapsed since the Unix epoch (1 January 1970 00:00:00 UTC).
+         *
+         * @return The number of milliseconds.
+         */
+        now(): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.now
+         */
+        now(): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.now
+         */
+        now(): LoDashExplicitWrapper<number>;
+    }
+}
diff --git a/jtg js/node_modules/@types/lodash/common/function.d.ts b/jtg js/node_modules/@types/lodash/common/function.d.ts
new file mode 100644
index 0000000..71ec3bb
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/common/function.d.ts	
@@ -0,0 +1,1473 @@
+import _ = require("../index");
+declare module "../index" {
+    // after
+
+    interface LoDashStatic {
+        /**
+         * The opposite of _.before; this method creates a function that invokes func once it’s called n or more times.
+         *
+         * @param n The number of calls before func is invoked.
+         * @param func The function to restrict.
+         * @return Returns the new restricted function.
+         */
+        after<TFunc extends (...args: any[]) => any>(
+            n: number,
+            func: TFunc
+        ): TFunc;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+        * @see _.after
+        **/
+        after<TFunc extends (...args: any[]) => any>(func: TFunc): LoDashImplicitWrapper<TFunc>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.after
+         **/
+        after<TFunc extends (...args: any[]) => any>(func: TFunc): LoDashExplicitWrapper<TFunc>;
+    }
+
+    // ary
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that accepts up to n arguments ignoring any additional arguments.
+         *
+         * @param func The function to cap arguments for.
+         * @param n The arity cap.
+         * @returns Returns the new function.
+         */
+        ary(
+            func: (...args: any[]) => any,
+            n?: number
+        ): (...args: any[]) => any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.ary
+         */
+        ary(n?: number): LoDashImplicitWrapper<(...args: any[]) => any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.ary
+         */
+        ary(n?: number): LoDashExplicitWrapper<(...args: any[]) => any>;
+    }
+
+    // before
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that invokes func, with the this binding and arguments of the created function, while
+         * it’s called less than n times. Subsequent calls to the created function return the result of the last func
+         * invocation.
+         *
+         * @param n The number of calls at which func is no longer invoked.
+         * @param func The function to restrict.
+         * @return Returns the new restricted function.
+         */
+        before<TFunc extends (...args: any[]) => any>(
+            n: number,
+            func: TFunc
+        ): TFunc;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.before
+         **/
+        before<TFunc extends (...args: any[]) => any>(func: TFunc): LoDashImplicitWrapper<TFunc>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.before
+         **/
+        before<TFunc extends (...args: any[]) => any>(func: TFunc): LoDashExplicitWrapper<TFunc>;
+    }
+
+    // bind
+
+    interface FunctionBind {
+        placeholder: __;
+
+        (
+            func: (...args: any[]) => any,
+            thisArg: any,
+            ...partials: any[]
+        ): (...args: any[]) => any;
+    }
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that invokes func with the this binding of thisArg and prepends any additional _.bind
+         * arguments to those provided to the bound function.
+         *
+         * The _.bind.placeholder value, which defaults to _ in monolithic builds, may be used as a placeholder for
+         * partially applied arguments.
+         *
+         * Note: Unlike native Function#bind this method does not set the "length" property of bound functions.
+         *
+         * @param func The function to bind.
+         * @param thisArg The this binding of func.
+         * @param partials The arguments to be partially applied.
+         * @return Returns the new bound function.
+         */
+        bind: FunctionBind;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.bind
+         */
+        bind(
+            thisArg: any,
+            ...partials: any[]
+        ): LoDashImplicitWrapper<(...args: any[]) => any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.bind
+         */
+        bind(
+            thisArg: any,
+            ...partials: any[]
+        ): LoDashExplicitWrapper<(...args: any[]) => any>;
+    }
+
+    // bindKey
+
+    interface FunctionBindKey {
+        placeholder: __;
+
+        (
+            object: object,
+            key: string,
+            ...partials: any[]
+        ): (...args: any[]) => any;
+    }
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that invokes the method at object[key] and prepends any additional _.bindKey arguments
+         * to those provided to the bound function.
+         *
+         * This method differs from _.bind by allowing bound functions to reference methods that may be redefined
+         * or don’t yet exist. See Peter Michaux’s article for more details.
+         *
+         * The _.bindKey.placeholder value, which defaults to _ in monolithic builds, may be used as a placeholder
+         * for partially applied arguments.
+         *
+         * @param object The object the method belongs to.
+         * @param key The key of the method.
+         * @param partials The arguments to be partially applied.
+         * @return Returns the new bound function.
+         */
+        bindKey: FunctionBindKey;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.bindKey
+         */
+        bindKey(
+            key: string,
+            ...partials: any[]
+        ): LoDashImplicitWrapper<(...args: any[]) => any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.bindKey
+         */
+        bindKey(
+            key: string,
+            ...partials: any[]
+        ): LoDashExplicitWrapper<(...args: any[]) => any>;
+    }
+
+    // curry
+
+    interface Curry {
+        /**
+         * Creates a function that accepts one or more arguments of func that when called either invokes func returning
+         * its result, if all func arguments have been provided, or returns a function that accepts one or more of the
+         * remaining func arguments, and so on. The arity of func may be specified if func.length is not sufficient.
+         * @param func The function to curry.
+         * @param arity The arity of func.
+         * @return Returns the new curried function.
+         */
+        <T1, R>(func: (t1: T1) => R, arity?: number):
+            CurriedFunction1<T1, R>;
+        /**
+         * Creates a function that accepts one or more arguments of func that when called either invokes func returning
+         * its result, if all func arguments have been provided, or returns a function that accepts one or more of the
+         * remaining func arguments, and so on. The arity of func may be specified if func.length is not sufficient.
+         * @param func The function to curry.
+         * @param arity The arity of func.
+         * @return Returns the new curried function.
+         */
+        <T1, T2, R>(func: (t1: T1, t2: T2) => R, arity?: number):
+            CurriedFunction2<T1, T2, R>;
+        /**
+         * Creates a function that accepts one or more arguments of func that when called either invokes func returning
+         * its result, if all func arguments have been provided, or returns a function that accepts one or more of the
+         * remaining func arguments, and so on. The arity of func may be specified if func.length is not sufficient.
+         * @param func The function to curry.
+         * @param arity The arity of func.
+         * @return Returns the new curried function.
+         */
+        <T1, T2, T3, R>(func: (t1: T1, t2: T2, t3: T3) => R, arity?: number):
+            CurriedFunction3<T1, T2, T3, R>;
+        /**
+         * Creates a function that accepts one or more arguments of func that when called either invokes func returning
+         * its result, if all func arguments have been provided, or returns a function that accepts one or more of the
+         * remaining func arguments, and so on. The arity of func may be specified if func.length is not sufficient.
+         * @param func The function to curry.
+         * @param arity The arity of func.
+         * @return Returns the new curried function.
+         */
+        <T1, T2, T3, T4, R>(func: (t1: T1, t2: T2, t3: T3, t4: T4) => R, arity?: number):
+            CurriedFunction4<T1, T2, T3, T4, R>;
+        /**
+         * Creates a function that accepts one or more arguments of func that when called either invokes func returning
+         * its result, if all func arguments have been provided, or returns a function that accepts one or more of the
+         * remaining func arguments, and so on. The arity of func may be specified if func.length is not sufficient.
+         * @param func The function to curry.
+         * @param arity The arity of func.
+         * @return Returns the new curried function.
+         */
+        <T1, T2, T3, T4, T5, R>(func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5) => R, arity?: number):
+            CurriedFunction5<T1, T2, T3, T4, T5, R>;
+        /**
+         * Creates a function that accepts one or more arguments of func that when called either invokes func returning
+         * its result, if all func arguments have been provided, or returns a function that accepts one or more of the
+         * remaining func arguments, and so on. The arity of func may be specified if func.length is not sufficient.
+         * @param func The function to curry.
+         * @param arity The arity of func.
+         * @return Returns the new curried function.
+         */
+        (func: (...args: any[]) => any, arity?: number): (...args: any[]) => any;
+
+        placeholder: __;
+    }
+
+    interface LoDashStatic {
+        curry: Curry;
+    }
+
+    interface CurriedFunction1<T1, R> {
+        (): CurriedFunction1<T1, R>;
+        (t1: T1): R;
+    }
+
+    interface CurriedFunction2<T1, T2, R> {
+        (): CurriedFunction2<T1, T2, R>;
+        (t1: T1): CurriedFunction1<T2, R>;
+        (t1: __, t2: T2): CurriedFunction1<T1, R>;
+        (t1: T1, t2: T2): R;
+    }
+
+    interface CurriedFunction3<T1, T2, T3, R> {
+        (): CurriedFunction3<T1, T2, T3, R>;
+        (t1: T1): CurriedFunction2<T2, T3, R>;
+        (t1: __, t2: T2): CurriedFunction2<T1, T3, R>;
+        (t1: T1, t2: T2): CurriedFunction1<T3, R>;
+        (t1: __, t2: __, t3: T3): CurriedFunction2<T1, T2, R>;
+        (t1: T1, t2: __, t3: T3): CurriedFunction1<T2, R>;
+        (t1: __, t2: T2, t3: T3): CurriedFunction1<T1, R>;
+        (t1: T1, t2: T2, t3: T3): R;
+    }
+
+    interface CurriedFunction4<T1, T2, T3, T4, R> {
+        (): CurriedFunction4<T1, T2, T3, T4, R>;
+        (t1: T1): CurriedFunction3<T2, T3, T4, R>;
+        (t1: __, t2: T2): CurriedFunction3<T1, T3, T4, R>;
+        (t1: T1, t2: T2): CurriedFunction2<T3, T4, R>;
+        (t1: __, t2: __, t3: T3): CurriedFunction3<T1, T2, T4, R>;
+        (t1: __, t2: __, t3: T3): CurriedFunction2<T2, T4, R>;
+        (t1: __, t2: T2, t3: T3): CurriedFunction2<T1, T4, R>;
+        (t1: T1, t2: T2, t3: T3): CurriedFunction1<T4, R>;
+        (t1: __, t2: __, t3: __, t4: T4): CurriedFunction3<T1, T2, T3, R>;
+        (t1: T1, t2: __, t3: __, t4: T4): CurriedFunction2<T2, T3, R>;
+        (t1: __, t2: T2, t3: __, t4: T4): CurriedFunction2<T1, T3, R>;
+        (t1: __, t2: __, t3: T3, t4: T4): CurriedFunction2<T1, T2, R>;
+        (t1: T1, t2: T2, t3: __, t4: T4): CurriedFunction1<T3, R>;
+        (t1: T1, t2: __, t3: T3, t4: T4): CurriedFunction1<T2, R>;
+        (t1: __, t2: T2, t3: T3, t4: T4): CurriedFunction1<T1, R>;
+        (t1: T1, t2: T2, t3: T3, t4: T4): R;
+    }
+
+    interface CurriedFunction5<T1, T2, T3, T4, T5, R> {
+        (): CurriedFunction5<T1, T2, T3, T4, T5, R>;
+        (t1: T1): CurriedFunction4<T2, T3, T4, T5, R>;
+        (t1: __, t2: T2): CurriedFunction4<T1, T3, T4, T5, R>;
+        (t1: T1, t2: T2): CurriedFunction3<T3, T4, T5, R>;
+        (t1: __, t2: __, t3: T3): CurriedFunction4<T1, T2, T4, T5, R>;
+        (t1: T1, t2: __, t3: T3): CurriedFunction3<T2, T4, T5, R>;
+        (t1: __, t2: T2, t3: T3): CurriedFunction3<T1, T4, T5, R>;
+        (t1: T1, t2: T2, t3: T3): CurriedFunction2<T4, T5, R>;
+        (t1: __, t2: __, t3: __, t4: T4): CurriedFunction4<T1, T2, T3, T5, R>;
+        (t1: T1, t2: __, t3: __, t4: T4): CurriedFunction3<T2, T3, T5, R>;
+        (t1: __, t2: T2, t3: __, t4: T4): CurriedFunction3<T1, T3, T5, R>;
+        (t1: __, t2: __, t3: T3, t4: T4): CurriedFunction3<T1, T2, T5, R>;
+        (t1: T1, t2: T2, t3: __, t4: T4): CurriedFunction2<T3, T5, R>;
+        (t1: T1, t2: __, t3: T3, t4: T4): CurriedFunction2<T2, T5, R>;
+        (t1: __, t2: T2, t3: T3, t4: T4): CurriedFunction2<T1, T5, R>;
+        (t1: T1, t2: T2, t3: T3, t4: T4): CurriedFunction1<T5, R>;
+        (t1: __, t2: __, t3: __, t4: __, t5: T5): CurriedFunction4<T1, T2, T3, T4, R>;
+        (t1: T1, t2: __, t3: __, t4: __, t5: T5): CurriedFunction3<T2, T3, T4, R>;
+        (t1: __, t2: T2, t3: __, t4: __, t5: T5): CurriedFunction3<T1, T3, T4, R>;
+        (t1: __, t2: __, t3: T3, t4: __, t5: T5): CurriedFunction3<T1, T2, T4, R>;
+        (t1: __, t2: __, t3: __, t4: T4, t5: T5): CurriedFunction3<T1, T2, T3, R>;
+        (t1: T1, t2: T2, t3: __, t4: __, t5: T5): CurriedFunction2<T3, T4, R>;
+        (t1: T1, t2: __, t3: T3, t4: __, t5: T5): CurriedFunction2<T2, T4, R>;
+        (t1: T1, t2: __, t3: __, t4: T4, t5: T5): CurriedFunction2<T2, T3, R>;
+        (t1: __, t2: T2, t3: T3, t4: __, t5: T5): CurriedFunction2<T1, T4, R>;
+        (t1: __, t2: T2, t3: __, t4: T4, t5: T5): CurriedFunction2<T1, T3, R>;
+        (t1: __, t2: __, t3: T3, t4: T4, t5: T5): CurriedFunction2<T1, T2, R>;
+        (t1: T1, t2: T2, t3: T3, t4: __, t5: T5): CurriedFunction1<T4, R>;
+        (t1: T1, t2: T2, t3: __, t4: T4, t5: T5): CurriedFunction1<T3, R>;
+        (t1: T1, t2: __, t3: T3, t4: T4, t5: T5): CurriedFunction1<T2, R>;
+        (t1: __, t2: T2, t3: T3, t4: T4, t5: T5): CurriedFunction1<T1, R>;
+        (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5): R;
+    }
+
+    interface RightCurriedFunction1<T1, R> {
+        (): RightCurriedFunction1<T1, R>;
+        (t1: T1): R;
+    }
+
+    interface RightCurriedFunction2<T1, T2, R> {
+        (): RightCurriedFunction2<T1, T2, R>;
+        (t2: T2): RightCurriedFunction1<T1, R>;
+        (t1: T1, t2: __): RightCurriedFunction1<T2, R>;
+        (t1: T1, t2: T2): R;
+    }
+
+    interface RightCurriedFunction3<T1, T2, T3, R> {
+        (): RightCurriedFunction3<T1, T2, T3, R>;
+        (t3: T3): RightCurriedFunction2<T1, T2, R>;
+        (t2: T2, t3: __): RightCurriedFunction2<T1, T3, R>;
+        (t2: T2, t3: T3): RightCurriedFunction1<T1, R>;
+        (t1: T1, t2: __, t3: __): RightCurriedFunction2<T2, T3, R>;
+        (t1: T1, t2: T2, t3: __): RightCurriedFunction1<T3, R>;
+        (t1: T1, t2: __, t3: T3): RightCurriedFunction1<T2, R>;
+        (t1: T1, t2: T2, t3: T3): R;
+    }
+
+    interface RightCurriedFunction4<T1, T2, T3, T4, R> {
+        (): RightCurriedFunction4<T1, T2, T3, T4, R>;
+        (t4: T4): RightCurriedFunction3<T1, T2, T3, R>;
+        (t3: T3, t4: __): RightCurriedFunction3<T1, T2, T4, R>;
+        (t3: T3, t4: T4): RightCurriedFunction2<T1, T2, R>;
+        (t2: T2, t3: __, t4: __): RightCurriedFunction3<T1, T3, T4, R>;
+        (t2: T2, t3: T3, t4: __): RightCurriedFunction2<T1, T4, R>;
+        (t2: T2, t3: __, t4: T4): RightCurriedFunction2<T1, T3, R>;
+        (t2: T2, t3: T3, t4: T4): RightCurriedFunction1<T1, R>;
+        (t1: T1, t2: __, t3: __, t4: __): RightCurriedFunction3<T2, T3, T4, R>;
+        (t1: T1, t2: T2, t3: __, t4: __): RightCurriedFunction2<T3, T4, R>;
+        (t1: T1, t2: __, t3: T3, t4: __): RightCurriedFunction2<T2, T4, R>;
+        (t1: T1, t2: __, t3: __, t4: T4): RightCurriedFunction2<T2, T3, R>;
+        (t1: T1, t2: T2, t3: T3, t4: __): RightCurriedFunction1<T4, R>;
+        (t1: T1, t2: T2, t3: __, t4: T4): RightCurriedFunction1<T3, R>;
+        (t1: T1, t2: __, t3: T3, t4: T4): RightCurriedFunction1<T2, R>;
+        (t1: T1, t2: T2, t3: T3, t4: T4): R;
+    }
+
+    interface RightCurriedFunction5<T1, T2, T3, T4, T5, R> {
+        (): RightCurriedFunction5<T1, T2, T3, T4, T5, R>;
+        (t5: T5): RightCurriedFunction4<T1, T2, T3, T4, R>;
+        (t4: T4, t5: __): RightCurriedFunction4<T1, T2, T3, T5, R>;
+        (t4: T4, t5: T5): RightCurriedFunction3<T1, T2, T3, R>;
+        (t3: T3, t4: __, t5: __): RightCurriedFunction4<T1, T2, T4, T5, R>;
+        (t3: T3, t4: T4, t5: __): RightCurriedFunction3<T1, T2, T5, R>;
+        (t3: T3, t4: __, t5: T5): RightCurriedFunction3<T1, T2, T4, R>;
+        (t3: T3, t4: T4, t5: T5): RightCurriedFunction2<T1, T2, R>;
+        (t2: T2, t3: __, t4: __, t5: __): RightCurriedFunction4<T1, T3, T4, T5, R>;
+        (t2: T2, t3: T3, t4: __, t5: __): RightCurriedFunction3<T1, T4, T5, R>;
+        (t2: T2, t3: __, t4: T4, t5: __): RightCurriedFunction3<T1, T3, T5, R>;
+        (t2: T2, t3: __, t4: __, t5: T5): RightCurriedFunction3<T1, T3, T4, R>;
+        (t2: T2, t3: T3, t4: T4, t5: __): RightCurriedFunction2<T1, T5, R>;
+        (t2: T2, t3: T3, t4: __, t5: T5): RightCurriedFunction2<T1, T4, R>;
+        (t2: T2, t3: __, t4: T4, t5: T5): RightCurriedFunction2<T1, T3, R>;
+        (t2: T2, t3: T3, t4: T4, t5: T5): RightCurriedFunction1<T1, R>;
+        (t1: T1, t2: __, t3: __, t4: __, t5: __): RightCurriedFunction4<T2, T3, T4, T5, R>;
+        (t1: T1, t2: T2, t3: __, t4: __, t5: __): RightCurriedFunction3<T3, T4, T5, R>;
+        (t1: T1, t2: __, t3: T3, t4: __, t5: __): RightCurriedFunction3<T2, T4, T5, R>;
+        (t1: T1, t2: __, t3: __, t4: T4, t5: __): RightCurriedFunction3<T2, T3, T5, R>;
+        (t1: T1, t2: __, t3: __, t4: __, t5: T5): RightCurriedFunction3<T2, T3, T4, R>;
+        (t1: T1, t2: T2, t3: T3, t4: __, t5: __): RightCurriedFunction2<T4, T5, R>;
+        (t1: T1, t2: T2, t3: __, t4: T4, t5: __): RightCurriedFunction2<T3, T5, R>;
+        (t1: T1, t2: T2, t3: __, t4: __, t5: T5): RightCurriedFunction2<T3, T4, R>;
+        (t1: T1, t2: __, t3: T3, t4: T4, t5: __): RightCurriedFunction2<T2, T5, R>;
+        (t1: T1, t2: __, t3: T3, t4: __, t5: T5): RightCurriedFunction2<T2, T4, R>;
+        (t1: T1, t2: __, t3: __, t4: T4, t5: T5): RightCurriedFunction2<T2, T3, R>;
+        (t1: T1, t2: T2, t3: T3, t4: T4, t5: __): RightCurriedFunction1<T5, R>;
+        (t1: T1, t2: T2, t3: T3, t4: __, t5: T5): RightCurriedFunction1<T4, R>;
+        (t1: T1, t2: T2, t3: __, t4: T4, t5: T5): RightCurriedFunction1<T3, R>;
+        (t1: T1, t2: __, t3: T3, t4: T4, t5: T5): RightCurriedFunction1<T2, R>;
+        (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5): R;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+        * @see _.curry
+        **/
+        curry<T1, R>(this: LoDashImplicitWrapper<(t1: T1) => R>, arity?: number):
+            LoDashImplicitWrapper<CurriedFunction1<T1, R>>;
+
+        /**
+        * @see _.curry
+        **/
+        curry<T1, T2, R>(this: LoDashImplicitWrapper<(t1: T1, t2: T2) => R>, arity?: number):
+            LoDashImplicitWrapper<CurriedFunction2<T1, T2, R>>;
+
+        /**
+        * @see _.curry
+        **/
+        curry<T1, T2, T3, R>(this: LoDashImplicitWrapper<(t1: T1, t2: T2, t3: T3) => R>, arity?: number):
+            LoDashImplicitWrapper<CurriedFunction3<T1, T2, T3, R>>;
+
+        /**
+        * @see _.curry
+        **/
+        curry<T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<(t1: T1, t2: T2, t3: T3, t4: T4) => R>, arity?: number):
+            LoDashImplicitWrapper<CurriedFunction4<T1, T2, T3, T4, R>>;
+
+        /**
+        * @see _.curry
+        **/
+        curry<T1, T2, T3, T4, T5, R>(this: LoDashImplicitWrapper<(t1: T1, t2: T2, t3: T3, t4: T4, t5: T5) => R>, arity?: number):
+            LoDashImplicitWrapper<CurriedFunction5<T1, T2, T3, T4, T5, R>>;
+
+        /**
+        * @see _.curry
+        **/
+        curry(arity?: number): LoDashImplicitWrapper<(...args: any[]) => any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+        * @see _.curry
+        **/
+        curry<T1, R>(this: LoDashExplicitWrapper<(t1: T1) => R>):
+            LoDashExplicitWrapper<CurriedFunction1<T1, R>>;
+
+        /**
+        * @see _.curry
+        **/
+        curry<T1, T2, R>(this: LoDashExplicitWrapper<(t1: T1, t2: T2) => R>):
+            LoDashExplicitWrapper<CurriedFunction2<T1, T2, R>>;
+
+        /**
+        * @see _.curry
+        **/
+        curry<T1, T2, T3, R>(this: LoDashExplicitWrapper<(t1: T1, t2: T2, t3: T3) => R>):
+            LoDashExplicitWrapper<CurriedFunction3<T1, T2, T3, R>>;
+
+        /**
+        * @see _.curry
+        **/
+        curry<T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<(t1: T1, t2: T2, t3: T3, t4: T4) => R>):
+            LoDashExplicitWrapper<CurriedFunction4<T1, T2, T3, T4, R>>;
+
+        /**
+        * @see _.curry
+        **/
+        curry<T1, T2, T3, T4, T5, R>(this: LoDashExplicitWrapper<(t1: T1, t2: T2, t3: T3, t4: T4, t5: T5) => R>):
+            LoDashExplicitWrapper<CurriedFunction5<T1, T2, T3, T4, T5, R>>;
+
+        /**
+        * @see _.curry
+        **/
+        curry(arity?: number): LoDashExplicitWrapper<(...args: any[]) => any>;
+    }
+
+    // curryRight
+
+    interface CurryRight {
+        /**
+         * This method is like _.curry except that arguments are applied to func in the manner of _.partialRight
+         * instead of _.partial.
+         * @param func The function to curry.
+         * @param arity The arity of func.
+         * @return Returns the new curried function.
+         */
+        <T1, R>(func: (t1: T1) => R, arity?: number):
+            RightCurriedFunction1<T1, R>;
+        /**
+         * This method is like _.curry except that arguments are applied to func in the manner of _.partialRight
+         * instead of _.partial.
+         * @param func The function to curry.
+         * @param arity The arity of func.
+         * @return Returns the new curried function.
+         */
+        <T1, T2, R>(func: (t1: T1, t2: T2) => R, arity?: number):
+            RightCurriedFunction2<T1, T2, R>;
+        /**
+         * This method is like _.curry except that arguments are applied to func in the manner of _.partialRight
+         * instead of _.partial.
+         * @param func The function to curry.
+         * @param arity The arity of func.
+         * @return Returns the new curried function.
+         */
+        <T1, T2, T3, R>(func: (t1: T1, t2: T2, t3: T3) => R, arity?: number):
+            RightCurriedFunction3<T1, T2, T3, R>;
+        /**
+         * This method is like _.curry except that arguments are applied to func in the manner of _.partialRight
+         * instead of _.partial.
+         * @param func The function to curry.
+         * @param arity The arity of func.
+         * @return Returns the new curried function.
+         */
+        <T1, T2, T3, T4, R>(func: (t1: T1, t2: T2, t3: T3, t4: T4) => R, arity?: number):
+            RightCurriedFunction4<T1, T2, T3, T4, R>;
+        /**
+         * This method is like _.curry except that arguments are applied to func in the manner of _.partialRight
+         * instead of _.partial.
+         * @param func The function to curry.
+         * @param arity The arity of func.
+         * @return Returns the new curried function.
+         */
+        <T1, T2, T3, T4, T5, R>(func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5) => R, arity?: number):
+            RightCurriedFunction5<T1, T2, T3, T4, T5, R>;
+        /**
+         * This method is like _.curry except that arguments are applied to func in the manner of _.partialRight
+         * instead of _.partial.
+         * @param func The function to curry.
+         * @param arity The arity of func.
+         * @return Returns the new curried function.
+         */
+        (func: (...args: any[]) => any, arity?: number): (...args: any[]) => any;
+
+        placeholder: __;
+    }
+
+    interface LoDashStatic {
+        curryRight: CurryRight;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.curryRight
+         **/
+        curryRight<T1, R>(this: LoDashImplicitWrapper<(t1: T1) => R>, arity?: number):
+            LoDashImplicitWrapper<RightCurriedFunction1<T1, R>>;
+
+        /**
+         * @see _.curryRight
+         **/
+        curryRight<T1, T2, R>(this: LoDashImplicitWrapper<(t1: T1, t2: T2) => R>, arity?: number):
+            LoDashImplicitWrapper<RightCurriedFunction2<T1, T2, R>>;
+
+        /**
+         * @see _.curryRight
+         **/
+        curryRight<T1, T2, T3, R>(this: LoDashImplicitWrapper<(t1: T1, t2: T2, t3: T3) => R>, arity?: number):
+            LoDashImplicitWrapper<RightCurriedFunction3<T1, T2, T3, R>>;
+
+        /**
+         * @see _.curryRight
+         **/
+        curryRight<T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<(t1: T1, t2: T2, t3: T3, t4: T4) => R>, arity?: number):
+            LoDashImplicitWrapper<RightCurriedFunction4<T1, T2, T3, T4, R>>;
+
+        /**
+         * @see _.curryRight
+         **/
+        curryRight<T1, T2, T3, T4, T5, R>(this: LoDashImplicitWrapper<(t1: T1, t2: T2, t3: T3, t4: T4, t5: T5) => R>, arity?: number):
+            LoDashImplicitWrapper<RightCurriedFunction5<T1, T2, T3, T4, T5, R>>;
+
+        /**
+         * @see _.curryRight
+         **/
+        curryRight(arity?: number): LoDashImplicitWrapper<(...args: any[]) => any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.curryRight
+         **/
+        curryRight<T1, R>(this: LoDashExplicitWrapper<(t1: T1) => R>, arity?: number):
+            LoDashExplicitWrapper<RightCurriedFunction1<T1, R>>;
+
+        /**
+         * @see _.curryRight
+         **/
+        curryRight<T1, T2, R>(this: LoDashExplicitWrapper<(t1: T1, t2: T2) => R>, arity?: number):
+            LoDashExplicitWrapper<RightCurriedFunction2<T1, T2, R>>;
+
+        /**
+         * @see _.curryRight
+         **/
+        curryRight<T1, T2, T3, R>(this: LoDashExplicitWrapper<(t1: T1, t2: T2, t3: T3) => R>, arity?: number):
+            LoDashExplicitWrapper<RightCurriedFunction3<T1, T2, T3, R>>;
+
+        /**
+         * @see _.curryRight
+         **/
+        curryRight<T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<(t1: T1, t2: T2, t3: T3, t4: T4) => R>, arity?: number):
+            LoDashExplicitWrapper<RightCurriedFunction4<T1, T2, T3, T4, R>>;
+
+        /**
+         * @see _.curryRight
+         **/
+        curryRight<T1, T2, T3, T4, T5, R>(this: LoDashExplicitWrapper<(t1: T1, t2: T2, t3: T3, t4: T4, t5: T5) => R>, arity?: number):
+            LoDashExplicitWrapper<RightCurriedFunction5<T1, T2, T3, T4, T5, R>>;
+
+        /**
+         * @see _.curryRight
+         **/
+        curryRight(arity?: number): LoDashExplicitWrapper<(...args: any[]) => any>;
+    }
+
+    // debounce
+
+    interface DebounceSettings {
+        /**
+         * Specify invoking on the leading edge of the timeout.
+         */
+        leading?: boolean;
+
+        /**
+         * The maximum time func is allowed to be delayed before it’s invoked.
+         */
+        maxWait?: number;
+
+        /**
+         * Specify invoking on the trailing edge of the timeout.
+         */
+        trailing?: boolean;
+    }
+
+    interface LoDashStatic {
+        /**
+         * Creates a debounced function that delays invoking func until after wait milliseconds have elapsed since
+         * the last time the debounced function was invoked. The debounced function comes with a cancel method to
+         * cancel delayed invocations and a flush method to immediately invoke them. Provide an options object to
+         * indicate that func should be invoked on the leading and/or trailing edge of the wait timeout. Subsequent
+         * calls to the debounced function return the result of the last func invocation.
+         *
+         * Note: If leading and trailing options are true, func is invoked on the trailing edge of the timeout only
+         * if the the debounced function is invoked more than once during the wait timeout.
+         *
+         * See David Corbacho’s article for details over the differences between _.debounce and _.throttle.
+         *
+         * @param func The function to debounce.
+         * @param wait The number of milliseconds to delay.
+         * @param options The options object.
+         * @param options.leading Specify invoking on the leading edge of the timeout.
+         * @param options.maxWait The maximum time func is allowed to be delayed before it’s invoked.
+         * @param options.trailing Specify invoking on the trailing edge of the timeout.
+         * @return Returns the new debounced function.
+         */
+        debounce<T extends (...args: any[]) => any>(
+            func: T,
+            wait?: number,
+            options?: DebounceSettings
+        ): T & Cancelable;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.debounce
+         */
+        debounce(
+            wait?: number,
+            options?: DebounceSettings
+        ): LoDashImplicitWrapper<TValue & Cancelable>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.debounce
+         */
+        debounce(
+            wait?: number,
+            options?: DebounceSettings
+        ): LoDashExplicitWrapper<TValue & Cancelable>;
+    }
+
+    // defer
+
+    interface LoDashStatic {
+        /**
+         * Defers invoking the func until the current call stack has cleared. Any additional arguments are provided to
+         * func when it’s invoked.
+         *
+         * @param func The function to defer.
+         * @param args The arguments to invoke the function with.
+         * @return Returns the timer id.
+         */
+        defer(
+            func: (...args: any[]) => any,
+            ...args: any[]
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.defer
+         */
+        defer(...args: any[]): LoDashImplicitWrapper<number>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.defer
+         */
+        defer(...args: any[]): LoDashExplicitWrapper<number>;
+    }
+
+    // delay
+
+    interface LoDashStatic {
+        /**
+         * Invokes func after wait milliseconds. Any additional arguments are provided to func when it’s invoked.
+         *
+         * @param func The function to delay.
+         * @param wait The number of milliseconds to delay invocation.
+         * @param args The arguments to invoke the function with.
+         * @return Returns the timer id.
+         */
+        delay(
+            func: (...args: any[]) => any,
+            wait: number,
+            ...args: any[]
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.delay
+         */
+        delay(
+            wait: number,
+            ...args: any[]
+        ): LoDashImplicitWrapper<number>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.delay
+         */
+        delay(
+            wait: number,
+            ...args: any[]
+        ): LoDashExplicitWrapper<number>;
+    }
+
+    // flip
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that invokes `func` with arguments reversed.
+         *
+         * @category Function
+         * @param func The function to flip arguments for.
+         * @returns Returns the new function.
+         * @example
+         *
+         * var flipped = _.flip(function() {
+         *   return _.toArray(arguments);
+         * });
+         *
+         * flipped('a', 'b', 'c', 'd');
+         * // => ['d', 'c', 'b', 'a']
+         */
+        flip<T extends (...args: any[]) => any>(func: T): T;
+    }
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * @see _.flip
+         */
+        flip(): this;
+    }
+
+    // memoize
+
+    interface MemoizedFunction {
+        cache: MapCache;
+    }
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that memoizes the result of func. If resolver is provided it determines the cache key for
+         * storing the result based on the arguments provided to the memoized function. By default, the first argument
+         * provided to the memoized function is coerced to a string and used as the cache key. The func is invoked with
+         * the this binding of the memoized function.
+         *
+         * @param func The function to have its output memoized.
+         * @param resolver The function to resolve the cache key.
+         * @return Returns the new memoizing function.
+         */
+        memoize: {
+            <T extends (...args: any[]) => any>(func: T, resolver?: (...args: any[]) => any): T & MemoizedFunction;
+            Cache: MapCacheConstructor;
+        };
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.memoize
+         */
+        memoize(resolver?: (...args: any[]) => any): LoDashImplicitWrapper<TValue & MemoizedFunction>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.memoize
+         */
+        memoize(resolver?: (...args: any[]) => any): LoDashExplicitWrapper<TValue & MemoizedFunction>;
+    }
+
+    // negate
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that negates the result of the predicate func. The func predicate is invoked with
+         * the this binding and arguments of the created function.
+         *
+         * @param predicate The predicate to negate.
+         * @return Returns the new function.
+         */
+        negate<T extends (...args: any[]) => any>(predicate: T): T;
+    }
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * @see _.negate
+         */
+        negate(): this;
+    }
+
+    // once
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that is restricted to invoking func once. Repeat calls to the function return the value
+         * of the first call. The func is invoked with the this binding and arguments of the created function.
+         *
+         * @param func The function to restrict.
+         * @return Returns the new restricted function.
+         */
+        once<T extends (...args: any[]) => any>(func: T): T;
+    }
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * @see _.once
+         */
+        once(): this;
+    }
+
+    // overArgs
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that runs each argument through a corresponding transform function.
+         *
+         * @param func The function to wrap.
+         * @param transforms The functions to transform arguments, specified as individual functions or arrays
+         * of functions.
+         * @return Returns the new function.
+         */
+        overArgs(
+            func: (...args: any[]) => any,
+            ...transforms: Array<Many<(...args: any[]) => any>>
+        ): (...args: any[]) => any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.overArgs
+         */
+        overArgs(...transforms: Array<Many<(...args: any[]) => any>>): LoDashImplicitWrapper<(...args: any[]) => any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.overArgs
+         */
+        overArgs(...transforms: Array<Many<(...args: any[]) => any>>): LoDashExplicitWrapper<(...args: any[]) => any>;
+    }
+
+    // partial
+
+    interface LoDashStatic {
+        /**
+        * Creates a function that, when called, invokes func with any additional partial arguments
+        * prepended to those provided to the new function. This method is similar to _.bind except
+        * it does not alter the this binding.
+        * @param func The function to partially apply arguments to.
+        * @param args Arguments to be partially applied.
+        * @return The new partially applied function.
+        **/
+        partial: Partial;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.partial
+         */
+        partial: ImplicitPartial;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.partial
+         */
+        partial: ExplicitPartial;
+    }
+
+    /** The placeholder, to be used in curried functions */
+    type __ = LoDashStatic;
+
+    type Function0<R> = () => R;
+    type Function1<T1, R> = (t1: T1) => R;
+    type Function2<T1, T2, R> = (t1: T1, t2: T2) => R;
+    type Function3<T1, T2, T3, R> = (t1: T1, t2: T2, t3: T3) => R;
+    type Function4<T1, T2, T3, T4, R> = (t1: T1, t2: T2, t3: T3, t4: T4) => R;
+
+    interface Partial {
+        // arity 0
+        <R>(func: Function0<R>): Function0<R>;
+        // arity 1
+        <T1, R>(func: Function1<T1, R>): Function1<T1, R>;
+        <T1, R>(func: Function1<T1, R>, arg1: T1): Function0<R>;
+        // arity 2
+        <T1, T2, R>(func: Function2<T1, T2, R>):                      Function2<T1, T2, R>;
+        <T1, T2, R>(func: Function2<T1, T2, R>, arg1: T1):            Function1<    T2, R>;
+        <T1, T2, R>(func: Function2<T1, T2, R>, plc1: __, arg2: T2):  Function1<T1,     R>;
+        <T1, T2, R>(func: Function2<T1, T2, R>, arg1: T1, arg2: T2):  Function0<        R>;
+        // arity 3
+        <T1, T2, T3, R>(func: Function3<T1, T2, T3, R>):                                Function3<T1, T2, T3, R>;
+        <T1, T2, T3, R>(func: Function3<T1, T2, T3, R>, arg1: T1):                      Function2<    T2, T3, R>;
+        <T1, T2, T3, R>(func: Function3<T1, T2, T3, R>, plc1: __, arg2: T2):            Function2<T1,     T3, R>;
+        <T1, T2, T3, R>(func: Function3<T1, T2, T3, R>, arg1: T1, arg2: T2):            Function1<        T3, R>;
+        <T1, T2, T3, R>(func: Function3<T1, T2, T3, R>, plc1: __, plc2: __, arg3: T3):  Function2<T1, T2,     R>;
+        <T1, T2, T3, R>(func: Function3<T1, T2, T3, R>, arg1: T1, plc2: __, arg3: T3):  Function1<    T2,     R>;
+        <T1, T2, T3, R>(func: Function3<T1, T2, T3, R>, plc1: __, arg2: T2, arg3: T3):  Function1<T1,         R>;
+        <T1, T2, T3, R>(func: Function3<T1, T2, T3, R>, arg1: T1, arg2: T2, arg3: T3):  Function0<            R>;
+        // arity 4
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>):                                          Function4<T1, T2, T3, T4, R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, arg1: T1):                                Function3<    T2, T3, T4, R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, plc1: __, arg2: T2):                      Function3<T1,     T3, T4, R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, arg1: T1, arg2: T2):                      Function2<        T3, T4, R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, plc1: __, plc2: __, arg3: T3):            Function3<T1, T2,     T4, R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, arg1: T1, plc2: __, arg3: T3):            Function2<    T2,     T4, R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, plc1: __, arg2: T2, arg3: T3):            Function2<T1,         T4, R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, arg1: T1, arg2: T2, arg3: T3):            Function1<            T4, R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, plc1: __, plc2: __, plc3: __, arg4: T4):  Function3<T1, T2, T3,     R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, arg1: T1, plc2: __, plc3: __, arg4: T4):  Function2<    T2, T3,     R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, plc1: __, arg2: T2, plc3: __, arg4: T4):  Function2<T1,     T3,     R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, arg1: T1, arg2: T2, plc3: __, arg4: T4):  Function1<        T3,     R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, plc1: __, plc2: __, arg3: T3, arg4: T4):  Function2<T1, T2,         R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, arg1: T1, plc2: __, arg3: T3, arg4: T4):  Function1<    T2,         R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, plc1: __, arg2: T2, arg3: T3, arg4: T4):  Function1<T1,             R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, arg1: T1, arg2: T2, arg3: T3, arg4: T4):  Function0<                R>;
+        // catch-all
+        (func: (...args: any[]) => any, ...args: any[]): (...args: any[]) => any;
+
+        placeholder: __;
+    }
+
+    interface ImplicitPartial {
+        // arity 0
+        <R>(this: LoDashImplicitWrapper<Function0<R>>): LoDashImplicitWrapper<Function0<R>>;
+        // arity 1
+        <T1, R>(this: LoDashImplicitWrapper<Function1<T1, R>>): LoDashImplicitWrapper<Function1<T1, R>>;
+        <T1, R>(this: LoDashImplicitWrapper<Function1<T1, R>>, arg1: T1): LoDashImplicitWrapper<Function0<R>>;
+        // arity 2
+        <T1, T2, R>(this: LoDashImplicitWrapper<Function2<T1, T2, R>>):                      LoDashImplicitWrapper<Function2<T1, T2, R>>;
+        <T1, T2, R>(this: LoDashImplicitWrapper<Function2<T1, T2, R>>, arg1: T1):            LoDashImplicitWrapper<Function1<    T2, R>>;
+        <T1, T2, R>(this: LoDashImplicitWrapper<Function2<T1, T2, R>>, plc1: __, arg2: T2):  LoDashImplicitWrapper<Function1<T1,     R>>;
+        <T1, T2, R>(this: LoDashImplicitWrapper<Function2<T1, T2, R>>, arg1: T1, arg2: T2):  LoDashImplicitWrapper<Function0<        R>>;
+        // arity 3
+        <T1, T2, T3, R>(this: LoDashImplicitWrapper<Function3<T1, T2, T3, R>>):                                LoDashImplicitWrapper<Function3<T1, T2, T3, R>>;
+        <T1, T2, T3, R>(this: LoDashImplicitWrapper<Function3<T1, T2, T3, R>>, arg1: T1):                      LoDashImplicitWrapper<Function2<    T2, T3, R>>;
+        <T1, T2, T3, R>(this: LoDashImplicitWrapper<Function3<T1, T2, T3, R>>, plc1: __, arg2: T2):            LoDashImplicitWrapper<Function2<T1,     T3, R>>;
+        <T1, T2, T3, R>(this: LoDashImplicitWrapper<Function3<T1, T2, T3, R>>, arg1: T1, arg2: T2):            LoDashImplicitWrapper<Function1<        T3, R>>;
+        <T1, T2, T3, R>(this: LoDashImplicitWrapper<Function3<T1, T2, T3, R>>, plc1: __, plc2: __, arg3: T3):  LoDashImplicitWrapper<Function2<T1, T2,     R>>;
+        <T1, T2, T3, R>(this: LoDashImplicitWrapper<Function3<T1, T2, T3, R>>, arg1: T1, plc2: __, arg3: T3):  LoDashImplicitWrapper<Function1<    T2,     R>>;
+        <T1, T2, T3, R>(this: LoDashImplicitWrapper<Function3<T1, T2, T3, R>>, plc1: __, arg2: T2, arg3: T3):  LoDashImplicitWrapper<Function1<T1,         R>>;
+        <T1, T2, T3, R>(this: LoDashImplicitWrapper<Function3<T1, T2, T3, R>>, arg1: T1, arg2: T2, arg3: T3):  LoDashImplicitWrapper<Function0<            R>>;
+        // arity 4
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>):                                          LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1):                                LoDashImplicitWrapper<Function3<    T2, T3, T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, plc1: __, arg2: T2):                      LoDashImplicitWrapper<Function3<T1,     T3, T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, arg2: T2):                      LoDashImplicitWrapper<Function2<        T3, T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, plc1: __, plc2: __, arg3: T3):            LoDashImplicitWrapper<Function3<T1, T2,     T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, plc2: __, arg3: T3):            LoDashImplicitWrapper<Function2<    T2,     T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, plc1: __, arg2: T2, arg3: T3):            LoDashImplicitWrapper<Function2<T1,         T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, arg2: T2, arg3: T3):            LoDashImplicitWrapper<Function1<            T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, plc1: __, plc2: __, plc3: __, arg4: T4):  LoDashImplicitWrapper<Function3<T1, T2, T3,     R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, plc2: __, plc3: __, arg4: T4):  LoDashImplicitWrapper<Function2<    T2, T3,     R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, plc1: __, arg2: T2, plc3: __, arg4: T4):  LoDashImplicitWrapper<Function2<T1,     T3,     R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, arg2: T2, plc3: __, arg4: T4):  LoDashImplicitWrapper<Function1<        T3,     R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, plc1: __, plc2: __, arg3: T3, arg4: T4):  LoDashImplicitWrapper<Function2<T1, T2,         R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, plc2: __, arg3: T3, arg4: T4):  LoDashImplicitWrapper<Function1<    T2,         R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, plc1: __, arg2: T2, arg3: T3, arg4: T4):  LoDashImplicitWrapper<Function1<T1,             R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, arg2: T2, arg3: T3, arg4: T4):  LoDashImplicitWrapper<Function0<                R>>;
+        // catch-all
+        (...args: any[]): LoDashImplicitWrapper<(...args: any[]) => any>;
+    }
+
+    interface ExplicitPartial {
+        // arity 0
+        <R>(this: LoDashExplicitWrapper<Function0<R>>): LoDashExplicitWrapper<Function0<R>>;
+        // arity 1
+        <T1, R>(this: LoDashExplicitWrapper<Function1<T1, R>>): LoDashExplicitWrapper<Function1<T1, R>>;
+        <T1, R>(this: LoDashExplicitWrapper<Function1<T1, R>>, arg1: T1): LoDashExplicitWrapper<Function0<R>>;
+        // arity 2
+        <T1, T2, R>(this: LoDashExplicitWrapper<Function2<T1, T2, R>>):                      LoDashExplicitWrapper<Function2<T1, T2, R>>;
+        <T1, T2, R>(this: LoDashExplicitWrapper<Function2<T1, T2, R>>, arg1: T1):            LoDashExplicitWrapper<Function1<    T2, R>>;
+        <T1, T2, R>(this: LoDashExplicitWrapper<Function2<T1, T2, R>>, plc1: __, arg2: T2):  LoDashExplicitWrapper<Function1<T1,     R>>;
+        <T1, T2, R>(this: LoDashExplicitWrapper<Function2<T1, T2, R>>, arg1: T1, arg2: T2):  LoDashExplicitWrapper<Function0<        R>>;
+        // arity 3
+        <T1, T2, T3, R>(this: LoDashExplicitWrapper<Function3<T1, T2, T3, R>>):                                LoDashExplicitWrapper<Function3<T1, T2, T3, R>>;
+        <T1, T2, T3, R>(this: LoDashExplicitWrapper<Function3<T1, T2, T3, R>>, arg1: T1):                      LoDashExplicitWrapper<Function2<    T2, T3, R>>;
+        <T1, T2, T3, R>(this: LoDashExplicitWrapper<Function3<T1, T2, T3, R>>, plc1: __, arg2: T2):            LoDashExplicitWrapper<Function2<T1,     T3, R>>;
+        <T1, T2, T3, R>(this: LoDashExplicitWrapper<Function3<T1, T2, T3, R>>, arg1: T1, arg2: T2):            LoDashExplicitWrapper<Function1<        T3, R>>;
+        <T1, T2, T3, R>(this: LoDashExplicitWrapper<Function3<T1, T2, T3, R>>, plc1: __, plc2: __, arg3: T3):  LoDashExplicitWrapper<Function2<T1, T2,     R>>;
+        <T1, T2, T3, R>(this: LoDashExplicitWrapper<Function3<T1, T2, T3, R>>, arg1: T1, plc2: __, arg3: T3):  LoDashExplicitWrapper<Function1<    T2,     R>>;
+        <T1, T2, T3, R>(this: LoDashExplicitWrapper<Function3<T1, T2, T3, R>>, plc1: __, arg2: T2, arg3: T3):  LoDashExplicitWrapper<Function1<T1,         R>>;
+        <T1, T2, T3, R>(this: LoDashExplicitWrapper<Function3<T1, T2, T3, R>>, arg1: T1, arg2: T2, arg3: T3):  LoDashExplicitWrapper<Function0<            R>>;
+        // arity 4
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>):                                          LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1):                                LoDashExplicitWrapper<Function3<    T2, T3, T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, plc1: __, arg2: T2):                      LoDashExplicitWrapper<Function3<T1,     T3, T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, arg2: T2):                      LoDashExplicitWrapper<Function2<        T3, T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, plc1: __, plc2: __, arg3: T3):            LoDashExplicitWrapper<Function3<T1, T2,     T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, plc2: __, arg3: T3):            LoDashExplicitWrapper<Function2<    T2,     T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, plc1: __, arg2: T2, arg3: T3):            LoDashExplicitWrapper<Function2<T1,         T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, arg2: T2, arg3: T3):            LoDashExplicitWrapper<Function1<            T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, plc1: __, plc2: __, plc3: __, arg4: T4):  LoDashExplicitWrapper<Function3<T1, T2, T3,     R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, plc2: __, plc3: __, arg4: T4):  LoDashExplicitWrapper<Function2<    T2, T3,     R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, plc1: __, arg2: T2, plc3: __, arg4: T4):  LoDashExplicitWrapper<Function2<T1,     T3,     R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, arg2: T2, plc3: __, arg4: T4):  LoDashExplicitWrapper<Function1<        T3,     R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, plc1: __, plc2: __, arg3: T3, arg4: T4):  LoDashExplicitWrapper<Function2<T1, T2,         R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, plc2: __, arg3: T3, arg4: T4):  LoDashExplicitWrapper<Function1<    T2,         R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, plc1: __, arg2: T2, arg3: T3, arg4: T4):  LoDashExplicitWrapper<Function1<T1,             R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, arg2: T2, arg3: T3, arg4: T4):  LoDashExplicitWrapper<Function0<                R>>;
+        // catch-all
+        (...args: any[]): LoDashExplicitWrapper<(...args: any[]) => any>;
+    }
+
+    // partialRight
+
+    interface LoDashStatic {
+        /**
+        * This method is like _.partial except that partial arguments are appended to those provided
+        * to the new function.
+        * @param func The function to partially apply arguments to.
+        * @param args Arguments to be partially applied.
+        * @return The new partially applied function.
+        **/
+        partialRight: PartialRight;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.partialRight
+         */
+        partialRight: ImplicitPartialRight;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.partialRight
+         */
+        partialRight: ExplicitPartialRight;
+    }
+
+    interface PartialRight {
+        // arity 0
+        <R>(func: Function0<R>): Function0<R>;
+        // arity 1
+        <T1, R>(func: Function1<T1, R>): Function1<T1, R>;
+        <T1, R>(func: Function1<T1, R>, arg1: T1): Function0<R>;
+        // arity 2
+        <T1, T2, R>(func: Function2<T1, T2, R>):                      Function2<T1, T2, R>;
+        <T1, T2, R>(func: Function2<T1, T2, R>, arg1: T1, plc2: __):  Function1<    T2, R>;
+        <T1, T2, R>(func: Function2<T1, T2, R>,           arg2: T2):  Function1<T1,     R>;
+        <T1, T2, R>(func: Function2<T1, T2, R>, arg1: T1, arg2: T2):  Function0<        R>;
+        // arity 3
+        <T1, T2, T3, R>(func: Function3<T1, T2, T3, R>):                                Function3<T1, T2, T3, R>;
+        <T1, T2, T3, R>(func: Function3<T1, T2, T3, R>, arg1: T1, plc2: __, plc3: __):  Function2<    T2, T3, R>;
+        <T1, T2, T3, R>(func: Function3<T1, T2, T3, R>,           arg2: T2, plc3: __):  Function2<T1,     T3, R>;
+        <T1, T2, T3, R>(func: Function3<T1, T2, T3, R>, arg1: T1, arg2: T2, plc3: __):  Function1<        T3, R>;
+        <T1, T2, T3, R>(func: Function3<T1, T2, T3, R>,                     arg3: T3):  Function2<T1, T2,     R>;
+        <T1, T2, T3, R>(func: Function3<T1, T2, T3, R>, arg1: T1, plc2: __, arg3: T3):  Function1<    T2,     R>;
+        <T1, T2, T3, R>(func: Function3<T1, T2, T3, R>,           arg2: T2, arg3: T3):  Function1<T1,         R>;
+        <T1, T2, T3, R>(func: Function3<T1, T2, T3, R>, arg1: T1, arg2: T2, arg3: T3):  Function0<            R>;
+        // arity 4
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>):                                          Function4<T1, T2, T3, T4, R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, arg1: T1, plc2: __, plc3: __, plc4: __):  Function3<    T2, T3, T4, R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>,           arg2: T2, plc3: __, plc4: __):  Function3<T1,     T3, T4, R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, arg1: T1, arg2: T2, plc3: __, plc4: __):  Function2<        T3, T4, R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>,                     arg3: T3, plc4: __):  Function3<T1, T2,     T4, R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, arg1: T1, plc2: __, arg3: T3, plc4: __):  Function2<    T2,     T4, R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>,           arg2: T2, arg3: T3, plc4: __):  Function2<T1,         T4, R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, arg1: T1, arg2: T2, arg3: T3, plc4: __):  Function1<            T4, R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>,                               arg4: T4):  Function3<T1, T2, T3,     R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, arg1: T1, plc2: __, plc3: __, arg4: T4):  Function2<    T2, T3,     R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>,           arg2: T2, plc3: __, arg4: T4):  Function2<T1,     T3,     R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, arg1: T1, arg2: T2, plc3: __, arg4: T4):  Function1<        T3,     R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>,                     arg3: T3, arg4: T4):  Function2<T1, T2,         R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, arg1: T1, plc2: __, arg3: T3, arg4: T4):  Function1<    T2,         R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>,           arg2: T2, arg3: T3, arg4: T4):  Function1<T1,             R>;
+        <T1, T2, T3, T4, R>(func: Function4<T1, T2, T3, T4, R>, arg1: T1, arg2: T2, arg3: T3, arg4: T4):  Function0<                R>;
+        // catch-all
+        (func: (...args: any[]) => any, ...args: any[]): (...args: any[]) => any;
+
+        placeholder: __;
+    }
+
+    interface ImplicitPartialRight {
+        // arity 0
+        <R>(this: LoDashImplicitWrapper<Function0<R>>): LoDashImplicitWrapper<Function0<R>>;
+        // arity 1
+        <T1, R>(this: LoDashImplicitWrapper<Function1<T1, R>>): LoDashImplicitWrapper<Function1<T1, R>>;
+        <T1, R>(this: LoDashImplicitWrapper<Function1<T1, R>>, arg1: T1): LoDashImplicitWrapper<Function0<R>>;
+        // arity 2
+        <T1, T2, R>(this: LoDashImplicitWrapper<Function2<T1, T2, R>>):                      LoDashImplicitWrapper<Function2<T1, T2, R>>;
+        <T1, T2, R>(this: LoDashImplicitWrapper<Function2<T1, T2, R>>, arg1: T1, plc2: __):  LoDashImplicitWrapper<Function1<    T2, R>>;
+        <T1, T2, R>(this: LoDashImplicitWrapper<Function2<T1, T2, R>>,           arg2: T2):  LoDashImplicitWrapper<Function1<T1,     R>>;
+        <T1, T2, R>(this: LoDashImplicitWrapper<Function2<T1, T2, R>>, arg1: T1, arg2: T2):  LoDashImplicitWrapper<Function0<        R>>;
+        // arity 3
+        <T1, T2, T3, R>(this: LoDashImplicitWrapper<Function3<T1, T2, T3, R>>):                                LoDashImplicitWrapper<Function3<T1, T2, T3, R>>;
+        <T1, T2, T3, R>(this: LoDashImplicitWrapper<Function3<T1, T2, T3, R>>, arg1: T1, plc2: __, plc3: __):  LoDashImplicitWrapper<Function2<    T2, T3, R>>;
+        <T1, T2, T3, R>(this: LoDashImplicitWrapper<Function3<T1, T2, T3, R>>,           arg2: T2, plc3: __):  LoDashImplicitWrapper<Function2<T1,     T3, R>>;
+        <T1, T2, T3, R>(this: LoDashImplicitWrapper<Function3<T1, T2, T3, R>>, arg1: T1, arg2: T2, plc3: __):  LoDashImplicitWrapper<Function1<        T3, R>>;
+        <T1, T2, T3, R>(this: LoDashImplicitWrapper<Function3<T1, T2, T3, R>>,                     arg3: T3):  LoDashImplicitWrapper<Function2<T1, T2,     R>>;
+        <T1, T2, T3, R>(this: LoDashImplicitWrapper<Function3<T1, T2, T3, R>>, arg1: T1, plc2: __, arg3: T3):  LoDashImplicitWrapper<Function1<    T2,     R>>;
+        <T1, T2, T3, R>(this: LoDashImplicitWrapper<Function3<T1, T2, T3, R>>,           arg2: T2, arg3: T3):  LoDashImplicitWrapper<Function1<T1,         R>>;
+        <T1, T2, T3, R>(this: LoDashImplicitWrapper<Function3<T1, T2, T3, R>>, arg1: T1, arg2: T2, arg3: T3):  LoDashImplicitWrapper<Function0<            R>>;
+        // arity 4
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>):                                          LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, plc2: __, plc3: __, plc4: __):  LoDashImplicitWrapper<Function3<    T2, T3, T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>,           arg2: T2, plc3: __, plc4: __):  LoDashImplicitWrapper<Function3<T1,     T3, T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, arg2: T2, plc3: __, plc4: __):  LoDashImplicitWrapper<Function2<        T3, T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>,                     arg3: T3, plc4: __):  LoDashImplicitWrapper<Function3<T1, T2,     T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, plc2: __, arg3: T3, plc4: __):  LoDashImplicitWrapper<Function2<    T2,     T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>,           arg2: T2, arg3: T3, plc4: __):  LoDashImplicitWrapper<Function2<T1,         T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, arg2: T2, arg3: T3, plc4: __):  LoDashImplicitWrapper<Function1<            T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>,                               arg4: T4):  LoDashImplicitWrapper<Function3<T1, T2, T3,     R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, plc2: __, plc3: __, arg4: T4):  LoDashImplicitWrapper<Function2<    T2, T3,     R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>,           arg2: T2, plc3: __, arg4: T4):  LoDashImplicitWrapper<Function2<T1,     T3,     R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, arg2: T2, plc3: __, arg4: T4):  LoDashImplicitWrapper<Function1<        T3,     R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>,                     arg3: T3, arg4: T4):  LoDashImplicitWrapper<Function2<T1, T2,         R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, plc2: __, arg3: T3, arg4: T4):  LoDashImplicitWrapper<Function1<    T2,         R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>,           arg2: T2, arg3: T3, arg4: T4):  LoDashImplicitWrapper<Function1<T1,             R>>;
+        <T1, T2, T3, T4, R>(this: LoDashImplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, arg2: T2, arg3: T3, arg4: T4):  LoDashImplicitWrapper<Function0<                R>>;
+        // catch-all
+        (...args: any[]): LoDashImplicitWrapper<(...args: any[]) => any>;
+    }
+
+    interface ExplicitPartialRight {
+        // arity 0
+        <R>(this: LoDashExplicitWrapper<Function0<R>>): LoDashExplicitWrapper<Function0<R>>;
+        // arity 1
+        <T1, R>(this: LoDashExplicitWrapper<Function1<T1, R>>): LoDashExplicitWrapper<Function1<T1, R>>;
+        <T1, R>(this: LoDashExplicitWrapper<Function1<T1, R>>, arg1: T1): LoDashExplicitWrapper<Function0<R>>;
+        // arity 2
+        <T1, T2, R>(this: LoDashExplicitWrapper<Function2<T1, T2, R>>):                      LoDashExplicitWrapper<Function2<T1, T2, R>>;
+        <T1, T2, R>(this: LoDashExplicitWrapper<Function2<T1, T2, R>>, arg1: T1, plc2: __):  LoDashExplicitWrapper<Function1<    T2, R>>;
+        <T1, T2, R>(this: LoDashExplicitWrapper<Function2<T1, T2, R>>,           arg2: T2):  LoDashExplicitWrapper<Function1<T1,     R>>;
+        <T1, T2, R>(this: LoDashExplicitWrapper<Function2<T1, T2, R>>, arg1: T1, arg2: T2):  LoDashExplicitWrapper<Function0<        R>>;
+        // arity 3
+        <T1, T2, T3, R>(this: LoDashExplicitWrapper<Function3<T1, T2, T3, R>>):                                LoDashExplicitWrapper<Function3<T1, T2, T3, R>>;
+        <T1, T2, T3, R>(this: LoDashExplicitWrapper<Function3<T1, T2, T3, R>>, arg1: T1, plc2: __, plc3: __):  LoDashExplicitWrapper<Function2<    T2, T3, R>>;
+        <T1, T2, T3, R>(this: LoDashExplicitWrapper<Function3<T1, T2, T3, R>>,           arg2: T2, plc3: __):  LoDashExplicitWrapper<Function2<T1,     T3, R>>;
+        <T1, T2, T3, R>(this: LoDashExplicitWrapper<Function3<T1, T2, T3, R>>, arg1: T1, arg2: T2, plc3: __):  LoDashExplicitWrapper<Function1<        T3, R>>;
+        <T1, T2, T3, R>(this: LoDashExplicitWrapper<Function3<T1, T2, T3, R>>,                     arg3: T3):  LoDashExplicitWrapper<Function2<T1, T2,     R>>;
+        <T1, T2, T3, R>(this: LoDashExplicitWrapper<Function3<T1, T2, T3, R>>, arg1: T1, plc2: __, arg3: T3):  LoDashExplicitWrapper<Function1<    T2,     R>>;
+        <T1, T2, T3, R>(this: LoDashExplicitWrapper<Function3<T1, T2, T3, R>>,           arg2: T2, arg3: T3):  LoDashExplicitWrapper<Function1<T1,         R>>;
+        <T1, T2, T3, R>(this: LoDashExplicitWrapper<Function3<T1, T2, T3, R>>, arg1: T1, arg2: T2, arg3: T3):  LoDashExplicitWrapper<Function0<            R>>;
+        // arity 4
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>):                                          LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, plc2: __, plc3: __, plc4: __):  LoDashExplicitWrapper<Function3<    T2, T3, T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>,           arg2: T2, plc3: __, plc4: __):  LoDashExplicitWrapper<Function3<T1,     T3, T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, arg2: T2, plc3: __, plc4: __):  LoDashExplicitWrapper<Function2<        T3, T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>,                     arg3: T3, plc4: __):  LoDashExplicitWrapper<Function3<T1, T2,     T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, plc2: __, arg3: T3, plc4: __):  LoDashExplicitWrapper<Function2<    T2,     T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>,           arg2: T2, arg3: T3, plc4: __):  LoDashExplicitWrapper<Function2<T1,         T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, arg2: T2, arg3: T3, plc4: __):  LoDashExplicitWrapper<Function1<            T4, R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>,                               arg4: T4):  LoDashExplicitWrapper<Function3<T1, T2, T3,     R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, plc2: __, plc3: __, arg4: T4):  LoDashExplicitWrapper<Function2<    T2, T3,     R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>,           arg2: T2, plc3: __, arg4: T4):  LoDashExplicitWrapper<Function2<T1,     T3,     R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, arg2: T2, plc3: __, arg4: T4):  LoDashExplicitWrapper<Function1<        T3,     R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>,                     arg3: T3, arg4: T4):  LoDashExplicitWrapper<Function2<T1, T2,         R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, plc2: __, arg3: T3, arg4: T4):  LoDashExplicitWrapper<Function1<    T2,         R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>,           arg2: T2, arg3: T3, arg4: T4):  LoDashExplicitWrapper<Function1<T1,             R>>;
+        <T1, T2, T3, T4, R>(this: LoDashExplicitWrapper<Function4<T1, T2, T3, T4, R>>, arg1: T1, arg2: T2, arg3: T3, arg4: T4):  LoDashExplicitWrapper<Function0<                R>>;
+        // catch-all
+        (...args: any[]): LoDashExplicitWrapper<(...args: any[]) => any>;
+    }
+
+    // rearg
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that invokes func with arguments arranged according to the specified indexes where the
+         * argument value at the first index is provided as the first argument, the argument value at the second index
+         * is provided as the second argument, and so on.
+         * @param func The function to rearrange arguments for.
+         * @param indexes The arranged argument indexes, specified as individual indexes or arrays of indexes.
+         * @return Returns the new function.
+         */
+        rearg(func: (...args: any[]) => any, ...indexes: Array<Many<number>>): (...args: any[]) => any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.rearg
+         */
+        rearg(...indexes: Array<Many<number>>): LoDashImplicitWrapper<(...args: any[]) => any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.rearg
+         */
+        rearg(...indexes: Array<Many<number>>): LoDashExplicitWrapper<(...args: any[]) => any>;
+    }
+
+    // rest
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that invokes func with the this binding of the created function and arguments from start
+         * and beyond provided as an array.
+         *
+         * Note: This method is based on the rest parameter.
+         *
+         * @param func The function to apply a rest parameter to.
+         * @param start The start position of the rest parameter.
+         * @return Returns the new function.
+         */
+        rest(
+            func: (...args: any[]) => any,
+            start?: number
+        ): (...args: any[]) => any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.rest
+         */
+        rest(start?: number): LoDashImplicitWrapper<(...args: any[]) => any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.rest
+         */
+        rest(start?: number): LoDashExplicitWrapper<(...args: any[]) => any>;
+    }
+
+    // spread
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that invokes func with the this binding of the created function and an array of arguments
+         * much like Function#apply.
+         *
+         * Note: This method is based on the spread operator.
+         *
+         * @param func The function to spread arguments over.
+         * @return Returns the new function.
+         */
+        spread<TResult>(func: (...args: any[]) => TResult): (...args: any[]) => TResult;
+
+        /**
+         * @see _.spread
+         */
+        spread<TResult>(func: (...args: any[]) => TResult, start: number): (...args: any[]) => TResult;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.spread
+         */
+        spread<TResult>(this: LoDashImplicitWrapper<(...args: any[]) => TResult>): LoDashImplicitWrapper<(...args: any[]) => TResult>;
+
+        /**
+         * @see _.spread
+         */
+        spread<TResult>(this: LoDashImplicitWrapper<(...args: any[]) => TResult>, start: number): LoDashImplicitWrapper<(...args: any[]) => TResult>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.spread
+         */
+        spread<TResult>(this: LoDashExplicitWrapper<(...args: any[]) => TResult>): LoDashExplicitWrapper<(...args: any[]) => TResult>;
+
+        /**
+         * @see _.spread
+         */
+        spread<TResult>(this: LoDashExplicitWrapper<(...args: any[]) => TResult>, start: number): LoDashExplicitWrapper<(...args: any[]) => TResult>;
+    }
+
+    // throttle
+
+    interface ThrottleSettings {
+        /**
+         * If you'd like to disable the leading-edge call, pass this as false.
+         */
+        leading?: boolean;
+
+        /**
+         * If you'd like to disable the execution on the trailing-edge, pass false.
+         */
+        trailing?: boolean;
+    }
+
+    interface LoDashStatic {
+        /**
+         * Creates a throttled function that only invokes func at most once per every wait milliseconds. The throttled
+         * function comes with a cancel method to cancel delayed invocations and a flush method to immediately invoke
+         * them. Provide an options object to indicate that func should be invoked on the leading and/or trailing edge
+         * of the wait timeout. Subsequent calls to the throttled function return the result of the last func call.
+         *
+         * Note: If leading and trailing options are true, func is invoked on the trailing edge of the timeout only if
+         * the the throttled function is invoked more than once during the wait timeout.
+         *
+         * @param func The function to throttle.
+         * @param wait The number of milliseconds to throttle invocations to.
+         * @param options The options object.
+         * @param options.leading Specify invoking on the leading edge of the timeout.
+         * @param options.trailing Specify invoking on the trailing edge of the timeout.
+         * @return Returns the new throttled function.
+         */
+        throttle<T extends (...args: any[]) => any>(
+            func: T,
+            wait?: number,
+            options?: ThrottleSettings
+        ): T & Cancelable;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.throttle
+         */
+        throttle(
+            wait?: number,
+            options?: ThrottleSettings
+        ): LoDashImplicitWrapper<TValue & Cancelable>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.throttle
+         */
+        throttle(
+            wait?: number,
+            options?: ThrottleSettings
+        ): LoDashExplicitWrapper<TValue & Cancelable>;
+    }
+
+    // unary
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that accepts up to one argument, ignoring any
+         * additional arguments.
+         *
+         * @category Function
+         * @param func The function to cap arguments for.
+         * @returns Returns the new function.
+         * @example
+         *
+         * _.map(['6', '8', '10'], _.unary(parseInt));
+         * // => [6, 8, 10]
+         */
+        unary<T, TResult>(func: (arg1: T, ...args: any[]) => TResult): (arg1: T) => TResult;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.unary
+         */
+        unary<T, TResult>(this: LoDashImplicitWrapper<(arg1: T, ...args: any[]) => TResult>): LoDashImplicitWrapper<(arg1: T) => TResult>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.unary
+         */
+        unary<T, TResult>(this: LoDashExplicitWrapper<(arg1: T, ...args: any[]) => TResult>): LoDashExplicitWrapper<(arg1: T) => TResult>;
+    }
+
+    // wrap
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that provides value to the wrapper function as its first argument. Any additional
+         * arguments provided to the function are appended to those provided to the wrapper function. The wrapper is
+         * invoked with the this binding of the created function.
+         *
+         * @param value The value to wrap.
+         * @param wrapper The wrapper function.
+         * @return Returns the new function.
+         */
+        wrap<T, TArgs, TResult>(
+            value: T,
+            wrapper: (value: T, ...args: TArgs[]) => TResult
+        ): (...args: TArgs[]) => TResult;
+
+        /**
+         * @see _.wrap
+         */
+        wrap<T, TResult>(
+            value: T,
+            wrapper: (value: T, ...args: any[]) => TResult
+        ): (...args: any[]) => TResult;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.wrap
+         */
+        wrap<TArgs, TResult>(
+            wrapper: (value: TValue, ...args: TArgs[]) => TResult
+        ): LoDashImplicitWrapper<(...args: TArgs[]) => TResult>;
+
+        /**
+         * @see _.wrap
+         */
+        wrap<TResult>(
+            wrapper: (value: TValue, ...args: any[]) => TResult
+        ): LoDashImplicitWrapper<(...args: any[]) => TResult>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.wrap
+         */
+        /**
+         * @see _.wrap
+         */
+        wrap<TArgs, TResult>(
+            wrapper: (value: TValue, ...args: TArgs[]) => TResult
+        ): LoDashExplicitWrapper<(...args: TArgs[]) => TResult>;
+
+        /**
+         * @see _.wrap
+         */
+        wrap<TResult>(
+            wrapper: (value: TValue, ...args: any[]) => TResult
+        ): LoDashExplicitWrapper<(...args: any[]) => TResult>;
+    }
+}
diff --git a/jtg js/node_modules/@types/lodash/common/lang.d.ts b/jtg js/node_modules/@types/lodash/common/lang.d.ts
new file mode 100644
index 0000000..a185402
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/common/lang.d.ts	
@@ -0,0 +1,2065 @@
+import _ = require("../index");
+declare module "../index" {
+    // castArray
+
+    interface LoDashStatic {
+        /**
+         * Casts value as an array if it’s not one.
+         *
+         * @param value The value to inspect.
+         * @return Returns the cast array.
+         */
+        castArray<T>(value?: Many<T>): T[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.castArray
+         */
+        castArray<T>(this: LoDashImplicitWrapper<Many<T>>): LoDashImplicitWrapper<T[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.castArray
+         */
+        castArray<T>(this: LoDashExplicitWrapper<Many<T>>): LoDashExplicitWrapper<T[]>;
+    }
+
+    // clone
+
+    interface LoDashStatic {
+        /**
+         * Creates a shallow clone of value.
+         *
+         * Note: This method is loosely based on the structured clone algorithm and supports cloning arrays,
+         * array buffers, booleans, date objects, maps, numbers, Object objects, regexes, sets, strings, symbols,
+         * and typed arrays. The own enumerable properties of arguments objects are cloned as plain objects. An empty
+         * object is returned for uncloneable values such as error objects, functions, DOM nodes, and WeakMaps.
+         *
+         * @param value The value to clone.
+         * @return Returns the cloned value.
+         */
+        clone<T>(value: T): T;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.clone
+         */
+        clone(): TValue;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.clone
+         */
+        clone(): this;
+    }
+
+    // cloneDeep
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.clone except that it recursively clones value.
+         *
+         * @param value The value to recursively clone.
+         * @return Returns the deep cloned value.
+         */
+        cloneDeep<T>(value: T): T;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.cloneDeep
+         */
+        cloneDeep(): TValue;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.cloneDeep
+         */
+        cloneDeep(): this;
+    }
+
+    // cloneDeepWith
+
+    type CloneDeepWithCustomizer<TObject> = (value: any, key: number | string | undefined, object: TObject | undefined, stack: any) => any;
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.cloneWith except that it recursively clones value.
+         *
+         * @param value The value to recursively clone.
+         * @param customizer The function to customize cloning.
+         * @return Returns the deep cloned value.
+         */
+        cloneDeepWith<T>(
+            value: T,
+            customizer: CloneDeepWithCustomizer<T>
+        ): any;
+
+        /**
+         * @see _.cloneDeepWith
+         */
+        cloneDeepWith<T>(value: T): T;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.cloneDeepWith
+         */
+        cloneDeepWith(
+            customizer: CloneDeepWithCustomizer<TValue>
+        ): any;
+
+        /**
+         * @see _.cloneDeepWith
+         */
+        cloneDeepWith(): TValue;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.cloneDeepWith
+         */
+        cloneDeepWith(
+            customizer: CloneDeepWithCustomizer<TValue>
+        ): LoDashExplicitWrapper<any>;
+
+        /**
+         * @see _.cloneDeepWith
+         */
+        cloneDeepWith(): this;
+    }
+
+    // cloneWith
+
+    type CloneWithCustomizer<TValue, TResult> = (value: TValue, key: number | string | undefined, object: any, stack: any) => TResult;
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.clone except that it accepts customizer which is invoked to produce the cloned value.
+         * If customizer returns undefined cloning is handled by the method instead.
+         *
+         * @param value The value to clone.
+         * @param customizer The function to customize cloning.
+         * @return Returns the cloned value.
+         */
+        cloneWith<T, TResult extends object | string | number | boolean | null>(
+            value: T,
+            customizer: CloneWithCustomizer<T, TResult>
+        ): TResult;
+
+        /**
+         * @see _.cloneWith
+         */
+        cloneWith<T, TResult>(
+            value: T,
+            customizer: CloneWithCustomizer<T, TResult | undefined>
+        ): TResult | T;
+
+        /**
+         * @see _.cloneWith
+         */
+        cloneWith<T>(value: T): T;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.cloneWith
+         */
+        cloneWith<TResult extends object | string | number | boolean | null>(
+            customizer: CloneWithCustomizer<TValue, TResult>
+        ): TResult;
+
+        /**
+         * @see _.cloneWith
+         */
+        cloneWith<TResult>(
+            customizer: CloneWithCustomizer<TValue, TResult | undefined>
+        ): TResult | TValue;
+
+        /**
+         * @see _.cloneWith
+         */
+        cloneWith(): TValue;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.cloneWith
+         */
+        cloneWith<TResult extends object | string | number | boolean | null>(
+            customizer: CloneWithCustomizer<TValue, TResult>
+        ): LoDashExplicitWrapper<TResult>;
+
+        /**
+         * @see _.cloneWith
+         */
+        cloneWith<TResult>(
+            customizer: CloneWithCustomizer<TValue, TResult | undefined>
+        ): LoDashExplicitWrapper<TResult | TValue>;
+
+        /**
+         * @see _.cloneWith
+         */
+        cloneWith(): this;
+    }
+
+    // conformsTo
+
+    interface LoDashStatic {
+        /**
+         * Checks if object conforms to source by invoking the predicate properties of source with the
+         * corresponding property values of object.
+         *
+         * Note: This method is equivalent to _.conforms when source is partially applied.
+         */
+        conformsTo<T>(object: T, source: ConformsPredicateObject<T>): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.conformsTo
+         */
+        conformsTo<T>(this: LoDashImplicitWrapper<T>, source: ConformsPredicateObject<T>): boolean;
+        // Note: we can't use TValue here,  because it generates a typescript error when strictFunctionTypes is enabled.
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.conformsTo
+         */
+        conformsTo<T>(this: LoDashExplicitWrapper<T>, source: ConformsPredicateObject<T>): LoDashExplicitWrapper<boolean>;
+        // Note: we can't use TValue here,  because it generates a typescript error when strictFunctionTypes is enabled.
+    }
+
+    type CondPair<T, R> = [(val: T) => boolean, (val: T) => R];
+
+    // eq
+
+    interface LoDashStatic {
+        /**
+         * Performs a [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+         * comparison between two values to determine if they are equivalent.
+         *
+         * @category Lang
+         * @param value The value to compare.
+         * @param other The other value to compare.
+         * @returns Returns `true` if the values are equivalent, else `false`.
+         * @example
+         *
+         * var object = { 'user': 'fred' };
+         * var other = { 'user': 'fred' };
+         *
+         * _.eq(object, object);
+         * // => true
+         *
+         * _.eq(object, other);
+         * // => false
+         *
+         * _.eq('a', 'a');
+         * // => true
+         *
+         * _.eq('a', Object('a'));
+         * // => false
+         *
+         * _.eq(NaN, NaN);
+         * // => true
+         */
+        eq(
+            value: any,
+            other: any
+        ): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.eq
+         */
+        eq(
+            other: any
+        ): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.eq
+         */
+        eq(
+            other: any
+        ): LoDashExplicitWrapper<boolean>;
+    }
+
+    // gt
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is greater than other.
+         *
+         * @param value The value to compare.
+         * @param other The other value to compare.
+         * @return Returns true if value is greater than other, else false.
+         */
+        gt(
+            value: any,
+            other: any
+        ): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.gt
+         */
+        gt(other: any): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.gt
+         */
+        gt(other: any): LoDashExplicitWrapper<boolean>;
+    }
+
+    // gte
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is greater than or equal to other.
+         *
+         * @param value The value to compare.
+         * @param other The other value to compare.
+         * @return Returns true if value is greater than or equal to other, else false.
+         */
+        gte(
+            value: any,
+            other: any
+        ): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.gte
+         */
+        gte(other: any): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.gte
+         */
+        gte(other: any): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isArguments
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is classified as an arguments object.
+         *
+         * @param value The value to check.
+         * @return Returns true if value is correctly classified, else false.
+         */
+        isArguments(value?: any): value is IArguments;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isArguments
+         */
+        isArguments(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isArguments
+         */
+        isArguments(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isArray
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is classified as an Array object.
+         * @param value The value to check.
+         *
+         * @return Returns true if value is correctly classified, else false.
+         */
+        isArray(value?: any): value is any[];
+
+        /**
+         * DEPRECATED
+         */
+        isArray<T>(value?: any): value is any[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isArray
+         */
+        isArray(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isArray
+         */
+        isArray(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isArrayBuffer
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is classified as an ArrayBuffer object.
+         *
+         * @param value The value to check.
+         * @return Returns true if value is correctly classified, else false.
+         */
+        isArrayBuffer(value?: any): value is ArrayBuffer;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isArrayBuffer
+         */
+        isArrayBuffer(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isArrayBuffer
+         */
+        isArrayBuffer(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isArrayLike
+
+    interface LoDashStatic {
+        /**
+         * Checks if `value` is array-like. A value is considered array-like if it's
+         * not a function and has a `value.length` that's an integer greater than or
+         * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
+         *
+         * @category Lang
+         * @param value The value to check.
+         * @returns Returns `true` if `value` is array-like, else `false`.
+         * @example
+         *
+         * _.isArrayLike([1, 2, 3]);
+         * // => true
+         *
+         * _.isArrayLike(document.body.children);
+         * // => true
+         *
+         * _.isArrayLike('abc');
+         * // => true
+         *
+         * _.isArrayLike(_.noop);
+         * // => false
+         */
+        isArrayLike<T>(value: T & string & number): boolean; // should only match if T = any
+
+        /**
+         * @see _.isArrayLike
+         */
+        isArrayLike(value: ((...args: any[]) => any) | null | undefined): value is never;
+
+        /**
+         * @see _.isArrayLike
+         */
+        isArrayLike(value: any): value is { length: number };
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isArrayLike
+         */
+        isArrayLike(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isArrayLike
+         */
+        isArrayLike(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isArrayLikeObject
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.isArrayLike` except that it also checks if `value`
+         * is an object.
+         *
+         * @category Lang
+         * @param value The value to check.
+         * @returns Returns `true` if `value` is an array-like object, else `false`.
+         * @example
+         *
+         * _.isArrayLikeObject([1, 2, 3]);
+         * // => true
+         *
+         * _.isArrayLikeObject(document.body.children);
+         * // => true
+         *
+         * _.isArrayLikeObject('abc');
+         * // => false
+         *
+         * _.isArrayLikeObject(_.noop);
+         * // => false
+         */
+        isArrayLikeObject<T>(value: T & string & number): boolean; // should only match if T = any
+
+        /**
+         * @see _.isArrayLike
+         */
+        // tslint:disable-next-line:ban-types (type guard doesn't seem to work correctly without the Function type)
+        isArrayLikeObject(value: ((...args: any[]) => any) | Function | string | boolean | number | null | undefined): value is never;
+
+        /**
+         * @see _.isArrayLike
+         */
+        // tslint:disable-next-line:ban-types (type guard doesn't seem to work correctly without the Function type)
+        isArrayLikeObject<T extends object>(value: T | ((...args: any[]) => any) | Function | string | boolean | number | null | undefined): value is T & { length: number };
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isArrayLikeObject
+         */
+        isArrayLikeObject(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isArrayLikeObject
+         */
+        isArrayLikeObject(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isBoolean
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is classified as a boolean primitive or object.
+         *
+         * @param value The value to check.
+         * @return Returns true if value is correctly classified, else false.
+         */
+        isBoolean(value?: any): value is boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isBoolean
+         */
+        isBoolean(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isBoolean
+         */
+        isBoolean(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isBuffer
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is a buffer.
+         *
+         * @param value The value to check.
+         * @return Returns true if value is a buffer, else false.
+         */
+        isBuffer(value?: any): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isBuffer
+         */
+        isBuffer(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isBuffer
+         */
+        isBuffer(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isDate
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is classified as a Date object.
+         * @param value The value to check.
+         *
+         * @return Returns true if value is correctly classified, else false.
+         */
+        isDate(value?: any): value is Date;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isDate
+         */
+        isDate(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isDate
+         */
+        isDate(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isElement
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is a DOM element.
+         *
+         * @param value The value to check.
+         * @return Returns true if value is a DOM element, else false.
+         */
+        isElement(value?: any): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isElement
+         */
+        isElement(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isElement
+         */
+        isElement(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isEmpty
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is empty. A value is considered empty unless it’s an arguments object, array, string, or
+         * jQuery-like collection with a length greater than 0 or an object with own enumerable properties.
+         *
+         * @param value The value to inspect.
+         * @return Returns true if value is empty, else false.
+         */
+        isEmpty(value?: any): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isEmpty
+         */
+        isEmpty(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isEmpty
+         */
+        isEmpty(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isEqual
+
+    interface LoDashStatic {
+        /**
+         * Performs a deep comparison between two values to determine if they are
+         * equivalent.
+         *
+         * **Note:** This method supports comparing arrays, array buffers, booleans,
+         * date objects, error objects, maps, numbers, `Object` objects, regexes,
+         * sets, strings, symbols, and typed arrays. `Object` objects are compared
+         * by their own, not inherited, enumerable properties. Functions and DOM
+         * nodes are **not** supported.
+         *
+         * @category Lang
+         * @param value The value to compare.
+         * @param other The other value to compare.
+         * @returns Returns `true` if the values are equivalent, else `false`.
+         * @example
+         *
+         * var object = { 'user': 'fred' };
+         * var other = { 'user': 'fred' };
+         *
+         * _.isEqual(object, other);
+         * // => true
+         *
+         * object === other;
+         * // => false
+         */
+        isEqual(
+            value: any,
+            other: any
+        ): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isEqual
+         */
+        isEqual(
+            other: any
+        ): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isEqual
+         */
+        isEqual(
+            other: any
+        ): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isEqualWith
+
+    type IsEqualCustomizer = (value: any, other: any, indexOrKey: PropertyName | undefined, parent: any, otherParent: any, stack: any) => boolean|undefined;
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.isEqual` except that it accepts `customizer` which is
+         * invoked to compare values. If `customizer` returns `undefined` comparisons are
+         * handled by the method instead. The `customizer` is invoked with up to seven arguments:
+         * (objValue, othValue [, index|key, object, other, stack]).
+         *
+         * @category Lang
+         * @param value The value to compare.
+         * @param other The other value to compare.
+         * @param [customizer] The function to customize comparisons.
+         * @returns Returns `true` if the values are equivalent, else `false`.
+         * @example
+         *
+         * function isGreeting(value) {
+         *   return /^h(?:i|ello)$/.test(value);
+         * }
+         *
+         * function customizer(objValue, othValue) {
+         *   if (isGreeting(objValue) && isGreeting(othValue)) {
+         *     return true;
+         *   }
+         * }
+         *
+         * var array = ['hello', 'goodbye'];
+         * var other = ['hi', 'goodbye'];
+         *
+         * _.isEqualWith(array, other, customizer);
+         * // => true
+         */
+        isEqualWith(
+            value: any,
+            other: any,
+            customizer?: IsEqualCustomizer
+        ): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isEqualWith
+         */
+        isEqualWith(
+            other: any,
+            customizer?: IsEqualCustomizer
+        ): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isEqualWith
+         */
+        isEqualWith(
+            other: any,
+            customizer?: IsEqualCustomizer
+        ): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isError
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is an Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError, or URIError
+         * object.
+         *
+         * @param value The value to check.
+         * @return Returns true if value is an error object, else false.
+         */
+        isError(value: any): value is Error;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isError
+         */
+        isError(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isError
+         */
+        isError(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isFinite
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is a finite primitive number.
+         *
+         * Note: This method is based on Number.isFinite.
+         *
+         * @param value The value to check.
+         * @return Returns true if value is a finite number, else false.
+         */
+        isFinite(value?: any): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isFinite
+         */
+        isFinite(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isFinite
+         */
+        isFinite(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isFunction
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is a callable function.
+         *
+         * @param value The value to check.
+         * @return Returns true if value is correctly classified, else false.
+         */
+        isFunction(value: any): value is (...args: any[]) => any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isFunction
+         */
+        isFunction(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isFunction
+         */
+        isFunction(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isInteger
+
+    interface LoDashStatic {
+        /**
+         * Checks if `value` is an integer.
+         *
+         * **Note:** This method is based on [`Number.isInteger`](https://mdn.io/Number/isInteger).
+         *
+         * @category Lang
+         * @param value The value to check.
+         * @returns Returns `true` if `value` is an integer, else `false`.
+         * @example
+         *
+         * _.isInteger(3);
+         * // => true
+         *
+         * _.isInteger(Number.MIN_VALUE);
+         * // => false
+         *
+         * _.isInteger(Infinity);
+         * // => false
+         *
+         * _.isInteger('3');
+         * // => false
+         */
+        isInteger(value?: any): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isInteger
+         */
+        isInteger(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isInteger
+         */
+        isInteger(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isLength
+
+    interface LoDashStatic {
+        /**
+         * Checks if `value` is a valid array-like length.
+         *
+         * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
+         *
+         * @category Lang
+         * @param value The value to check.
+         * @returns Returns `true` if `value` is a valid length, else `false`.
+         * @example
+         *
+         * _.isLength(3);
+         * // => true
+         *
+         * _.isLength(Number.MIN_VALUE);
+         * // => false
+         *
+         * _.isLength(Infinity);
+         * // => false
+         *
+         * _.isLength('3');
+         * // => false
+         */
+        isLength(value?: any): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isLength
+         */
+        isLength(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isLength
+         */
+        isLength(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isMap
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is classified as a Map object.
+         *
+         * @param value The value to check.
+         * @returns Returns true if value is correctly classified, else false.
+         */
+        isMap(value?: any): value is Map<any, any>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isMap
+         */
+        isMap(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isMap
+         */
+        isMap(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isMatch
+
+    type isMatchCustomizer = (value: any, other: any, indexOrKey?: PropertyName) => boolean;
+
+    interface LoDashStatic {
+        /**
+         * Performs a deep comparison between `object` and `source` to determine if
+         * `object` contains equivalent property values.
+         *
+         * **Note:** This method supports comparing the same values as `_.isEqual`.
+         *
+         * @category Lang
+         * @param object The object to inspect.
+         * @param source The object of property values to match.
+         * @returns Returns `true` if `object` is a match, else `false`.
+         * @example
+         *
+         * var object = { 'user': 'fred', 'age': 40 };
+         *
+         * _.isMatch(object, { 'age': 40 });
+         * // => true
+         *
+         * _.isMatch(object, { 'age': 36 });
+         * // => false
+         */
+        isMatch(object: object, source: object): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isMatch
+         */
+        isMatch(source: object): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isMatch
+         */
+        isMatch(source: object): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isMatchWith
+
+    type isMatchWithCustomizer = (value: any, other: any, indexOrKey: PropertyName) => boolean;
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.isMatch` except that it accepts `customizer` which
+         * is invoked to compare values. If `customizer` returns `undefined` comparisons
+         * are handled by the method instead. The `customizer` is invoked with three
+         * arguments: (objValue, srcValue, index|key, object, source).
+         *
+         * @category Lang
+         * @param object The object to inspect.
+         * @param source The object of property values to match.
+         * @param [customizer] The function to customize comparisons.
+         * @returns Returns `true` if `object` is a match, else `false`.
+         * @example
+         *
+         * function isGreeting(value) {
+         *   return /^h(?:i|ello)$/.test(value);
+         * }
+         *
+         * function customizer(objValue, srcValue) {
+         *   if (isGreeting(objValue) && isGreeting(srcValue)) {
+         *     return true;
+         *   }
+         * }
+         *
+         * var object = { 'greeting': 'hello' };
+         * var source = { 'greeting': 'hi' };
+         *
+         * _.isMatchWith(object, source, customizer);
+         * // => true
+         */
+        isMatchWith(object: object, source: object, customizer: isMatchWithCustomizer): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isMatchWith
+         */
+        isMatchWith(source: object, customizer: isMatchWithCustomizer): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isMatchWith
+         */
+        isMatchWith(source: object, customizer: isMatchWithCustomizer): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isNaN
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is NaN.
+         *
+         * Note: This method is not the same as isNaN which returns true for undefined and other non-numeric values.
+         *
+         * @param value The value to check.
+         * @return Returns true if value is NaN, else false.
+         */
+        isNaN(value?: any): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isNaN
+         */
+        isNaN(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isNaN
+         */
+        isNaN(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isNative
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is a native function.
+         * @param value The value to check.
+         *
+         * @retrun Returns true if value is a native function, else false.
+         */
+        isNative(value: any): value is (...args: any[]) => any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * see _.isNative
+         */
+        isNative(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * see _.isNative
+         */
+        isNative(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isNil
+
+    interface LoDashStatic {
+        /**
+         * Checks if `value` is `null` or `undefined`.
+         *
+         * @category Lang
+         * @param value The value to check.
+         * @returns Returns `true` if `value` is nullish, else `false`.
+         * @example
+         *
+         * _.isNil(null);
+         * // => true
+         *
+         * _.isNil(void 0);
+         * // => true
+         *
+         * _.isNil(NaN);
+         * // => false
+         */
+        isNil(value: any): value is null | undefined;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * see _.isNil
+         */
+        isNil(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * see _.isNil
+         */
+        isNil(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isNull
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is null.
+         *
+         * @param value The value to check.
+         * @return Returns true if value is null, else false.
+         */
+        isNull(value: any): value is null;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * see _.isNull
+         */
+        isNull(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * see _.isNull
+         */
+        isNull(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isNumber
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is classified as a Number primitive or object.
+         *
+         * Note: To exclude Infinity, -Infinity, and NaN, which are classified as numbers, use the _.isFinite method.
+         *
+         * @param value The value to check.
+         * @return Returns true if value is correctly classified, else false.
+         */
+        isNumber(value?: any): value is number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * see _.isNumber
+         */
+        isNumber(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * see _.isNumber
+         */
+        isNumber(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isObject
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is the language type of Object. (e.g. arrays, functions, objects, regexes, new Number(0),
+         * and new String(''))
+         *
+         * @param value The value to check.
+         * @return Returns true if value is an object, else false.
+         */
+        isObject(value?: any): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * see _.isObject
+         */
+        isObject(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * see _.isObject
+         */
+        isObject(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isObjectLike
+
+    interface LoDashStatic {
+        /**
+         * Checks if `value` is object-like. A value is object-like if it's not `null`
+         * and has a `typeof` result of "object".
+         *
+         * @category Lang
+         * @param value The value to check.
+         * @returns Returns `true` if `value` is object-like, else `false`.
+         * @example
+         *
+         * _.isObjectLike({});
+         * // => true
+         *
+         * _.isObjectLike([1, 2, 3]);
+         * // => true
+         *
+         * _.isObjectLike(_.noop);
+         * // => false
+         *
+         * _.isObjectLike(null);
+         * // => false
+         */
+        isObjectLike(value?: any): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * see _.isObjectLike
+         */
+        isObjectLike(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * see _.isObjectLike
+         */
+        isObjectLike(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isPlainObject
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is a plain object, that is, an object created by the Object constructor or one with a
+         * [[Prototype]] of null.
+         *
+         * Note: This method assumes objects created by the Object constructor have no inherited enumerable properties.
+         *
+         * @param value The value to check.
+         * @return Returns true if value is a plain object, else false.
+         */
+        isPlainObject(value?: any): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * see _.isPlainObject
+         */
+        isPlainObject(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * see _.isPlainObject
+         */
+        isPlainObject(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isRegExp
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is classified as a RegExp object.
+         * @param value The value to check.
+         *
+         * @return Returns true if value is correctly classified, else false.
+         */
+        isRegExp(value?: any): value is RegExp;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * see _.isRegExp
+         */
+        isRegExp(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * see _.isRegExp
+         */
+        isRegExp(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isSafeInteger
+
+    interface LoDashStatic {
+        /**
+         * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754
+         * double precision number which isn't the result of a rounded unsafe integer.
+         *
+         * **Note:** This method is based on [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).
+         *
+         * @category Lang
+         * @param value The value to check.
+         * @returns Returns `true` if `value` is a safe integer, else `false`.
+         * @example
+         *
+         * _.isSafeInteger(3);
+         * // => true
+         *
+         * _.isSafeInteger(Number.MIN_VALUE);
+         * // => false
+         *
+         * _.isSafeInteger(Infinity);
+         * // => false
+         *
+         * _.isSafeInteger('3');
+         * // => false
+         */
+        isSafeInteger(value: any): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * see _.isSafeInteger
+         */
+        isSafeInteger(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * see _.isSafeInteger
+         */
+        isSafeInteger(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isSet
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is classified as a Set object.
+         *
+         * @param value The value to check.
+         * @returns Returns true if value is correctly classified, else false.
+         */
+        isSet(value?: any): value is Set<any>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isSet
+         */
+        isSet(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isSet
+         */
+        isSet(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isString
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is classified as a String primitive or object.
+         *
+         * @param value The value to check.
+         * @return Returns true if value is correctly classified, else false.
+         */
+        isString(value?: any): value is string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * see _.isString
+         */
+        isString(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * see _.isString
+         */
+        isString(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isSymbol
+
+    interface LoDashStatic {
+        /**
+         * Checks if `value` is classified as a `Symbol` primitive or object.
+         *
+         * @category Lang
+         * @param value The value to check.
+         * @returns Returns `true` if `value` is correctly classified, else `false`.
+         * @example
+         *
+         * _.isSymbol(Symbol.iterator);
+         * // => true
+         *
+         * _.isSymbol('abc');
+         * // => false
+         */
+        isSymbol(value: any): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * see _.isSymbol
+         */
+        isSymbol(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * see _.isSymbol
+         */
+        isSymbol(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isTypedArray
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is classified as a typed array.
+         *
+         * @param value The value to check.
+         * @return Returns true if value is correctly classified, else false.
+         */
+        isTypedArray(value: any): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * see _.isTypedArray
+         */
+        isTypedArray(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * see _.isTypedArray
+         */
+        isTypedArray(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isUndefined
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is undefined.
+         *
+         * @param value The value to check.
+         * @return Returns true if value is undefined, else false.
+         */
+        isUndefined(value: any): value is undefined;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * see _.isUndefined
+         */
+        isUndefined(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * see _.isUndefined
+         */
+        isUndefined(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isWeakMap
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is classified as a WeakMap object.
+         *
+         * @param value The value to check.
+         * @returns Returns true if value is correctly classified, else false.
+         */
+        isWeakMap(value?: any): value is WeakMap<object, any>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isSet
+         */
+        isWeakMap(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isSet
+         */
+        isWeakMap(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // isWeakSet
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is classified as a WeakSet object.
+         *
+         * @param value The value to check.
+         * @returns Returns true if value is correctly classified, else false.
+         */
+        isWeakSet(value?: any): value is WeakSet<object>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.isWeakSet
+         */
+        isWeakSet(): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.isWeakSet
+         */
+        isWeakSet(): LoDashExplicitWrapper<boolean>;
+    }
+
+    // lt
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is less than other.
+         *
+         * @param value The value to compare.
+         * @param other The other value to compare.
+         * @return Returns true if value is less than other, else false.
+         */
+        lt(
+            value: any,
+            other: any
+        ): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.lt
+         */
+        lt(other: any): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.lt
+         */
+        lt(other: any): LoDashExplicitWrapper<boolean>;
+    }
+
+    // lte
+
+    interface LoDashStatic {
+        /**
+         * Checks if value is less than or equal to other.
+         *
+         * @param value The value to compare.
+         * @param other The other value to compare.
+         * @return Returns true if value is less than or equal to other, else false.
+         */
+        lte(
+            value: any,
+            other: any
+        ): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.lte
+         */
+        lte(other: any): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.lte
+         */
+        lte(other: any): LoDashExplicitWrapper<boolean>;
+    }
+
+    // toArray
+
+    interface LoDashStatic {
+        /**
+         * Converts value to an array.
+         *
+         * @param value The value to convert.
+         * @return Returns the converted array.
+         */
+        toArray<T>(value: List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined): T[];
+
+        /**
+         * @see _.toArray
+         */
+        toArray<T>(value: T): Array<T[keyof T]>;
+
+        /**
+         * @see _.toArray
+         */
+        toArray(): any[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.toArray
+         */
+        toArray<T>(this: LoDashImplicitWrapper<List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined>): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.toArray
+         */
+        toArray<T extends object>(this: LoDashImplicitWrapper<T>): LoDashImplicitWrapper<Array<T[keyof T]>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.toArray
+         */
+        toArray<T>(this: LoDashExplicitWrapper<List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined>): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.toArray
+         */
+        toArray<T extends object>(this: LoDashImplicitWrapper<T>): LoDashExplicitWrapper<Array<T[keyof T]>>;
+    }
+
+    // toFinite
+
+    interface LoDashStatic {
+        /**
+         * Converts `value` to a finite number.
+         *
+         * @since 4.12.0
+         * @category Lang
+         * @param value The value to convert.
+         * @returns Returns the converted number.
+         * @example
+         *
+         * _.toFinite(3.2);
+         * // => 3.2
+         *
+         * _.toFinite(Number.MIN_VALUE);
+         * // => 5e-324
+         *
+         * _.toFinite(Infinity);
+         * // => 1.7976931348623157e+308
+         *
+         * _.toFinite('3.2');
+         * // => 3.2
+         */
+        toFinite(value: any): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.toFinite
+         */
+        toFinite(): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.toFinite
+         */
+        toFinite(): LoDashExplicitWrapper<number>;
+    }
+
+    // toInteger
+
+    interface LoDashStatic {
+        /**
+         * Converts `value` to an integer.
+         *
+         * **Note:** This function is loosely based on [`ToInteger`](http://www.ecma-international.org/ecma-262/6.0/#sec-tointeger).
+         *
+         * @category Lang
+         * @param value The value to convert.
+         * @returns Returns the converted integer.
+         * @example
+         *
+         * _.toInteger(3);
+         * // => 3
+         *
+         * _.toInteger(Number.MIN_VALUE);
+         * // => 0
+         *
+         * _.toInteger(Infinity);
+         * // => 1.7976931348623157e+308
+         *
+         * _.toInteger('3');
+         * // => 3
+         */
+        toInteger(value: any): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.toInteger
+         */
+        toInteger(): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.toInteger
+         */
+        toInteger(): LoDashExplicitWrapper<number>;
+    }
+
+    // toLength
+
+    interface LoDashStatic {
+        /**
+         * Converts `value` to an integer suitable for use as the length of an
+         * array-like object.
+         *
+         * **Note:** This method is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
+         *
+         * @category Lang
+         * @param value The value to convert.
+         * @return Returns the converted integer.
+         * @example
+         *
+         * _.toLength(3);
+         * // => 3
+         *
+         * _.toLength(Number.MIN_VALUE);
+         * // => 0
+         *
+         * _.toLength(Infinity);
+         * // => 4294967295
+         *
+         * _.toLength('3');
+         * // => 3
+         */
+        toLength(value: any): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.toLength
+         */
+        toLength(): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.toLength
+         */
+        toLength(): LoDashExplicitWrapper<number>;
+    }
+
+    // toNumber
+
+    interface LoDashStatic {
+        /**
+         * Converts `value` to a number.
+         *
+         * @category Lang
+         * @param value The value to process.
+         * @returns Returns the number.
+         * @example
+         *
+         * _.toNumber(3);
+         * // => 3
+         *
+         * _.toNumber(Number.MIN_VALUE);
+         * // => 5e-324
+         *
+         * _.toNumber(Infinity);
+         * // => Infinity
+         *
+         * _.toNumber('3');
+         * // => 3
+         */
+        toNumber(value: any): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.toNumber
+         */
+        toNumber(): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.toNumber
+         */
+        toNumber(): LoDashExplicitWrapper<number>;
+    }
+
+    // toPlainObject
+
+    interface LoDashStatic {
+        /**
+         * Converts value to a plain object flattening inherited enumerable properties of value to own properties
+         * of the plain object.
+         *
+         * @param value The value to convert.
+         * @return Returns the converted plain object.
+         */
+        toPlainObject(value?: any): any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.toPlainObject
+         */
+        toPlainObject(): LoDashImplicitWrapper<any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.toPlainObject
+         */
+        toPlainObject(): LoDashExplicitWrapper<any>;
+    }
+
+    // toSafeInteger
+
+    interface LoDashStatic {
+        /**
+         * Converts `value` to a safe integer. A safe integer can be compared and
+         * represented correctly.
+         *
+         * @category Lang
+         * @param value The value to convert.
+         * @returns Returns the converted integer.
+         * @example
+         *
+         * _.toSafeInteger(3);
+         * // => 3
+         *
+         * _.toSafeInteger(Number.MIN_VALUE);
+         * // => 0
+         *
+         * _.toSafeInteger(Infinity);
+         * // => 9007199254740991
+         *
+         * _.toSafeInteger('3');
+         * // => 3
+         */
+        toSafeInteger(value: any): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.toSafeInteger
+         */
+        toSafeInteger(): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.toSafeInteger
+         */
+        toSafeInteger(): LoDashExplicitWrapper<number>;
+    }
+
+    // toString
+
+    interface LoDashStatic {
+        /**
+         * Converts `value` to a string if it's not one. An empty string is returned
+         * for `null` and `undefined` values. The sign of `-0` is preserved.
+         *
+         * @category Lang
+         * @param value The value to process.
+         * @returns Returns the string.
+         * @example
+         *
+         * _.toString(null);
+         * // => ''
+         *
+         * _.toString(-0);
+         * // => '-0'
+         *
+         * _.toString([1, 2, 3]);
+         * // => '1,2,3'
+         */
+        toString(value: any): string;
+    }
+	
+	// isValid
+    interface LoDashStatic {
+        /**
+         * 检查对象是否有效.
+         *
+         * @param value to inspect.
+         * @return null or undefined return false, else return true.
+         */
+        isValid(value?: any): boolean;
+    }
+	
+	// isTrue
+    interface LoDashStatic {
+        /**
+         * 检查对象是否有效.
+         *
+         * @param value to inspect.
+         * @return boolean.
+         */
+        isTrue(value?: any): boolean;
+    }
+	
+	// fuzzyEqual
+    interface LoDashStatic {
+        /**
+         * 模糊比较两个数字是否相等.
+         *
+         * @param value1 .
+		 * @param value2 .
+         * @return boolean.
+         */
+        fuzzyEqual(value1: number, value2: number): boolean;
+    }
+	
+	// fuzzyLessThan
+    interface LoDashStatic {
+        /**
+         * 模糊比较value1是否<value2,比较公差为0.000001
+         *
+         * @param value1 .
+		 * @param value2 .
+         * @return boolean.
+         */
+        fuzzyLessThan(value1: number, value2: number): boolean;
+    }
+	
+	// fuzzyLessEqual
+    interface LoDashStatic {
+        /**
+         * 模糊比较value1是否<=value2,比较公差为0.000001
+         *
+         * @param value1 .
+		 * @param value2 .
+         * @return boolean.
+         */
+        fuzzyLessEqual(value1: number, value2: number): boolean;
+    }
+	
+	// fuzzyGreaterThan
+    interface LoDashStatic {
+        /**
+         * 模糊比较value1是否>value2,比较公差为0.000001
+         *
+         * @param value1 .
+		 * @param value2 .
+         * @return boolean.
+         */
+        fuzzyGreaterThan(value1: number, value2: number): boolean;
+    }
+	
+	
+	// fuzzyGreaterEqual
+    interface LoDashStatic {
+        /**
+         * 模糊比较value1是否>=value2,比较公差为0.000001
+         *
+         * @param value1 .
+		 * @param value2 .
+         * @return boolean.
+         */
+        fuzzyGreaterEqual(value1: number, value2: number): boolean;
+    }
+	
+	// format
+    interface LoDashStatic {
+        /**
+         * 使用 values...替换`template`中的占位符, 占位符为`{number}`
+         *
+         * @param template 模版字符串.
+		 * @param values 替换值.
+         * @return string 替换后的字符串.
+         */
+        format(template: string, values:((...args: any[]) => any)): string;
+    }
+	
+	// formatUnicorn
+    interface LoDashStatic {
+        /**
+         * 使用value中匹配的键的值替换模板中的占位符,占位符为`${key}`
+         *
+         * @param template 模版字符串.
+		 * @param object 替换值.
+         * @return string 替换后的字符串.
+         */
+        formatUnicorn(template: string, values:object): string;
+    }
+	
+	// romanize
+    interface LoDashStatic {
+        /**
+         * 将十进制数字转换成罗马数字
+         *
+         * @param value 十进制数字.
+         * @return string 罗马字符串.
+         */
+        romanize(value:number): string;
+    }
+	
+	// deromanize
+    interface LoDashStatic {
+        /**
+         * 将罗马数字转换成十进制数字
+         *
+         * @param value 罗马数字.
+         * @return number 十进制数字.
+         */
+        deromanize(value:number): string;
+    }
+}
diff --git a/jtg js/node_modules/@types/lodash/common/math.d.ts b/jtg js/node_modules/@types/lodash/common/math.d.ts
new file mode 100644
index 0000000..640fbc4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/common/math.d.ts	
@@ -0,0 +1,532 @@
+import _ = require("../index");
+declare module "../index" {
+    // add
+
+    interface LoDashStatic {
+        /**
+         * Adds two numbers.
+         *
+         * @param augend The first number to add.
+         * @param addend The second number to add.
+         * @return Returns the sum.
+         */
+        add(
+            augend: number,
+            addend: number
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.add
+         */
+        add(addend: number): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.add
+         */
+        add(addend: number): LoDashExplicitWrapper<number>;
+    }
+
+    // ceil
+
+    interface LoDashStatic {
+        /**
+         * Calculates n rounded up to precision.
+         *
+         * @param n The number to round up.
+         * @param precision The precision to round up to.
+         * @return Returns the rounded up number.
+         */
+        ceil(
+            n: number,
+            precision?: number
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.ceil
+         */
+        ceil(precision?: number): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.ceil
+         */
+        ceil(precision?: number): LoDashExplicitWrapper<number>;
+    }
+
+    // divide
+
+    interface LoDashStatic {
+       /**
+        * Divide two numbers.
+        *
+        * @param dividend The first number in a division.
+        * @param divisor The second number in a division.
+        * @returns Returns the quotient.
+        */
+        divide(
+            dividend: number,
+            divisor: number
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.divide
+         */
+        divide(divisor: number): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.divide
+         */
+        divide(divisor: number): LoDashExplicitWrapper<number>;
+    }
+
+    // floor
+
+    interface LoDashStatic {
+        /**
+         * Calculates n rounded down to precision.
+         *
+         * @param n The number to round down.
+         * @param precision The precision to round down to.
+         * @return Returns the rounded down number.
+         */
+        floor(
+            n: number,
+            precision?: number
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.floor
+         */
+        floor(precision?: number): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.floor
+         */
+        floor(precision?: number): LoDashExplicitWrapper<number>;
+    }
+
+    // max
+
+    interface LoDashStatic {
+         /**
+          * Computes the maximum value of `array`. If `array` is empty or falsey
+          * `undefined` is returned.
+          *
+          * @category Math
+          * @param array The array to iterate over.
+          * @returns Returns the maximum value.
+          */
+        max<T>(
+            collection: List<T> | null | undefined
+        ): T | undefined;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.max
+         */
+        max<T>(this: LoDashImplicitWrapper<List<T> | null | undefined>): T | undefined;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.max
+         */
+        max<T>(this: LoDashExplicitWrapper<List<T> | null | undefined>): LoDashExplicitWrapper<T | undefined>;
+    }
+
+    // maxBy
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.max` except that it accepts `iteratee` which is
+         * invoked for each element in `array` to generate the criterion by which
+         * the value is ranked. The iteratee is invoked with one argument: (value).
+         *
+         * @category Math
+         * @param array The array to iterate over.
+         * @param iteratee The iteratee invoked per element.
+         * @returns Returns the maximum value.
+         * @example
+         *
+         * var objects = [{ 'n': 1 }, { 'n': 2 }];
+         *
+         * _.maxBy(objects, function(o) { return o.a; });
+         * // => { 'n': 2 }
+         *
+         * // using the `_.property` iteratee shorthand
+         * _.maxBy(objects, 'n');
+         * // => { 'n': 2 }
+         */
+        maxBy<T>(
+            collection: List<T> | null | undefined,
+            iteratee?: ValueIteratee<T>
+        ): T | undefined;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.maxBy
+         */
+        maxBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            iteratee?: ValueIteratee<T>
+        ): T | undefined;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.maxBy
+         */
+        maxBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            iteratee?: ValueIteratee<T>
+        ): LoDashExplicitWrapper<T | undefined>;
+    }
+
+    // mean
+
+    interface LoDashStatic {
+        /**
+         * Computes the mean of the values in `array`.
+         *
+         * @category Math
+         * @param array The array to iterate over.
+         * @returns Returns the mean.
+         * @example
+         *
+         * _.mean([4, 2, 8, 6]);
+         * // => 5
+         */
+        mean(
+            collection: List<any> | null | undefined
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.mean
+         */
+        mean(): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.mean
+         */
+        mean(): LoDashExplicitWrapper<number>;
+    }
+
+    // meanBy
+
+    interface LoDashStatic {
+      /**
+       * Computes the mean of the provided propties of the objects in the `array`
+       *
+       * @category Math
+       * @param array The array to iterate over.
+       * @param iteratee The iteratee invoked per element.
+       * @returns Returns the mean.
+       * @example
+       *
+       * _.mean([{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }], 'n');
+       * // => 5
+       */
+        meanBy<T>(
+            collection: List<T> | null | undefined,
+            iteratee?: ValueIteratee<T>
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.meanBy
+         */
+        meanBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            iteratee?: ValueIteratee<T>
+        ): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.meanBy
+         */
+        meanBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            iteratee?: ValueIteratee<T>
+        ): LoDashExplicitWrapper<number>;
+    }
+
+    // min
+
+    interface LoDashStatic {
+        /**
+         * Computes the minimum value of `array`. If `array` is empty or falsey
+         * `undefined` is returned.
+         *
+         * @category Math
+         * @param array The array to iterate over.
+         * @returns Returns the minimum value.
+         */
+        min<T>(
+            collection: List<T> | null | undefined
+        ): T | undefined;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.min
+         */
+        min<T>(this: LoDashImplicitWrapper<List<T> | null | undefined>): T | undefined;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.min
+         */
+        min<T>(this: LoDashExplicitWrapper<List<T> | null | undefined>): LoDashExplicitWrapper<T | undefined>;
+    }
+
+    // minBy
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.min` except that it accepts `iteratee` which is
+         * invoked for each element in `array` to generate the criterion by which
+         * the value is ranked. The iteratee is invoked with one argument: (value).
+         *
+         * @category Math
+         * @param array The array to iterate over.
+         * @param iteratee The iteratee invoked per element.
+         * @returns Returns the minimum value.
+         * @example
+         *
+         * var objects = [{ 'n': 1 }, { 'n': 2 }];
+         *
+         * _.minBy(objects, function(o) { return o.a; });
+         * // => { 'n': 1 }
+         *
+         * // using the `_.property` iteratee shorthand
+         * _.minBy(objects, 'n');
+         * // => { 'n': 1 }
+         */
+        minBy<T>(
+            collection: List<T> | null | undefined,
+            iteratee?: ValueIteratee<T>
+        ): T | undefined;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.minBy
+         */
+        minBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            iteratee?: ValueIteratee<T>
+        ): T | undefined;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.minBy
+         */
+        minBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            iteratee?: ValueIteratee<T>
+        ): LoDashExplicitWrapper<T | undefined>;
+    }
+
+    // multiply
+
+    interface LoDashStatic {
+        /**
+         * Multiply two numbers.
+         * @param multiplier The first number in a multiplication.
+         * @param multiplicand The second number in a multiplication.
+         * @returns Returns the product.
+         */
+        multiply(
+            multiplier: number,
+            multiplicand: number
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.multiply
+         */
+        multiply(multiplicand: number): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.multiply
+         */
+        multiply(multiplicand: number): LoDashExplicitWrapper<number>;
+    }
+
+    // round
+
+    interface LoDashStatic {
+        /**
+         * Calculates n rounded to precision.
+         *
+         * @param n The number to round.
+         * @param precision The precision to round to.
+         * @return Returns the rounded number.
+         */
+        round(
+            n: number,
+            precision?: number
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.round
+         */
+        round(precision?: number): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.round
+         */
+        round(precision?: number): LoDashExplicitWrapper<number>;
+    }
+
+    // subtract
+
+    interface LoDashStatic {
+        /**
+         * Subtract two numbers.
+         *
+         * @category Math
+         * @param minuend The first number in a subtraction.
+         * @param subtrahend The second number in a subtraction.
+         * @returns Returns the difference.
+         * @example
+         *
+         * _.subtract(6, 4);
+         * // => 2
+         */
+        subtract(
+            minuend: number,
+            subtrahend: number
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.subtract
+         */
+        subtract(
+            subtrahend: number
+        ): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.subtract
+         */
+        subtract(
+            subtrahend: number
+        ): LoDashExplicitWrapper<number>;
+    }
+
+    // sum
+
+    interface LoDashStatic {
+        /**
+         * Computes the sum of the values in `array`.
+         *
+         * @category Math
+         * @param array The array to iterate over.
+         * @returns Returns the sum.
+         * @example
+         *
+         * _.sum([4, 2, 8, 6]);
+         * // => 20
+         */
+        sum(collection: List<any> | null | undefined): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.sum
+         */
+        sum(): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.sum
+         */
+        sum(): LoDashExplicitWrapper<number>;
+    }
+
+    // sumBy
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.sum` except that it accepts `iteratee` which is
+         * invoked for each element in `array` to generate the value to be summed.
+         * The iteratee is invoked with one argument: (value).
+         *
+         * @category Math
+         * @param array The array to iterate over.
+         * @param [iteratee=_.identity] The iteratee invoked per element.
+         * @returns Returns the sum.
+         * @example
+         *
+         * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
+         *
+         * _.sumBy(objects, function(o) { return o.n; });
+         * // => 20
+         *
+         * // using the `_.property` iteratee shorthand
+         * _.sumBy(objects, 'n');
+         * // => 20
+         */
+        sumBy<T>(
+            collection: List<T> | null | undefined,
+            iteratee?: ((value: T) => number) | string
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.sumBy
+         */
+        sumBy<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            iteratee?: ((value: T) => number) | string
+        ): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.sumBy
+         */
+        sumBy<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            iteratee?: ((value: T) => number) | string
+        ): LoDashExplicitWrapper<number>;
+    }
+}
diff --git a/jtg js/node_modules/@types/lodash/common/number.d.ts b/jtg js/node_modules/@types/lodash/common/number.d.ts
new file mode 100644
index 0000000..7da1cab
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/common/number.d.ts	
@@ -0,0 +1,178 @@
+import _ = require("../index");
+declare module "../index" {
+    // clamp
+
+    interface LoDashStatic {
+        /**
+         * Clamps `number` within the inclusive `lower` and `upper` bounds.
+         *
+         * @category Number
+         * @param number The number to clamp.
+         * @param [lower] The lower bound.
+         * @param upper The upper bound.
+         * @returns Returns the clamped number.
+         * @example
+         *
+         * _.clamp(-10, -5, 5);
+         * // => -5
+         *
+         * _.clamp(10, -5, 5);
+         * // => 5
+         */
+        clamp(
+            number: number,
+            lower: number,
+            upper: number
+        ): number;
+        clamp(
+            number: number,
+            upper: number
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.clamp
+         */
+        clamp(
+            lower: number,
+            upper: number
+        ): number;
+        clamp(
+            upper: number
+        ): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.clamp
+         */
+        clamp(
+            lower: number,
+            upper: number
+        ): LoDashExplicitWrapper<number>;
+        clamp(
+            upper: number
+        ): LoDashExplicitWrapper<number>;
+    }
+
+    // inRange
+
+    interface LoDashStatic {
+        /**
+         * Checks if n is between start and up to but not including, end. If end is not specified it’s set to start
+         * with start then set to 0.
+         *
+         * @param n The number to check.
+         * @param start The start of the range.
+         * @param end The end of the range.
+         * @return Returns true if n is in the range, else false.
+         */
+        inRange(
+            n: number,
+            start: number,
+            end?: number
+        ): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.inRange
+         */
+        inRange(
+            start: number,
+            end?: number
+        ): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.inRange
+         */
+        inRange(
+            start: number,
+            end?: number
+        ): LoDashExplicitWrapper<boolean>;
+    }
+
+    // random
+
+    interface LoDashStatic {
+        /**
+         * Produces a random number between min and max (inclusive). If only one argument is provided a number between
+         * 0 and the given number is returned. If floating is true, or either min or max are floats, a floating-point
+         * number is returned instead of an integer.
+         *
+         * @param min The minimum possible value.
+         * @param max The maximum possible value.
+         * @param floating Specify returning a floating-point number.
+         * @return Returns the random number.
+         */
+        random(
+            floating?: boolean
+        ): number;
+
+        /**
+         * @see _.random
+         */
+        random(
+            max: number,
+            floating?: boolean
+        ): number;
+
+        /**
+         * @see _.random
+         */
+        random(
+            min: number,
+            max: number,
+            floating?: boolean
+        ): number;
+
+        /**
+         * Produces a random number between min and max (inclusive). If only one argument is provided a number between
+         * 0 and the given number is returned. If floating is true, or either min or max are floats, a floating-point
+         * number is returned instead of an integer.
+         *
+         * @param min The minimum possible value.
+         * @param index Not used in this overload.
+         * @param guard Enables use as an iteratee for methods like _.map. You should not pass this parameter directly in your code.
+         * @return Returns the random number.
+         */
+        random(
+            min: number,
+            index: string | number,
+            guard: object
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.random
+         */
+        random(floating?: boolean): number;
+
+        /**
+         * @see _.random
+         */
+        random(
+            max: number,
+            floating?: boolean
+        ): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.random
+         */
+        random(floating?: boolean): LoDashExplicitWrapper<number>;
+
+        /**
+         * @see _.random
+         */
+        random(
+            max: number,
+            floating?: boolean
+        ): LoDashExplicitWrapper<number>;
+    }
+}
diff --git a/jtg js/node_modules/@types/lodash/common/object.d.ts b/jtg js/node_modules/@types/lodash/common/object.d.ts
new file mode 100644
index 0000000..5e2d539
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/common/object.d.ts	
@@ -0,0 +1,3761 @@
+import _ = require("../index");
+declare module "../index" {
+    // assign
+
+    interface LoDashStatic {
+        /**
+         * Assigns own enumerable properties of source objects to the destination
+         * object. Source objects are applied from left to right. Subsequent sources
+         * overwrite property assignments of previous sources.
+         *
+         * **Note:** This method mutates `object` and is loosely based on
+         * [`Object.assign`](https://mdn.io/Object/assign).
+         *
+         * @category Object
+         * @param object The destination object.
+         * @param [sources] The source objects.
+         * @returns Returns `object`.
+         * @example
+         *
+         * function Foo() {
+         *   this.c = 3;
+         * }
+         *
+         * function Bar() {
+         *   this.e = 5;
+         * }
+         *
+         * Foo.prototype.d = 4;
+         * Bar.prototype.f = 6;
+         *
+         * _.assign({ 'a': 1 }, new Foo, new Bar);
+         * // => { 'a': 1, 'c': 3, 'e': 5 }
+         */
+        assign<TObject, TSource>(
+            object: TObject,
+            source: TSource
+        ): TObject & TSource;
+
+        /**
+         * @see assign
+         */
+        assign<TObject, TSource1, TSource2>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2
+        ): TObject & TSource1 & TSource2;
+
+        /**
+         * @see assign
+         */
+        assign<TObject, TSource1, TSource2, TSource3>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3
+        ): TObject & TSource1 & TSource2 & TSource3;
+
+        /**
+         * @see assign
+         */
+        assign<TObject, TSource1, TSource2, TSource3, TSource4>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4
+        ): TObject & TSource1 & TSource2 & TSource3 & TSource4;
+
+        /**
+         * @see _.assign
+         */
+        assign<TObject>(object: TObject): TObject;
+
+        /**
+         * @see _.assign
+         */
+        assign(
+            object: any,
+            ...otherArgs: any[]
+        ): any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.assign
+         */
+        assign<TSource>(
+            source: TSource
+        ): LoDashImplicitWrapper<TValue & TSource>;
+
+        /**
+         * @see assign
+         */
+        assign<TSource1, TSource2>(
+            source1: TSource1,
+            source2: TSource2
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2>;
+
+        /**
+         * @see assign
+         */
+        assign<TSource1, TSource2, TSource3>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2 & TSource3>;
+
+        /**
+         * @see assign
+         */
+        assign<TSource1, TSource2, TSource3, TSource4>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2 & TSource3 & TSource4>;
+
+        /**
+         * @see _.assign
+         */
+        assign(): LoDashImplicitWrapper<TValue>;
+
+        /**
+         * @see _.assign
+         */
+        assign(...otherArgs: any[]): LoDashImplicitWrapper<any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.assign
+         */
+        assign<TSource>(
+            source: TSource
+        ): LoDashExplicitWrapper<TValue & TSource>;
+
+        /**
+         * @see assign
+         */
+        assign<TSource1, TSource2>(
+            source1: TSource1,
+            source2: TSource2
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2>;
+
+        /**
+         * @see assign
+         */
+        assign<TSource1, TSource2, TSource3>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2 & TSource3>;
+
+        /**
+         * @see assign
+         */
+        assign<TSource1, TSource2, TSource3, TSource4>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2 & TSource3 & TSource4>;
+
+        /**
+         * @see _.assign
+         */
+        assign(): LoDashExplicitWrapper<TValue>;
+
+        /**
+         * @see _.assign
+         */
+        assign(...otherArgs: any[]): LoDashExplicitWrapper<any>;
+    }
+
+    // assignIn
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.assign` except that it iterates over own and
+         * inherited source properties.
+         *
+         * **Note:** This method mutates `object`.
+         *
+         * @alias extend
+         * @category Object
+         * @param object The destination object.
+         * @param [sources] The source objects.
+         * @returns Returns `object`.
+         * @example
+         *
+         * function Foo() {
+         *   this.b = 2;
+         * }
+         *
+         * function Bar() {
+         *   this.d = 4;
+         * }
+         *
+         * Foo.prototype.c = 3;
+         * Bar.prototype.e = 5;
+         *
+         * _.assignIn({ 'a': 1 }, new Foo, new Bar);
+         * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5 }
+         */
+        assignIn<TObject, TSource>(
+            object: TObject,
+            source: TSource
+        ): TObject & TSource;
+
+        /**
+         * @see assignIn
+         */
+        assignIn<TObject, TSource1, TSource2>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2
+        ): TObject & TSource1 & TSource2;
+
+        /**
+         * @see assignIn
+         */
+        assignIn<TObject, TSource1, TSource2, TSource3>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3
+        ): TObject & TSource1 & TSource2 & TSource3;
+
+        /**
+         * @see assignIn
+         */
+        assignIn<TObject, TSource1, TSource2, TSource3, TSource4>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4
+        ): TObject & TSource1 & TSource2 & TSource3 & TSource4;
+
+        /**
+         * @see _.assignIn
+         */
+        assignIn<TObject>(object: TObject): TObject;
+
+        /**
+         * @see _.assignIn
+         */
+        assignIn<TResult>(
+            object: any,
+            ...otherArgs: any[]
+        ): TResult;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.assignIn
+         */
+        assignIn<TSource>(
+            source: TSource
+        ): LoDashImplicitWrapper<TValue & TSource>;
+
+        /**
+         * @see assignIn
+         */
+        assignIn<TSource1, TSource2>(
+            source1: TSource1,
+            source2: TSource2
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2>;
+
+        /**
+         * @see assignIn
+         */
+        assignIn<TSource1, TSource2, TSource3>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2 & TSource3>;
+
+        /**
+         * @see assignIn
+         */
+        assignIn<TSource1, TSource2, TSource3, TSource4>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2 & TSource3 & TSource4>;
+
+        /**
+         * @see _.assignIn
+         */
+        assignIn(): LoDashImplicitWrapper<TValue>;
+
+        /**
+         * @see _.assignIn
+         */
+        assignIn<TResult>(...otherArgs: any[]): LoDashImplicitWrapper<TResult>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.assignIn
+         */
+        assignIn<TSource>(
+            source: TSource
+        ): LoDashExplicitWrapper<TValue & TSource>;
+
+        /**
+         * @see assignIn
+         */
+        assignIn<TSource1, TSource2>(
+            source1: TSource1,
+            source2: TSource2
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2>;
+
+        /**
+         * @see assignIn
+         */
+        assignIn<TSource1, TSource2, TSource3>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2 & TSource3>;
+
+        /**
+         * @see assignIn
+         */
+        assignIn<TSource1, TSource2, TSource3, TSource4>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2 & TSource3 & TSource4>;
+
+        /**
+         * @see _.assignIn
+         */
+        assignIn(): LoDashExplicitWrapper<TValue>;
+
+        /**
+         * @see _.assignIn
+         */
+        assignIn(...otherArgs: any[]): LoDashExplicitWrapper<any>;
+    }
+
+    // assignInWith
+
+    type AssignCustomizer = (objectValue: any, sourceValue: any, key?: string, object?: {}, source?: {}) => any;
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.assignIn` except that it accepts `customizer` which
+         * is invoked to produce the assigned values. If `customizer` returns `undefined`
+         * assignment is handled by the method instead. The `customizer` is invoked
+         * with five arguments: (objValue, srcValue, key, object, source).
+         *
+         * **Note:** This method mutates `object`.
+         *
+         * @alias extendWith
+         * @category Object
+         * @param object The destination object.
+         * @param sources The source objects.
+         * @param [customizer] The function to customize assigned values.
+         * @returns Returns `object`.
+         * @example
+         *
+         * function customizer(objValue, srcValue) {
+         *   return _.isUndefined(objValue) ? srcValue : objValue;
+         * }
+         *
+         * var defaults = _.partialRight(_.assignInWith, customizer);
+         *
+         * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
+         * // => { 'a': 1, 'b': 2 }
+         */
+        assignInWith<TObject, TSource>(
+            object: TObject,
+            source: TSource,
+            customizer: AssignCustomizer
+        ): TObject & TSource;
+
+        /**
+         * @see assignInWith
+         */
+        assignInWith<TObject, TSource1, TSource2>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            customizer: AssignCustomizer
+        ): TObject & TSource1 & TSource2;
+
+        /**
+         * @see assignInWith
+         */
+        assignInWith<TObject, TSource1, TSource2, TSource3>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            customizer: AssignCustomizer
+        ): TObject & TSource1 & TSource2 & TSource3;
+
+        /**
+         * @see assignInWith
+         */
+        assignInWith<TObject, TSource1, TSource2, TSource3, TSource4>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4,
+            customizer: AssignCustomizer
+        ): TObject & TSource1 & TSource2 & TSource3 & TSource4;
+
+        /**
+         * @see _.assignInWith
+         */
+        assignInWith<TObject>(object: TObject): TObject;
+
+        /**
+         * @see _.assignInWith
+         */
+        assignInWith<TResult>(
+            object: any,
+            ...otherArgs: any[]
+        ): TResult;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.assignInWith
+         */
+        assignInWith<TSource>(
+            source: TSource,
+            customizer: AssignCustomizer
+        ): LoDashImplicitWrapper<TValue & TSource>;
+
+        /**
+         * @see assignInWith
+         */
+        assignInWith<TSource1, TSource2>(
+            source1: TSource1,
+            source2: TSource2,
+            customizer: AssignCustomizer
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2>;
+
+        /**
+         * @see assignInWith
+         */
+        assignInWith<TSource1, TSource2, TSource3>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            customizer: AssignCustomizer
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2 & TSource3>;
+
+        /**
+         * @see assignInWith
+         */
+        assignInWith<TSource1, TSource2, TSource3, TSource4>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4,
+            customizer: AssignCustomizer
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2 & TSource3 & TSource4>;
+
+        /**
+         * @see _.assignInWith
+         */
+        assignInWith(): LoDashImplicitWrapper<TValue>;
+
+        /**
+         * @see _.assignInWith
+         */
+        assignInWith<TResult>(...otherArgs: any[]): LoDashImplicitWrapper<TResult>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.assignInWith
+         */
+        assignInWith<TSource>(
+            source: TSource,
+            customizer: AssignCustomizer
+        ): LoDashExplicitWrapper<TValue & TSource>;
+
+        /**
+         * @see assignInWith
+         */
+        assignInWith<TSource1, TSource2>(
+            source1: TSource1,
+            source2: TSource2,
+            customizer: AssignCustomizer
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2>;
+
+        /**
+         * @see assignInWith
+         */
+        assignInWith<TSource1, TSource2, TSource3>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            customizer: AssignCustomizer
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2 & TSource3>;
+
+        /**
+         * @see assignInWith
+         */
+        assignInWith<TSource1, TSource2, TSource3, TSource4>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4,
+            customizer: AssignCustomizer
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2 & TSource3 & TSource4>;
+
+        /**
+         * @see _.assignInWith
+         */
+        assignInWith(): LoDashExplicitWrapper<TValue>;
+
+        /**
+         * @see _.assignInWith
+         */
+        assignInWith(...otherArgs: any[]): LoDashExplicitWrapper<any>;
+    }
+
+    // assignWith
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.assign` except that it accepts `customizer` which
+         * is invoked to produce the assigned values. If `customizer` returns `undefined`
+         * assignment is handled by the method instead. The `customizer` is invoked
+         * with five arguments: (objValue, srcValue, key, object, source).
+         *
+         * **Note:** This method mutates `object`.
+         *
+         * @category Object
+         * @param object The destination object.
+         * @param sources The source objects.
+         * @param [customizer] The function to customize assigned values.
+         * @returns Returns `object`.
+         * @example
+         *
+         * function customizer(objValue, srcValue) {
+         *   return _.isUndefined(objValue) ? srcValue : objValue;
+         * }
+         *
+         * var defaults = _.partialRight(_.assignWith, customizer);
+         *
+         * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
+         * // => { 'a': 1, 'b': 2 }
+         */
+        assignWith<TObject, TSource>(
+            object: TObject,
+            source: TSource,
+            customizer: AssignCustomizer
+        ): TObject & TSource;
+
+        /**
+         * @see assignWith
+         */
+        assignWith<TObject, TSource1, TSource2>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            customizer: AssignCustomizer
+        ): TObject & TSource1 & TSource2;
+
+        /**
+         * @see assignWith
+         */
+        assignWith<TObject, TSource1, TSource2, TSource3>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            customizer: AssignCustomizer
+        ): TObject & TSource1 & TSource2 & TSource3;
+
+        /**
+         * @see assignWith
+         */
+        assignWith<TObject, TSource1, TSource2, TSource3, TSource4>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4,
+            customizer: AssignCustomizer
+        ): TObject & TSource1 & TSource2 & TSource3 & TSource4;
+
+        /**
+         * @see _.assignWith
+         */
+        assignWith<TObject>(object: TObject): TObject;
+
+        /**
+         * @see _.assignWith
+         */
+        assignWith<TResult>(
+            object: any,
+            ...otherArgs: any[]
+        ): TResult;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.assignWith
+         */
+        assignWith<TSource>(
+            source: TSource,
+            customizer: AssignCustomizer
+        ): LoDashImplicitWrapper<TValue & TSource>;
+
+        /**
+         * @see assignWith
+         */
+        assignWith<TSource1, TSource2>(
+            source1: TSource1,
+            source2: TSource2,
+            customizer: AssignCustomizer
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2>;
+
+        /**
+         * @see assignWith
+         */
+        assignWith<TSource1, TSource2, TSource3>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            customizer: AssignCustomizer
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2 & TSource3>;
+
+        /**
+         * @see assignWith
+         */
+        assignWith<TSource1, TSource2, TSource3, TSource4>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4,
+            customizer: AssignCustomizer
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2 & TSource3 & TSource4>;
+
+        /**
+         * @see _.assignWith
+         */
+        assignWith(): LoDashImplicitWrapper<TValue>;
+
+        /**
+         * @see _.assignWith
+         */
+        assignWith<TResult>(...otherArgs: any[]): LoDashImplicitWrapper<TResult>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.assignWith
+         */
+        assignWith<TSource>(
+            source: TSource,
+            customizer: AssignCustomizer
+        ): LoDashExplicitWrapper<TValue & TSource>;
+
+        /**
+         * @see assignWith
+         */
+        assignWith<TSource1, TSource2>(
+            source1: TSource1,
+            source2: TSource2,
+            customizer: AssignCustomizer
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2>;
+
+        /**
+         * @see assignWith
+         */
+        assignWith<TSource1, TSource2, TSource3>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            customizer: AssignCustomizer
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2 & TSource3>;
+
+        /**
+         * @see assignWith
+         */
+        assignWith<TSource1, TSource2, TSource3, TSource4>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4,
+            customizer: AssignCustomizer
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2 & TSource3 & TSource4>;
+
+        /**
+         * @see _.assignWith
+         */
+        assignWith(): LoDashExplicitWrapper<TValue>;
+
+        /**
+         * @see _.assignWith
+         */
+        assignWith(...otherArgs: any[]): LoDashExplicitWrapper<any>;
+    }
+
+    // at
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of elements corresponding to the given keys, or indexes, of collection. Keys may be
+         * specified as individual arguments or as arrays of keys.
+         *
+         * @param object The object to iterate over.
+         * @param props The property names or indexes of elements to pick, specified individually or in arrays.
+         * @return Returns the new array of picked elements.
+         */
+        at<T>(
+            object: List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined,
+            ...props: PropertyPath[]
+        ): T[];
+
+        /**
+         * @see _.at
+         */
+        at<T extends object>(
+            object: T | null | undefined,
+            ...props: Array<Many<keyof T>>
+        ): Array<T[keyof T]>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.at
+         */
+        at<T>(
+            this: LoDashImplicitWrapper<List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            ...props: PropertyPath[]
+        ): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.at
+         */
+        at<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            ...props: Array<Many<keyof T>>
+        ): LoDashImplicitWrapper<Array<T[keyof T]>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.at
+         */
+        at<T>(
+            this: LoDashExplicitWrapper<List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            ...props: PropertyPath[]
+        ): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.at
+         */
+        at<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            ...props: Array<Many<keyof T>>
+        ): LoDashExplicitWrapper<Array<T[keyof T]>>;
+    }
+
+    // create
+
+    interface LoDashStatic {
+        /**
+         * Creates an object that inherits from the given prototype object. If a properties object is provided its own
+         * enumerable properties are assigned to the created object.
+         *
+         * @param prototype The object to inherit from.
+         * @param properties The properties to assign to the object.
+         * @return Returns the new object.
+         */
+        create<T extends object, U extends object>(
+            prototype: T,
+            properties?: U
+        ): T & U;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.create
+         */
+        create<U extends object>(properties?: U): LoDashImplicitWrapper<TValue & U>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.create
+         */
+        create<U extends object>(properties?: U): LoDashExplicitWrapper<TValue & U>;
+    }
+
+    // defaults
+
+    interface LoDashStatic {
+        /**
+         * Assigns own enumerable properties of source object(s) to the destination object for all destination
+         * properties that resolve to undefined. Once a property is set, additional values of the same property are
+         * ignored.
+         *
+         * Note: This method mutates object.
+         *
+         * @param object The destination object.
+         * @param sources The source objects.
+         * @return The destination object.
+         */
+        defaults<TObject, TSource>(
+            object: TObject,
+            source: TSource
+        ): TSource & TObject;
+
+        /**
+         * @see _.defaults
+         */
+        defaults<TObject, TSource1, TSource2>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2
+        ): TSource2 & TSource1 & TObject;
+
+        /**
+         * @see _.defaults
+         */
+        defaults<TObject, TSource1, TSource2, TSource3>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3
+        ): TSource3 & TSource2 & TSource1 & TObject;
+
+        /**
+         * @see _.defaults
+         */
+        defaults<TObject, TSource1, TSource2, TSource3, TSource4>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4
+        ): TSource4 & TSource3 & TSource2 & TSource1 & TObject;
+
+        /**
+         * @see _.defaults
+         */
+        defaults<TObject>(object: TObject): TObject;
+
+        /**
+         * @see _.defaults
+         */
+        defaults(
+            object: any,
+            ...sources: any[]
+        ): any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.defaults
+         */
+        defaults<TSource>(
+            source: TSource
+        ): LoDashImplicitWrapper<TSource & TValue>;
+
+        /**
+         * @see _.defaults
+         */
+        defaults<TSource1, TSource2>(
+            source1: TSource1,
+            source2: TSource2
+        ): LoDashImplicitWrapper<TSource2 & TSource1 & TValue>;
+
+        /**
+         * @see _.defaults
+         */
+        defaults<TSource1, TSource2, TSource3>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3
+        ): LoDashImplicitWrapper<TSource3 & TSource2 & TSource1 & TValue>;
+
+        /**
+         * @see _.defaults
+         */
+        defaults<TSource1, TSource2, TSource3, TSource4>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4
+        ): LoDashImplicitWrapper<TSource4 & TSource3 & TSource2 & TSource1 & TValue>;
+
+        /**
+         * @see _.defaults
+         */
+        defaults(): LoDashImplicitWrapper<TValue>;
+
+        /**
+         * @see _.defaults
+         */
+        defaults(...sources: any[]): LoDashImplicitWrapper<any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.defaults
+         */
+        defaults<TSource>(
+            source: TSource
+        ): LoDashExplicitWrapper<TSource & TValue>;
+
+        /**
+         * @see _.defaults
+         */
+        defaults<TSource1, TSource2>(
+            source1: TSource1,
+            source2: TSource2
+        ): LoDashExplicitWrapper<TSource2 & TSource1 & TValue>;
+
+        /**
+         * @see _.defaults
+         */
+        defaults<TSource1, TSource2, TSource3>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3
+        ): LoDashExplicitWrapper<TSource3 & TSource2 & TSource1 & TValue>;
+
+        /**
+         * @see _.defaults
+         */
+        defaults<TSource1, TSource2, TSource3, TSource4>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4
+        ): LoDashExplicitWrapper<TSource4 & TSource3 & TSource2 & TSource1 & TValue>;
+
+        /**
+         * @see _.defaults
+         */
+        defaults(): LoDashExplicitWrapper<TValue>;
+
+        /**
+         * @see _.defaults
+         */
+        defaults(...sources: any[]): LoDashExplicitWrapper<any>;
+    }
+
+    // defaultsDeep
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.defaults except that it recursively assigns default properties.
+         * @param object The destination object.
+         * @param sources The source objects.
+         * @return Returns object.
+         **/
+        defaultsDeep(
+            object: any,
+            ...sources: any[]): any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.defaultsDeep
+         **/
+        defaultsDeep(...sources: any[]): LoDashImplicitWrapper<any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.defaultsDeep
+         **/
+        defaultsDeep(...sources: any[]): LoDashExplicitWrapper<any>;
+    }
+
+    // entries
+
+    interface LoDashStatic {
+        /**
+         * @see _.toPairs
+         */
+        entries<T>(object?: Dictionary<T> | NumericDictionary<T>): Array<[string, T]>;
+
+        /**
+         * @see _.toPairs
+         */
+        entries(object?: object): Array<[string, any]>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.toPairs
+         */
+        entries<T>(this: LoDashImplicitWrapper<Dictionary<T> | NumericDictionary<T>>): LoDashImplicitWrapper<Array<[string, T]>>;
+
+        /**
+         * @see _.toPairs
+         */
+        entries(): LoDashImplicitWrapper<Array<[string, any]>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.toPairs
+         */
+        entries<T>(this: LoDashExplicitWrapper<Dictionary<T> | NumericDictionary<T>>): LoDashExplicitWrapper<Array<[string, T]>>;
+
+        /**
+         * @see _.toPairs
+         */
+        entries(): LoDashExplicitWrapper<Array<[string, any]>>;
+    }
+
+    // entriesIn
+
+    interface LoDashStatic {
+        /**
+         * @see _.entriesIn
+         */
+        entriesIn<T>(object?: Dictionary<T> | NumericDictionary<T>): Array<[string, T]>;
+
+        /**
+         * @see _.entriesIn
+         */
+        entriesIn(object?: object): Array<[string, any]>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.entriesIn
+         */
+        entriesIn<T>(this: LoDashImplicitWrapper<Dictionary<T> | NumericDictionary<T>>): LoDashImplicitWrapper<Array<[string, T]>>;
+
+        /**
+         * @see _.entriesIn
+         */
+        entriesIn(): LoDashImplicitWrapper<Array<[string, any]>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.entriesIn
+         */
+        entriesIn<T>(this: LoDashExplicitWrapper<Dictionary<T> | NumericDictionary<T>>): LoDashExplicitWrapper<Array<[string, T]>>;
+
+        /**
+         * @see _.entriesIn
+         */
+        entriesIn(): LoDashExplicitWrapper<Array<[string, any]>>;
+    }
+
+    // extend
+
+    interface LoDashStatic {
+        /**
+         * @see _.extend
+         */
+        extend<TObject, TSource>(
+            object: TObject,
+            source: TSource
+        ): TObject & TSource;
+
+        /**
+         * @see _.extend
+         */
+        extend<TObject, TSource1, TSource2>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2
+        ): TObject & TSource1 & TSource2;
+
+        /**
+         * @see _.extend
+         */
+        extend<TObject, TSource1, TSource2, TSource3>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3
+        ): TObject & TSource1 & TSource2 & TSource3;
+
+        /**
+         * @see _.extend
+         */
+        extend<TObject, TSource1, TSource2, TSource3, TSource4>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4
+        ): TObject & TSource1 & TSource2 & TSource3 & TSource4;
+
+        /**
+         * @see _.extend
+         */
+        extend<TObject>(object: TObject): TObject;
+
+        /**
+         * @see _.extend
+         */
+        extend<TResult>(
+            object: any,
+            ...otherArgs: any[]
+        ): TResult;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.extend
+         */
+        extend<TSource>(
+            source: TSource
+        ): LoDashImplicitWrapper<TValue & TSource>;
+
+        /**
+         * @see _.extend
+         */
+        extend<TSource1, TSource2>(
+            source1: TSource1,
+            source2: TSource2
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2>;
+
+        /**
+         * @see _.extend
+         */
+        extend<TSource1, TSource2, TSource3>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2 & TSource3>;
+
+        /**
+         * @see _.extend
+         */
+        extend<TSource1, TSource2, TSource3, TSource4>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2 & TSource3 & TSource4>;
+
+        /**
+         * @see _.extend
+         */
+        extend(): LoDashImplicitWrapper<TValue>;
+
+        /**
+         * @see _.extend
+         */
+        extend(...otherArgs: any[]): LoDashImplicitWrapper<any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.extend
+         */
+        extend<TSource>(
+            source: TSource
+        ): LoDashExplicitWrapper<TValue & TSource>;
+
+        /**
+         * @see _.extend
+         */
+        extend<TSource1, TSource2>(
+            source1: TSource1,
+            source2: TSource2
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2>;
+
+        /**
+         * @see _.extend
+         */
+        extend<TSource1, TSource2, TSource3>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2 & TSource3>;
+
+        /**
+         * @see _.extend
+         */
+        extend<TSource1, TSource2, TSource3, TSource4>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2 & TSource3 & TSource4>;
+
+        /**
+         * @see _.extend
+         */
+        extend(): LoDashExplicitWrapper<TValue>;
+
+        /**
+         * @see _.extend
+         */
+        extend(...otherArgs: any[]): LoDashExplicitWrapper<any>;
+    }
+
+    // extendWith
+
+    interface LoDashStatic {
+        /**
+         * @see _.extendWith
+         */
+        extendWith<TObject, TSource>(
+            object: TObject,
+            source: TSource,
+            customizer: AssignCustomizer
+        ): TObject & TSource;
+
+        /**
+         * @see _.extendWith
+         */
+        extendWith<TObject, TSource1, TSource2>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            customizer: AssignCustomizer
+        ): TObject & TSource1 & TSource2;
+
+        /**
+         * @see _.extendWith
+         */
+        extendWith<TObject, TSource1, TSource2, TSource3>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            customizer: AssignCustomizer
+        ): TObject & TSource1 & TSource2 & TSource3;
+
+        /**
+         * @see _.extendWith
+         */
+        extendWith<TObject, TSource1, TSource2, TSource3, TSource4>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4,
+            customizer: AssignCustomizer
+        ): TObject & TSource1 & TSource2 & TSource3 & TSource4;
+
+        /**
+         * @see _.extendWith
+         */
+        extendWith<TObject>(object: TObject): TObject;
+
+        /**
+         * @see _.extendWith
+         */
+        extendWith<TResult>(
+            object: any,
+            ...otherArgs: any[]
+        ): TResult;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.extendWith
+         */
+        extendWith<TSource>(
+            source: TSource,
+            customizer: AssignCustomizer
+        ): LoDashImplicitWrapper<TValue & TSource>;
+
+        /**
+         * @see _.extendWith
+         */
+        extendWith<TSource1, TSource2>(
+            source1: TSource1,
+            source2: TSource2,
+            customizer: AssignCustomizer
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2>;
+
+        /**
+         * @see _.extendWith
+         */
+        extendWith<TSource1, TSource2, TSource3>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            customizer: AssignCustomizer
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2 & TSource3>;
+
+        /**
+         * @see _.extendWith
+         */
+        extendWith<TSource1, TSource2, TSource3, TSource4>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4,
+            customizer: AssignCustomizer
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2 & TSource3 & TSource4>;
+
+        /**
+         * @see _.extendWith
+         */
+        extendWith(): LoDashImplicitWrapper<TValue>;
+
+        /**
+         * @see _.extendWith
+         */
+        extendWith(...otherArgs: any[]): LoDashImplicitWrapper<any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.extendWith
+         */
+        extendWith<TSource>(
+            source: TSource,
+            customizer: AssignCustomizer
+        ): LoDashExplicitWrapper<TValue & TSource>;
+
+        /**
+         * @see _.extendWith
+         */
+        extendWith<TSource1, TSource2>(
+            source1: TSource1,
+            source2: TSource2,
+            customizer: AssignCustomizer
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2>;
+
+        /**
+         * @see _.extendWith
+         */
+        extendWith<TSource1, TSource2, TSource3>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            customizer: AssignCustomizer
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2 & TSource3>;
+
+        /**
+         * @see _.extendWith
+         */
+        extendWith<TSource1, TSource2, TSource3, TSource4>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4,
+            customizer: AssignCustomizer
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2 & TSource3 & TSource4>;
+
+        /**
+         * @see _.extendWith
+         */
+        extendWith(): LoDashExplicitWrapper<TValue>;
+
+        /**
+         * @see _.extendWith
+         */
+        extendWith(...otherArgs: any[]): LoDashExplicitWrapper<any>;
+    }
+
+    // findKey
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.find except that it returns the key of the first element predicate returns truthy for
+         * instead of the element itself.
+         *
+         * @param object The object to search.
+         * @param predicate The function invoked per iteration.
+         * @return Returns the key of the matched element, else undefined.
+         */
+        findKey<T>(
+            object: T | null | undefined,
+            predicate?: ObjectIteratee<T>
+        ): string | undefined;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.findKey
+         */
+        findKey<T>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            predicate?: ObjectIteratee<T>
+        ): string | undefined;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.findKey
+         */
+        findKey<T>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            predicate?: ObjectIteratee<T>
+        ): LoDashExplicitWrapper<string | undefined>;
+    }
+
+    // findLastKey
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.findKey except that it iterates over elements of a collection in the opposite order.
+         *
+         * @param object The object to search.
+         * @param predicate The function invoked per iteration.
+         * @return Returns the key of the matched element, else undefined.
+         */
+        findLastKey<T>(
+            object: T | null | undefined,
+            predicate?: ObjectIteratee<T>
+        ): string | undefined;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.findLastKey
+         */
+        findLastKey<T>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            predicate?: ObjectIteratee<T>
+        ): string | undefined;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.findLastKey
+         */
+        findLastKey<T>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            predicate?: ObjectIteratee<T>
+        ): LoDashExplicitWrapper<string | undefined>;
+    }
+
+    // forIn
+
+    interface LoDashStatic {
+        /**
+         * Iterates over own and inherited enumerable properties of an object invoking iteratee for each property. The
+         * iteratee is invoked with three arguments: (value, key, object). Iteratee functions may
+         * exit iteration early by explicitly returning false.
+         *
+         * @param object The object to iterate over.
+         * @param iteratee The function invoked per iteration.
+         * @return Returns object.
+         */
+        forIn<T>(
+            object: T,
+            iteratee?: ObjectIterator<T, any>
+        ): T;
+
+        /**
+         * @see _.forIn
+         */
+        forIn<T>(
+            object: T | null | undefined,
+            iteratee?: ObjectIterator<T, any>
+        ): T | null | undefined;
+    }
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * @see _.forIn
+         */
+        forIn<T>(
+            this: LoDashWrapper<T | null | undefined>,
+            iteratee?: ObjectIterator<T, any>
+        ): this;
+    }
+
+    // forInRight
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.forIn except that it iterates over properties of object in the opposite order.
+         *
+         * @param object The object to iterate over.
+         * @param iteratee The function invoked per iteration.
+         * @return Returns object.
+         */
+        forInRight<T>(
+            object: T,
+            iteratee?: ObjectIterator<T, any>
+        ): T;
+
+        /**
+         * @see _.forInRight
+         */
+        forInRight<T>(
+            object: T | null | undefined,
+            iteratee?: ObjectIterator<T, any>
+        ): T | null | undefined;
+    }
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * @see _.forInRight
+         */
+        forInRight<T>(
+            this: LoDashWrapper<T | null | undefined>,
+            iteratee?: ObjectIterator<T, any>
+        ): this;
+    }
+
+    // forOwn
+
+    interface LoDashStatic {
+        /**
+         * Iterates over own enumerable properties of an object invoking iteratee for each property. The iteratee is
+         * invoked with three arguments: (value, key, object). Iteratee functions may exit
+         * iteration early by explicitly returning false.
+         *
+         * @param object The object to iterate over.
+         * @param iteratee The function invoked per iteration.
+         * @return Returns object.
+         */
+        forOwn<T>(
+            object: T,
+            iteratee?: ObjectIterator<T, any>
+        ): T;
+
+        /**
+         * @see _.forOwn
+         */
+        forOwn<T>(
+            object: T | null | undefined,
+            iteratee?: ObjectIterator<T, any>
+        ): T | null | undefined;
+    }
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * @see _.forOwn
+         */
+        forOwn<T>(
+            this: LoDashWrapper<T | null | undefined>,
+            iteratee?: ObjectIterator<T, any>
+        ): this;
+    }
+
+    // forOwnRight
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.forOwn except that it iterates over properties of object in the opposite order.
+         *
+         * @param object The object to iterate over.
+         * @param iteratee The function invoked per iteration.
+         * @return Returns object.
+         */
+        forOwnRight<T>(
+            object: T,
+            iteratee?: ObjectIterator<T, any>
+        ): T;
+
+        /**
+         * @see _.forOwnRight
+         */
+        forOwnRight<T>(
+            object: T | null | undefined,
+            iteratee?: ObjectIterator<T, any>
+        ): T | null | undefined;
+    }
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * @see _.forOwnRight
+         */
+        forOwnRight<T>(
+            this: LoDashWrapper<T | null | undefined>,
+            iteratee?: ObjectIterator<T, any>
+        ): this;
+    }
+
+    // functions
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of function property names from own enumerable properties
+         * of `object`.
+         *
+         * @category Object
+         * @param object The object to inspect.
+         * @returns Returns the new array of property names.
+         * @example
+         *
+         * function Foo() {
+         *   this.a = _.constant('a');
+         *   this.b = _.constant('b');
+         * }
+         *
+         * Foo.prototype.c = _.constant('c');
+         *
+         * _.functions(new Foo);
+         * // => ['a', 'b']
+         */
+        functions(object: any): string[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.functions
+         */
+        functions(): LoDashImplicitWrapper<string[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.functions
+         */
+        functions(): LoDashExplicitWrapper<string[]>;
+    }
+
+    // functionsIn
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of function property names from own and inherited
+         * enumerable properties of `object`.
+         *
+         * @category Object
+         * @param object The object to inspect.
+         * @returns Returns the new array of property names.
+         * @example
+         *
+         * function Foo() {
+         *   this.a = _.constant('a');
+         *   this.b = _.constant('b');
+         * }
+         *
+         * Foo.prototype.c = _.constant('c');
+         *
+         * _.functionsIn(new Foo);
+         * // => ['a', 'b', 'c']
+         */
+        functionsIn<T extends {}>(object: any): string[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.functionsIn
+         */
+        functionsIn(): LoDashImplicitWrapper<string[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.functionsIn
+         */
+        functionsIn(): LoDashExplicitWrapper<string[]>;
+    }
+
+    // get
+
+    interface LoDashStatic {
+        /**
+         * Gets the property value at path of object. If the resolved value is undefined the defaultValue is used
+         * in its place.
+         *
+         * @param object The object to query.
+         * @param path The path of the property to get.
+         * @param defaultValue The value returned if the resolved value is undefined.
+         * @return Returns the resolved value.
+         */
+        get<TObject extends object, TKey extends keyof TObject>(
+            object: TObject,
+            path: TKey | [TKey]
+        ): TObject[TKey];
+
+        /**
+         * @see _.get
+         */
+        get<TObject extends object, TKey extends keyof TObject>(
+            object: TObject | null | undefined,
+            path: TKey | [TKey]
+        ): TObject[TKey] | undefined;
+
+        /**
+         * @see _.get
+         */
+        get<TObject extends object, TKey extends keyof TObject, TDefault>(
+            object: TObject | null | undefined,
+            path: TKey | [TKey],
+            defaultValue: TDefault
+        ): TObject[TKey] | TDefault;
+
+        /**
+         * @see _.get
+         */
+        get<T>(
+            object: NumericDictionary<T>,
+            path: number
+        ): T;
+
+        /**
+         * @see _.get
+         */
+        get<T>(
+            object: NumericDictionary<T> | null | undefined,
+            path: number
+        ): T | undefined;
+
+        /**
+         * @see _.get
+         */
+        get<T, TDefault>(
+            object: NumericDictionary<T> | null | undefined,
+            path: number,
+            defaultValue: TDefault
+        ): T | TDefault;
+
+        /**
+         * @see _.get
+         */
+        get<TDefault>(
+            object: null | undefined,
+            path: PropertyPath,
+            defaultValue: TDefault
+        ): TDefault;
+
+        /**
+         * @see _.get
+         */
+        get(
+            object: null | undefined,
+            path: PropertyPath
+        ): undefined;
+
+        /**
+         * @see _.get
+         */
+        get(
+            object: any,
+            path: PropertyPath,
+            defaultValue?: any
+        ): any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.get
+         */
+        get<TKey extends keyof TValue>(
+            path: TKey | [TKey]
+        ): TValue[TKey];
+
+        /**
+         * @see _.get
+         */
+        get<TObject extends object, TKey extends keyof TObject>(
+            this: LoDashImplicitWrapper<TObject | null | undefined>,
+            path: TKey | [TKey],
+        ): TObject[TKey] | undefined;
+
+        /**
+         * @see _.get
+         */
+        get<TObject extends object, TKey extends keyof TObject, TDefault>(
+            this: LoDashImplicitWrapper<TObject | null | undefined>,
+            path: TKey | [TKey],
+            defaultValue: TDefault
+        ): TObject[TKey] | TDefault;
+
+        /**
+         * @see _.get
+         */
+        get<T>(
+            this: LoDashImplicitWrapper<NumericDictionary<T>>,
+            path: number
+        ): T;
+
+        /**
+         * @see _.get
+         */
+        get<T>(
+            this: LoDashImplicitWrapper<NumericDictionary<T> | null | undefined>,
+            path: number
+        ): T | undefined;
+
+        /**
+         * @see _.get
+         */
+        get<T, TDefault>(
+            this: LoDashImplicitWrapper<NumericDictionary<T> | null | undefined>,
+            path: number,
+            defaultValue: TDefault
+        ): T | TDefault;
+
+        /**
+         * @see _.get
+         */
+        get<TDefault>(
+            this: LoDashImplicitWrapper<null | undefined>,
+            path: PropertyPath,
+            defaultValue: TDefault
+        ): TDefault;
+
+        /**
+         * @see _.get
+         */
+        get(
+            this: LoDashImplicitWrapper<null | undefined>,
+            path: PropertyPath
+        ): undefined;
+
+        /**
+         * @see _.get
+         */
+        get<TResult>(
+            path: PropertyPath,
+            defaultValue?: any
+        ): any;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.get
+         */
+        get<TKey extends keyof TValue>(
+            path: TKey | [TKey]
+        ): LoDashExplicitWrapper<TValue[TKey]>;
+
+        /**
+         * @see _.get
+         */
+        get<TObject extends object, TKey extends keyof TObject>(
+            this: LoDashExplicitWrapper<TObject | null | undefined>,
+            path: TKey | [TKey],
+        ): LoDashExplicitWrapper<TObject[TKey] | undefined>;
+
+        /**
+         * @see _.get
+         */
+        get<TObject extends object, TKey extends keyof TObject, TDefault>(
+            this: LoDashExplicitWrapper<TObject | null | undefined>,
+            path: TKey | [TKey],
+            defaultValue: TDefault
+        ): LoDashExplicitWrapper<TObject[TKey] | TDefault>;
+
+        /**
+         * @see _.get
+         */
+        get<T>(
+            this: LoDashExplicitWrapper<NumericDictionary<T>>,
+            path: number
+        ): LoDashExplicitWrapper<T>;
+
+        /**
+         * @see _.get
+         */
+        get<T>(
+            this: LoDashExplicitWrapper<NumericDictionary<T> | null | undefined>,
+            path: number
+        ): LoDashExplicitWrapper<T | undefined>;
+
+        /**
+         * @see _.get
+         */
+        get<T, TDefault>(
+            this: LoDashExplicitWrapper<NumericDictionary<T> | null | undefined>,
+            path: number,
+            defaultValue: TDefault
+        ): LoDashExplicitWrapper<T | undefined>;
+
+        /**
+         * @see _.get
+         */
+        get<TDefault>(
+            this: LoDashExplicitWrapper<null | undefined>,
+            path: PropertyPath,
+            defaultValue: TDefault
+        ): LoDashExplicitWrapper<TDefault>;
+
+        /**
+         * @see _.get
+         */
+        get(
+            this: LoDashExplicitWrapper<null | undefined>,
+            path: PropertyPath
+        ): LoDashExplicitWrapper<undefined>;
+
+        /**
+         * @see _.get
+         */
+        get(
+            path: PropertyPath,
+            defaultValue?: any
+        ): LoDashExplicitWrapper<any>;
+    }
+
+    // has
+
+    interface LoDashStatic {
+        /**
+         * Checks if `path` is a direct property of `object`.
+         *
+         * @category Object
+         * @param object The object to query.
+         * @param path The path to check.
+         * @returns Returns `true` if `path` exists, else `false`.
+         * @example
+         *
+         * var object = { 'a': { 'b': { 'c': 3 } } };
+         * var other = _.create({ 'a': _.create({ 'b': _.create({ 'c': 3 }) }) });
+         *
+         * _.has(object, 'a');
+         * // => true
+         *
+         * _.has(object, 'a.b.c');
+         * // => true
+         *
+         * _.has(object, ['a', 'b', 'c']);
+         * // => true
+         *
+         * _.has(other, 'a');
+         * // => false
+         */
+        has<T>(
+            object: T,
+            path: PropertyPath
+        ): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.has
+         */
+        has(path: PropertyPath): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.has
+         */
+        has(path: PropertyPath): LoDashExplicitWrapper<boolean>;
+    }
+
+    // hasIn
+
+    interface LoDashStatic {
+        /**
+         * Checks if `path` is a direct or inherited property of `object`.
+         *
+         * @category Object
+         * @param object The object to query.
+         * @param path The path to check.
+         * @returns Returns `true` if `path` exists, else `false`.
+         * @example
+         *
+         * var object = _.create({ 'a': _.create({ 'b': _.create({ 'c': 3 }) }) });
+         *
+         * _.hasIn(object, 'a');
+         * // => true
+         *
+         * _.hasIn(object, 'a.b.c');
+         * // => true
+         *
+         * _.hasIn(object, ['a', 'b', 'c']);
+         * // => true
+         *
+         * _.hasIn(object, 'b');
+         * // => false
+         */
+        hasIn<T>(
+            object: T,
+            path: PropertyPath
+        ): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.hasIn
+         */
+        hasIn(path: PropertyPath): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.hasIn
+         */
+        hasIn(path: PropertyPath): LoDashExplicitWrapper<boolean>;
+    }
+
+    // invert
+
+    interface LoDashStatic {
+        /**
+         * Creates an object composed of the inverted keys and values of object. If object contains duplicate values,
+         * subsequent values overwrite property assignments of previous values unless multiValue is true.
+         *
+         * @param object The object to invert.
+         * @param multiValue Allow multiple values per key.
+         * @return Returns the new inverted object.
+         */
+        invert(
+            object: object
+        ): Dictionary<string>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.invert
+         */
+        invert(): LoDashImplicitWrapper<Dictionary<string>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.invert
+         */
+        invert(): LoDashExplicitWrapper<Dictionary<string>>;
+    }
+
+    // invertBy
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.invert except that the inverted object is generated from the results of running each
+         * element of object through iteratee. The corresponding inverted value of each inverted key is an array of
+         * keys responsible for generating the inverted value. The iteratee is invoked with one argument: (value).
+         *
+         * @param object The object to invert.
+         * @param interatee The iteratee invoked per element.
+         * @return Returns the new inverted object.
+         */
+        invertBy<T>(
+            object: List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined,
+            interatee?: ValueIteratee<T>
+        ): Dictionary<string[]>;
+
+        /**
+         * @see _.invertBy
+         */
+        invertBy<T extends object>(
+            object: T | null | undefined,
+            interatee?: ValueIteratee<T[keyof T]>
+        ): Dictionary<string[]>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.invertBy
+         */
+        invertBy<T>(
+            this: LoDashImplicitWrapper<List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            interatee?: ValueIteratee<T>
+        ): LoDashImplicitWrapper<Dictionary<string[]>>;
+
+        /**
+         * @see _.invertBy
+         */
+        invertBy<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            interatee?: ValueIteratee<T[keyof T]>
+        ): LoDashImplicitWrapper<Dictionary<string[]>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.invertBy
+         */
+        invertBy<T>(
+            this: LoDashExplicitWrapper<List<T> | Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            interatee?: ValueIteratee<T>
+        ): LoDashExplicitWrapper<Dictionary<string[]>>;
+
+        /**
+         * @see _.invertBy
+         */
+        invertBy<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            interatee?: ValueIteratee<T[keyof T]>
+        ): LoDashExplicitWrapper<Dictionary<string[]>>;
+    }
+
+    // invoke
+
+    interface LoDashStatic {
+        /**
+        * Invokes the method at path of object.
+        * @param object The object to query.
+        * @param path The path of the method to invoke.
+        * @param args The arguments to invoke the method with.
+        **/
+        invoke(
+            object: any,
+            path: PropertyPath,
+            ...args: any[]): any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+        * @see _.invoke
+        **/
+        invoke(
+            path: PropertyPath,
+            ...args: any[]): any;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+        * @see _.invoke
+        **/
+        invoke(
+            path: PropertyPath,
+            ...args: any[]): LoDashExplicitWrapper<any>;
+    }
+
+    // keys
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of the own enumerable property names of object.
+         *
+         * Note: Non-object values are coerced to objects. See the ES spec for more details.
+         *
+         * @param object The object to query.
+         * @return Returns the array of property names.
+         */
+        keys(object?: any): string[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.keys
+         */
+        keys(): LoDashImplicitWrapper<string[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.keys
+         */
+        keys(): LoDashExplicitWrapper<string[]>;
+    }
+
+    // keysIn
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of the own and inherited enumerable property names of object.
+         *
+         * Note: Non-object values are coerced to objects.
+         *
+         * @param object The object to query.
+         * @return An array of property names.
+         */
+        keysIn(object?: any): string[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.keysIn
+         */
+        keysIn(): LoDashImplicitWrapper<string[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.keysIn
+         */
+        keysIn(): LoDashExplicitWrapper<string[]>;
+    }
+
+    // mapKeys
+
+    interface LoDashStatic {
+        /**
+         * The opposite of _.mapValues; this method creates an object with the same values as object and keys generated
+         * by running each own enumerable property of object through iteratee.
+         *
+         * @param object The object to iterate over.
+         * @param iteratee The function invoked per iteration.
+         * @return Returns the new mapped object.
+         */
+        mapKeys<T>(
+            object: List<T> | null | undefined,
+            iteratee?: ListIteratee<T>
+        ): Dictionary<T>;
+
+        /**
+         * @see _.mapKeys
+         */
+        mapKeys<T extends object>(
+            object: T | null | undefined,
+            iteratee?: ObjectIteratee<T>
+        ): Dictionary<T[keyof T]>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.mapKeys
+         */
+        mapKeys<T>(
+            this: LoDashImplicitWrapper<List<T> | null | undefined>,
+            iteratee?: ListIteratee<T>
+        ): LoDashImplicitWrapper<Dictionary<T>>;
+
+        /**
+         * @see _.mapKeys
+         */
+        mapKeys<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            iteratee?: ObjectIteratee<T>
+        ): LoDashImplicitWrapper<Dictionary<T[keyof T]>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.mapKeys
+         */
+        mapKeys<T>(
+            this: LoDashExplicitWrapper<List<T> | null | undefined>,
+            iteratee?: ListIteratee<T>
+        ): LoDashExplicitWrapper<Dictionary<T>>;
+
+        /**
+         * @see _.mapKeys
+         */
+        mapKeys<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            iteratee?: ObjectIteratee<T>
+        ): LoDashExplicitWrapper<Dictionary<T[keyof T]>>;
+    }
+
+    // mapValues
+
+    interface LoDashStatic {
+        /**
+        * Creates an object with the same keys as object and values generated by running each own
+        * enumerable property of object through iteratee. The iteratee function is
+        * invoked with three arguments: (value, key, object).
+        *
+        * @param object The object to iterate over.
+        * @param iteratee  The function invoked per iteration.
+        * @return Returns the new mapped object.
+        */
+        mapValues<TResult>(obj: string | null | undefined, callback: StringIterator<TResult>): NumericDictionary<TResult>;
+
+        /**
+         * @see _.mapValues
+         * TODO: This would be better if we had a separate overload for obj: NumericDictionary that returned a NumericDictionary,
+         *       but TypeScript cannot select overload signatures based on number vs string index key type.
+         */
+        mapValues<T, TResult>(obj: Dictionary<T> | NumericDictionary<T> | null | undefined, callback: DictionaryIterator<T, TResult>): Dictionary<TResult>;
+
+        /**
+         * @see _.mapValues
+         */
+        mapValues<T extends object, TResult>(obj: T | null | undefined, callback: ObjectIterator<T, TResult>): { [P in keyof T]: TResult };
+
+        /**
+         * @see _.mapValues
+         * TODO: This would be better if we had a separate overload for obj: NumericDictionary that returned a NumericDictionary,
+         *       but TypeScript cannot select overload signatures based on number vs string index key type.
+         */
+        mapValues<T>(obj: Dictionary<T> | NumericDictionary<T> | null | undefined, iteratee: object): Dictionary<boolean>;
+
+        /**
+         * @see _.mapValues
+         */
+        mapValues<T extends object>(obj: T | null | undefined, iteratee: object): { [P in keyof T]: boolean };
+
+        /**
+         * @see _.mapValues
+         * TODO: This would be better if we had a separate overload for obj: NumericDictionary that returned a NumericDictionary,
+         *       but TypeScript cannot select overload signatures based on number vs string index key type.
+         */
+        mapValues<T, TKey extends keyof T>(obj: Dictionary<T> | NumericDictionary<T> | null | undefined, iteratee: TKey): Dictionary<T[TKey]>;
+
+        /**
+         * @see _.mapValues
+         * TODO: This would be better if we had a separate overload for obj: NumericDictionary that returned a NumericDictionary,
+         *       but TypeScript cannot select overload signatures based on number vs string index key type.
+         */
+        mapValues<T>(obj: Dictionary<T> | NumericDictionary<T> | null | undefined, iteratee: string): Dictionary<any>;
+
+        /**
+         * @see _.mapValues
+         */
+        mapValues<T extends object>(obj: T | null | undefined, iteratee: string): { [P in keyof T]: any };
+
+        /**
+         * @see _.mapValues
+         */
+        mapValues(obj: string | null | undefined): NumericDictionary<string>;
+
+        /**
+         * @see _.mapValues
+         * TODO: This would be better if we had a separate overload for obj: NumericDictionary that returned a NumericDictionary,
+         *       but TypeScript cannot select overload signatures based on number vs string index key type.
+         */
+        mapValues<T>(obj: Dictionary<T> | NumericDictionary<T> | null | undefined): Dictionary<T>;
+
+        /**
+         * @see _.mapValues
+         */
+        mapValues<T extends object>(obj: T): T;
+
+        /**
+         * @see _.mapValues
+         */
+        mapValues<T extends object>(obj: T | null | undefined): PartialObject<T>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.mapValues
+         */
+        mapValues<TResult>(
+            this: LoDashImplicitWrapper<string | null | undefined>,
+            callback: StringIterator<TResult>
+        ): LoDashImplicitWrapper<NumericDictionary<TResult>>;
+
+        /**
+         * @see _.mapValues
+         * TODO: This would be better if we had a separate overload for obj: NumericDictionary that returned a NumericDictionary,
+         *       but TypeScript cannot select overload signatures based on number vs string index key type.
+         */
+        mapValues<T, TResult>(
+            this: LoDashImplicitWrapper<Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            callback: DictionaryIterator<T, TResult>
+        ): LoDashImplicitWrapper<Dictionary<TResult>>;
+
+        /**
+         * @see _.mapValues
+         */
+        mapValues<T extends object, TResult>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            callback: ObjectIterator<T, TResult>
+        ): LoDashImplicitWrapper<{ [P in keyof T]: TResult }>;
+
+        /**
+         * @see _.mapValues
+         * TODO: This would be better if we had a separate overload for obj: NumericDictionary that returned a NumericDictionary,
+         *       but TypeScript cannot select overload signatures based on number vs string index key type.
+         */
+        mapValues<T>(
+            this: LoDashImplicitWrapper<Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            iteratee: object
+        ): LoDashImplicitWrapper<Dictionary<boolean>>;
+
+        /**
+         * @see _.mapValues
+         */
+        mapValues<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            iteratee: object
+        ): LoDashImplicitWrapper<{ [P in keyof T]: boolean }>;
+
+        /**
+         * @see _.mapValues
+         * TODO: This would be better if we had a separate overload for obj: NumericDictionary that returned a NumericDictionary,
+         *       but TypeScript cannot select overload signatures based on number vs string index key type.
+         */
+        mapValues<T, TKey extends keyof T>(
+            this: LoDashImplicitWrapper<Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            iteratee: TKey
+        ): LoDashImplicitWrapper<Dictionary<T[TKey]>>;
+
+        /**
+         * @see _.mapValues
+         * TODO: This would be better if we had a separate overload for obj: NumericDictionary that returned a NumericDictionary,
+         *       but TypeScript cannot select overload signatures based on number vs string index key type.
+         */
+        mapValues<T>(
+            this: LoDashImplicitWrapper<Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            iteratee: string
+        ): LoDashImplicitWrapper<Dictionary<any>>;
+
+        /**
+         * @see _.mapValues
+         */
+        mapValues<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            iteratee: string
+        ): LoDashImplicitWrapper<{ [P in keyof T]: any }>;
+
+        /**
+         * @see _.mapValues
+         */
+        mapValues(this: LoDashImplicitWrapper<string | null | undefined>): LoDashImplicitWrapper<NumericDictionary<string>>;
+
+        /**
+         * @see _.mapValues
+         * TODO: This would be better if we had a separate overload for obj: NumericDictionary that returned a NumericDictionary,
+         *       but TypeScript cannot select overload signatures based on number vs string index key type.
+         */
+        mapValues<T>(this: LoDashImplicitWrapper<Dictionary<T> | NumericDictionary<T> | null | undefined>): LoDashImplicitWrapper<Dictionary<T>>;
+
+        /**
+         * @see _.mapValues
+         */
+        mapValues<T extends object>(this: LoDashImplicitWrapper<T>): LoDashImplicitWrapper<T>;
+
+        /**
+         * @see _.mapValues
+         */
+        mapValues<T extends object>(this: LoDashImplicitWrapper<T | null | undefined>): LoDashImplicitWrapper<PartialObject<T>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.mapValues
+         */
+        mapValues<TResult>(
+            this: LoDashExplicitWrapper<string | null | undefined>,
+            callback: StringIterator<TResult>
+        ): LoDashExplicitWrapper<NumericDictionary<TResult>>;
+
+        /**
+         * @see _.mapValues
+         * TODO: This would be better if we had a separate overload for obj: NumericDictionary that returned a NumericDictionary,
+         *       but TypeScript cannot select overload signatures based on number vs string index key type.
+         */
+        mapValues<T, TResult>(
+            this: LoDashExplicitWrapper<Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            callback: DictionaryIterator<T, TResult>
+        ): LoDashExplicitWrapper<Dictionary<TResult>>;
+
+        /**
+         * @see _.mapValues
+         */
+        mapValues<T extends object, TResult>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            callback: ObjectIterator<T, TResult>
+        ): LoDashExplicitWrapper<{ [P in keyof T]: TResult }>;
+
+        /**
+         * @see _.mapValues
+         * TODO: This would be better if we had a separate overload for obj: NumericDictionary that returned a NumericDictionary,
+         *       but TypeScript cannot select overload signatures based on number vs string index key type.
+         */
+        mapValues<T>(
+            this: LoDashExplicitWrapper<Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            iteratee: object
+        ): LoDashExplicitWrapper<Dictionary<boolean>>;
+
+        /**
+         * @see _.mapValues
+         */
+        mapValues<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            iteratee: object
+        ): LoDashExplicitWrapper<{ [P in keyof T]: boolean }>;
+
+        /**
+         * @see _.mapValues
+         * TODO: This would be better if we had a separate overload for obj: NumericDictionary that returned a NumericDictionary,
+         *       but TypeScript cannot select overload signatures based on number vs string index key type.
+         */
+        mapValues<T, TKey extends keyof T>(
+            this: LoDashExplicitWrapper<Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            iteratee: TKey
+        ): LoDashExplicitWrapper<Dictionary<T[TKey]>>;
+
+        /**
+         * @see _.mapValues
+         * TODO: This would be better if we had a separate overload for obj: NumericDictionary that returned a NumericDictionary,
+         *       but TypeScript cannot select overload signatures based on number vs string index key type.
+         */
+        mapValues<T>(
+            this: LoDashExplicitWrapper<Dictionary<T> | NumericDictionary<T> | null | undefined>,
+            iteratee: string
+        ): LoDashExplicitWrapper<Dictionary<any>>;
+
+        /**
+         * @see _.mapValues
+         */
+        mapValues<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            iteratee: string
+        ): LoDashExplicitWrapper<{ [P in keyof T]: any }>;
+
+        /**
+         * @see _.mapValues
+         */
+        mapValues(this: LoDashExplicitWrapper<string | null | undefined>): LoDashExplicitWrapper<NumericDictionary<string>>;
+
+        /**
+         * @see _.mapValues
+         * TODO: This would be better if we had a separate overload for obj: NumericDictionary that returned a NumericDictionary,
+         *       but TypeScript cannot select overload signatures based on number vs string index key type.
+         */
+        mapValues<T>(this: LoDashExplicitWrapper<Dictionary<T> | NumericDictionary<T> | null | undefined>): LoDashExplicitWrapper<Dictionary<T>>;
+
+        /**
+         * @see _.mapValues
+         */
+        mapValues<T extends object>(this: LoDashExplicitWrapper<T>): LoDashExplicitWrapper<T>;
+
+        /**
+         * @see _.mapValues
+         */
+        mapValues<T extends object>(this: LoDashExplicitWrapper<T | null | undefined>): LoDashExplicitWrapper<PartialObject<T>>;
+    }
+
+    // merge
+
+    interface LoDashStatic {
+        /**
+         * Recursively merges own and inherited enumerable properties of source
+         * objects into the destination object, skipping source properties that resolve
+         * to `undefined`. Array and plain object properties are merged recursively.
+         * Other objects and value types are overridden by assignment. Source objects
+         * are applied from left to right. Subsequent sources overwrite property
+         * assignments of previous sources.
+         *
+         * **Note:** This method mutates `object`.
+         *
+         * @category Object
+         * @param object The destination object.
+         * @param [sources] The source objects.
+         * @returns Returns `object`.
+         * @example
+         *
+         * var users = {
+         *   'data': [{ 'user': 'barney' }, { 'user': 'fred' }]
+         * };
+         *
+         * var ages = {
+         *   'data': [{ 'age': 36 }, { 'age': 40 }]
+         * };
+         *
+         * _.merge(users, ages);
+         * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }
+         */
+        merge<TObject, TSource>(
+            object: TObject,
+            source: TSource
+        ): TObject & TSource;
+
+        /**
+         * @see _.merge
+         */
+        merge<TObject, TSource1, TSource2>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2
+        ): TObject & TSource1 & TSource2;
+
+        /**
+         * @see _.merge
+         */
+        merge<TObject, TSource1, TSource2, TSource3>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3
+        ): TObject & TSource1 & TSource2 & TSource3;
+
+        /**
+         * @see _.merge
+         */
+        merge<TObject, TSource1, TSource2, TSource3, TSource4>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4
+        ): TObject & TSource1 & TSource2 & TSource3 & TSource4;
+
+        /**
+         * @see _.merge
+         */
+        merge(
+            object: any,
+            ...otherArgs: any[]
+        ): any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.merge
+         */
+        merge<TSource>(
+            source: TSource
+        ): LoDashImplicitWrapper<TValue & TSource>;
+
+        /**
+         * @see _.merge
+         */
+        merge<TSource1, TSource2>(
+            source1: TSource1,
+            source2: TSource2
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2>;
+
+        /**
+         * @see _.merge
+         */
+        merge<TSource1, TSource2, TSource3>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2 & TSource3>;
+
+        /**
+         * @see _.merge
+         */
+        merge<TSource1, TSource2, TSource3, TSource4>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2 & TSource3 & TSource4>;
+
+        /**
+         * @see _.merge
+         */
+        merge(
+            ...otherArgs: any[]
+        ): LoDashImplicitWrapper<any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.merge
+         */
+        merge<TSource>(
+            source: TSource
+        ): LoDashExplicitWrapper<TValue & TSource>;
+
+        /**
+         * @see _.merge
+         */
+        merge<TSource1, TSource2>(
+            source1: TSource1,
+            source2: TSource2
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2>;
+
+        /**
+         * @see _.merge
+         */
+        merge<TSource1, TSource2, TSource3>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2 & TSource3>;
+
+        /**
+         * @see _.merge
+         */
+        merge<TSource1, TSource2, TSource3, TSource4>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2 & TSource3 & TSource4>;
+
+        /**
+         * @see _.merge
+         */
+        merge(
+            ...otherArgs: any[]
+        ): LoDashExplicitWrapper<any>;
+    }
+
+    // mergeWith
+
+    type MergeWithCustomizer = { bivariantHack(value: any, srcValue: any, key: string, object: any, source: any): any; }["bivariantHack"];
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.merge` except that it accepts `customizer` which
+         * is invoked to produce the merged values of the destination and source
+         * properties. If `customizer` returns `undefined` merging is handled by the
+         * method instead. The `customizer` is invoked with seven arguments:
+         * (objValue, srcValue, key, object, source, stack).
+         *
+         * @category Object
+         * @param object The destination object.
+         * @param sources The source objects.
+         * @param customizer The function to customize assigned values.
+         * @returns Returns `object`.
+         * @example
+         *
+         * function customizer(objValue, srcValue) {
+         *   if (_.isArray(objValue)) {
+         *     return objValue.concat(srcValue);
+         *   }
+         * }
+         *
+         * var object = {
+         *   'fruits': ['apple'],
+         *   'vegetables': ['beet']
+         * };
+         *
+         * var other = {
+         *   'fruits': ['banana'],
+         *   'vegetables': ['carrot']
+         * };
+         *
+         * _.merge(object, other, customizer);
+         * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }
+         */
+        mergeWith<TObject, TSource>(
+            object: TObject,
+            source: TSource,
+            customizer: MergeWithCustomizer
+        ): TObject & TSource;
+
+        /**
+         * @see _.mergeWith
+         */
+        mergeWith<TObject, TSource1, TSource2>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            customizer: MergeWithCustomizer
+        ): TObject & TSource1 & TSource2;
+
+        /**
+         * @see _.mergeWith
+         */
+        mergeWith<TObject, TSource1, TSource2, TSource3>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            customizer: MergeWithCustomizer
+        ): TObject & TSource1 & TSource2 & TSource3;
+
+        /**
+         * @see _.mergeWith
+         */
+        mergeWith<TObject, TSource1, TSource2, TSource3, TSource4>(
+            object: TObject,
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4,
+            customizer: MergeWithCustomizer
+        ): TObject & TSource1 & TSource2 & TSource3 & TSource4;
+
+        /**
+         * @see _.mergeWith
+         */
+        mergeWith(
+            object: any,
+            ...otherArgs: any[]
+        ): any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.mergeWith
+         */
+        mergeWith<TSource>(
+            source: TSource,
+            customizer: MergeWithCustomizer
+        ): LoDashImplicitWrapper<TValue & TSource>;
+
+        /**
+         * @see _.mergeWith
+         */
+        mergeWith<TSource1, TSource2>(
+            source1: TSource1,
+            source2: TSource2,
+            customizer: MergeWithCustomizer
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2>;
+
+        /**
+         * @see _.mergeWith
+         */
+        mergeWith<TSource1, TSource2, TSource3>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            customizer: MergeWithCustomizer
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2 & TSource3>;
+
+        /**
+         * @see _.mergeWith
+         */
+        mergeWith<TSource1, TSource2, TSource3, TSource4>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4,
+            customizer: MergeWithCustomizer
+        ): LoDashImplicitWrapper<TValue & TSource1 & TSource2 & TSource3 & TSource4>;
+
+        /**
+         * @see _.mergeWith
+         */
+        mergeWith(
+            ...otherArgs: any[]
+        ): LoDashImplicitWrapper<any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.mergeWith
+         */
+        mergeWith<TSource>(
+            source: TSource,
+            customizer: MergeWithCustomizer
+        ): LoDashExplicitWrapper<TValue & TSource>;
+
+        /**
+         * @see _.mergeWith
+         */
+        mergeWith<TSource1, TSource2>(
+            source1: TSource1,
+            source2: TSource2,
+            customizer: MergeWithCustomizer
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2>;
+
+        /**
+         * @see _.mergeWith
+         */
+        mergeWith<TSource1, TSource2, TSource3>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            customizer: MergeWithCustomizer
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2 & TSource3>;
+
+        /**
+         * @see _.mergeWith
+         */
+        mergeWith<TSource1, TSource2, TSource3, TSource4>(
+            source1: TSource1,
+            source2: TSource2,
+            source3: TSource3,
+            source4: TSource4,
+            customizer: MergeWithCustomizer
+        ): LoDashExplicitWrapper<TValue & TSource1 & TSource2 & TSource3 & TSource4>;
+
+        /**
+         * @see _.mergeWith
+         */
+        mergeWith(
+            ...otherArgs: any[]
+        ): LoDashExplicitWrapper<any>;
+    }
+
+    // omit
+
+    interface LoDashStatic {
+        /**
+         * The opposite of `_.pick`; this method creates an object composed of the
+         * own and inherited enumerable properties of `object` that are not omitted.
+         *
+         * @category Object
+         * @param object The source object.
+         * @param [paths] The property names to omit, specified
+         *  individually or in arrays..
+         * @returns Returns the new object.
+         * @example
+         *
+         * var object = { 'a': 1, 'b': '2', 'c': 3 };
+         *
+         * _.omit(object, ['a', 'c']);
+         * // => { 'b': '2' }
+         */
+        omit<T extends AnyKindOfDictionary>(
+            object: T | null | undefined,
+            ...paths: Array<Many<PropertyName>>
+        ): T;
+
+        /**
+         * @see _.omit
+         */
+        omit<T extends object, K extends keyof T>(
+            object: T | null | undefined,
+            ...paths: Array<Many<K>>
+        ): Omit<T, K>;
+
+        /**
+         * @see _.omit
+         */
+        omit<T extends object>(
+            object: T | null | undefined,
+            ...paths: Array<Many<PropertyName>>
+        ): PartialObject<T>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.omit
+         */
+        omit<T extends AnyKindOfDictionary>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            ...paths: Array<Many<PropertyName>>
+        ): LoDashImplicitWrapper<T>;
+
+        /**
+         * @see _.omit
+         */
+        omit<T extends object, K extends keyof T>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            ...paths: Array<Many<K>>
+        ): LoDashImplicitWrapper<Omit<T, K>>;
+
+        /**
+         * @see _.omit
+         */
+        omit<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            ...paths: Array<Many<PropertyName>>
+        ): LoDashImplicitWrapper<PartialObject<T>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.omit
+         */
+        omit<T extends AnyKindOfDictionary>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            ...paths: Array<Many<PropertyName>>
+        ): LoDashExplicitWrapper<T>;
+
+        /**
+         * @see _.omit
+         */
+        omit<T extends object, K extends keyof T>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            ...paths: Array<Many<K>>
+        ): LoDashExplicitWrapper<Omit<T, K>>;
+
+        /**
+         * @see _.omit
+         */
+        omit<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            ...paths: Array<Many<PropertyName>>
+        ): LoDashExplicitWrapper<PartialObject<T>>;
+    }
+
+    // omitBy
+
+    interface LoDashStatic {
+        /**
+         * The opposite of `_.pickBy`; this method creates an object composed of the
+         * own and inherited enumerable properties of `object` that `predicate`
+         * doesn't return truthy for.
+         *
+         * @category Object
+         * @param object The source object.
+         * @param [predicate=_.identity] The function invoked per property.
+         * @returns Returns the new object.
+         * @example
+         *
+         * var object = { 'a': 1, 'b': '2', 'c': 3 };
+         *
+         * _.omitBy(object, _.isNumber);
+         * // => { 'b': '2' }
+         */
+        omitBy<T extends object>(
+            object: T | null | undefined,
+            predicate: ValueKeyIteratee<T[keyof T]>
+        ): PartialObject<T>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.omitBy
+         */
+        omitBy<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            predicate: ValueKeyIteratee<T[keyof T]>
+        ): LoDashImplicitWrapper<PartialObject<T>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.omitBy
+         */
+        omitBy<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            predicate: ValueKeyIteratee<T[keyof T]>
+        ): LoDashExplicitWrapper<PartialObject<T>>;
+    }
+
+    // pick
+
+    interface LoDashStatic {
+        /**
+         * Creates an object composed of the picked `object` properties.
+         *
+         * @category Object
+         * @param object The source object.
+         * @param [props] The property names to pick, specified
+         *  individually or in arrays.
+         * @returns Returns the new object.
+         * @example
+         *
+         * var object = { 'a': 1, 'b': '2', 'c': 3 };
+         *
+         * _.pick(object, ['a', 'c']);
+         * // => { 'a': 1, 'c': 3 }
+         */
+        pick<T extends object, U extends keyof T>(
+            object: T,
+             ...props: Array<Many<U>>
+        ): Pick<T, U>;
+
+        /**
+         * @see _.pick
+         */
+        pick<T>(
+            object: T | null | undefined,
+            ...props: PropertyPath[]
+        ): PartialDeep<T>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.pick
+         */
+        pick<T extends object, U extends keyof T>(
+            this: LoDashImplicitWrapper<T>,
+            ...props: Array<Many<U>>
+        ): LoDashImplicitWrapper<Pick<T, U>>;
+
+        /**
+         * @see _.pick
+         */
+        pick<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            ...props: PropertyPath[]
+        ): LoDashImplicitWrapper<PartialObject<T>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.pick
+         */
+        pick<T extends object, U extends keyof T>(
+            this: LoDashExplicitWrapper<T>,
+            ...props: Array<Many<U>>
+        ): LoDashExplicitWrapper<Pick<T, U>>;
+
+        /**
+         * @see _.pick
+         */
+        pick<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            ...props: PropertyPath[]
+        ): LoDashExplicitWrapper<PartialObject<T>>;
+    }
+
+    // pickBy
+
+    interface LoDashStatic {
+        /**
+         * Creates an object composed of the `object` properties `predicate` returns
+         * truthy for. The predicate is invoked with two arguments: (value, key).
+         *
+         * @category Object
+         * @param object The source object.
+         * @param [predicate=_.identity] The function invoked per property.
+         * @returns Returns the new object.
+         * @example
+         *
+         * var object = { 'a': 1, 'b': '2', 'c': 3 };
+         *
+         * _.pickBy(object, _.isNumber);
+         * // => { 'a': 1, 'c': 3 }
+         */
+        pickBy<T extends object>(
+            object: T | null | undefined,
+            predicate?: ValueKeyIteratee<T[keyof T]>
+        ): PartialObject<T>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.pickBy
+         */
+        pickBy<T extends object>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            predicate?: ValueKeyIteratee<T[keyof T]>
+        ): LoDashImplicitWrapper<PartialObject<T>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.pickBy
+         */
+        pickBy<T extends object>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            predicate?: ValueKeyIteratee<T[keyof T]>
+        ): LoDashExplicitWrapper<PartialObject<T>>;
+    }
+
+    // result
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.get except that if the resolved value is a function it’s invoked with the this binding
+         * of its parent object and its result is returned.
+         *
+         * @param object The object to query.
+         * @param path The path of the property to resolve.
+         * @param defaultValue The value returned if the resolved value is undefined.
+         * @return Returns the resolved value.
+         */
+        result<TResult>(
+            object: any,
+            path: PropertyPath,
+            defaultValue?: TResult|((...args: any[]) => TResult)
+        ): TResult;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.result
+         */
+        result<TResult>(
+            path: PropertyPath,
+            defaultValue?: TResult|((...args: any[]) => TResult)
+        ): TResult;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.result
+         */
+        result<TResult>(
+            path: PropertyPath,
+            defaultValue?: TResult|((...args: any[]) => TResult)
+        ): LoDashExplicitWrapper<TResult>;
+    }
+
+    // set
+
+    interface LoDashStatic {
+        /**
+         * Sets the value at path of object. If a portion of path doesn’t exist it’s created. Arrays are created for
+         * missing index properties while objects are created for all other missing properties. Use _.setWith to
+         * customize path creation.
+         *
+         * @param object The object to modify.
+         * @param path The path of the property to set.
+         * @param value The value to set.
+         * @return Returns object.
+         */
+        set<T extends object>(
+            object: T,
+            path: PropertyPath,
+            value: any
+        ): T;
+
+        /**
+         * @see _.set
+         */
+        set<TResult>(
+            object: object,
+            path: PropertyPath,
+            value: any
+        ): TResult;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.set
+         */
+        set(
+            path: PropertyPath,
+            value: any
+        ): this;
+
+        /**
+         * @see _.set
+         */
+        set<TResult>(
+            path: PropertyPath,
+            value: any
+        ): LoDashImplicitWrapper<TResult>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.set
+         */
+        set(
+            path: PropertyPath,
+            value: any
+        ): this;
+
+        /**
+         * @see _.set
+         */
+        set<TResult>(
+            path: PropertyPath,
+            value: any
+        ): LoDashExplicitWrapper<TResult>;
+    }
+
+    // setWith
+
+    type SetWithCustomizer<T> = (nsValue: any, key: string, nsObject: T) => any;
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.set except that it accepts customizer which is invoked to produce the objects of
+         * path. If customizer returns undefined path creation is handled by the method instead. The customizer is
+         * invoked with three arguments: (nsValue, key, nsObject).
+         *
+         * @param object The object to modify.
+         * @param path The path of the property to set.
+         * @param value The value to set.
+         * @param customizer The function to customize assigned values.
+         * @return Returns object.
+         */
+        setWith<T extends object>(
+            object: T,
+            path: PropertyPath,
+            value: any,
+            customizer?: SetWithCustomizer<T>
+        ): T;
+
+        setWith<T extends object, TResult>(
+            object: T,
+            path: PropertyPath,
+            value: any,
+            customizer?: SetWithCustomizer<T>
+        ): TResult;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.setWith
+         */
+        setWith(
+            path: PropertyPath,
+            value: any,
+            customizer?: SetWithCustomizer<TValue>
+        ): this;
+
+        /**
+         * @see _.setWith
+         */
+        setWith<TResult>(
+            path: PropertyPath,
+            value: any,
+            customizer?: SetWithCustomizer<TValue>
+        ): LoDashImplicitWrapper<TResult>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.setWith
+         */
+        setWith(
+            path: PropertyPath,
+            value: any,
+            customizer?: SetWithCustomizer<TValue>
+        ): this;
+
+        /**
+         * @see _.setWith
+         */
+        setWith<TResult>(
+            path: PropertyPath,
+            value: any,
+            customizer?: SetWithCustomizer<TValue>
+        ): LoDashExplicitWrapper<TResult>;
+    }
+
+    // toPairs
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of own enumerable key-value pairs for object.
+         *
+         * @param object The object to query.
+         * @return Returns the new array of key-value pairs.
+         */
+        toPairs<T>(object?: Dictionary<T> | NumericDictionary<T>): Array<[string, T]>;
+
+        /**
+         * @see _.toPairs
+         */
+        toPairs(object?: object): Array<[string, any]>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.toPairs
+         */
+        toPairs<T>(this: LoDashImplicitWrapper<Dictionary<T> | NumericDictionary<T>>): LoDashImplicitWrapper<Array<[string, T]>>;
+
+        /**
+         * @see _.toPairs
+         */
+        toPairs(): LoDashImplicitWrapper<Array<[string, any]>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.toPairs
+         */
+        toPairs<T>(this: LoDashExplicitWrapper<Dictionary<T> | NumericDictionary<T>>): LoDashExplicitWrapper<Array<[string, T]>>;
+
+        /**
+         * @see _.toPairs
+         */
+        toPairs(): LoDashExplicitWrapper<Array<[string, any]>>;
+    }
+
+    // toPairsIn
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of own and inherited enumerable key-value pairs for object.
+         *
+         * @param object The object to query.
+         * @return Returns the new array of key-value pairs.
+         */
+        toPairsIn<T>(object?: Dictionary<T> | NumericDictionary<T>): Array<[string, T]>;
+
+        /**
+         * @see _.toPairsIn
+         */
+        toPairsIn(object?: object): Array<[string, any]>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.toPairsIn
+         */
+        toPairsIn<T>(this: LoDashImplicitWrapper<Dictionary<T> | NumericDictionary<T>>): LoDashImplicitWrapper<Array<[string, T]>>;
+
+        /**
+         * @see _.toPairsIn
+         */
+        toPairsIn(): LoDashImplicitWrapper<Array<[string, any]>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.toPairsIn
+         */
+        toPairsIn<T>(this: LoDashExplicitWrapper<Dictionary<T> | NumericDictionary<T>>): LoDashExplicitWrapper<Array<[string, T]>>;
+
+        /**
+         * @see _.toPairsIn
+         */
+        toPairsIn(): LoDashExplicitWrapper<Array<[string, any]>>;
+    }
+
+    // transform
+
+    interface LoDashStatic {
+        /**
+         * An alternative to _.reduce; this method transforms object to a new accumulator object which is the result of
+         * running each of its own enumerable properties through iteratee, with each invocation potentially mutating
+         * the accumulator object. The iteratee is invoked with four arguments: (accumulator,
+         * value, key, object). Iteratee functions may exit iteration early by explicitly returning false.
+         *
+         * @param object The object to iterate over.
+         * @param iteratee The function invoked per iteration.
+         * @param accumulator The custom accumulator value.
+         * @return Returns the accumulated value.
+         */
+        transform<T, TResult>(
+            object: T[],
+            iteratee: MemoVoidArrayIterator<T, TResult[]>,
+            accumulator?: TResult[]
+        ): TResult[];
+
+        /**
+         * @see _.transform
+         */
+        transform<T, TResult>(
+            object: T[],
+            iteratee: MemoVoidArrayIterator<T, Dictionary<TResult>>,
+            accumulator: Dictionary<TResult>
+        ): Dictionary<TResult>;
+
+        /**
+         * @see _.transform
+         */
+        transform<T, TResult>(
+            object: Dictionary<T>,
+            iteratee: MemoVoidDictionaryIterator<T, Dictionary<TResult>>,
+            accumulator?: Dictionary<TResult>
+        ): Dictionary<TResult>;
+
+        /**
+         * @see _.transform
+         */
+        transform<T, TResult>(
+            object: Dictionary<T>,
+            iteratee: MemoVoidDictionaryIterator<T, TResult[]>,
+            accumulator: TResult[]
+        ): TResult[];
+
+        /**
+         * @see _.transform
+         */
+        transform(
+            object: any[],
+        ): any[];
+
+        /**
+         * @see _.transform
+         */
+        transform(
+            object: object,
+        ): Dictionary<any>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.transform
+         */
+        transform<T, TResult>(
+            this: LoDashImplicitWrapper<T[]>,
+            iteratee: MemoVoidArrayIterator<T, TResult[]>,
+            accumulator?: TResult[]
+        ): LoDashImplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.transform
+         */
+        transform<T, TResult>(
+            this: LoDashImplicitWrapper<T[]>,
+            iteratee: MemoVoidArrayIterator<T, Dictionary<TResult>>,
+            accumulator: Dictionary<TResult>
+        ): LoDashImplicitWrapper<Dictionary<TResult>>;
+
+        /**
+         * @see _.transform
+         */
+        transform<T, TResult>(
+            this: LoDashImplicitWrapper<Dictionary<T>>,
+            iteratee: MemoVoidDictionaryIterator<T, Dictionary<TResult>>,
+            accumulator?: Dictionary<TResult>
+        ): LoDashImplicitWrapper<Dictionary<TResult>>;
+
+        /**
+         * @see _.transform
+         */
+        transform<T, TResult>(
+            this: LoDashImplicitWrapper<Dictionary<T>>,
+            iteratee: MemoVoidDictionaryIterator<T, TResult[]>,
+            accumulator: TResult[]
+        ): LoDashImplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.transform
+         */
+        transform(
+            this: LoDashImplicitWrapper<any[]>,
+        ): LoDashImplicitWrapper<any[]>;
+
+        /**
+         * @see _.transform
+         */
+        transform(): LoDashImplicitWrapper<Dictionary<any>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.transform
+         */
+        transform<T, TResult>(
+            this: LoDashExplicitWrapper<T[]>,
+            iteratee: MemoVoidArrayIterator<T, TResult[]>,
+            accumulator?: TResult[]
+        ): LoDashExplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.transform
+         */
+        transform<T, TResult>(
+            this: LoDashExplicitWrapper<T[]>,
+            iteratee: MemoVoidArrayIterator<T, Dictionary<TResult>>,
+            accumulator?: Dictionary<TResult>
+        ): LoDashExplicitWrapper<Dictionary<TResult>>;
+
+        /**
+         * @see _.transform
+         */
+        transform<T, TResult>(
+            this: LoDashExplicitWrapper<Dictionary<T>>,
+            iteratee: MemoVoidDictionaryIterator<T, Dictionary<TResult>>,
+            accumulator?: Dictionary<TResult>
+        ): LoDashExplicitWrapper<Dictionary<TResult>>;
+
+        /**
+         * @see _.transform
+         */
+        transform<T, TResult>(
+            this: LoDashExplicitWrapper<Dictionary<T>>,
+            iteratee: MemoVoidDictionaryIterator<T, TResult[]>,
+            accumulator?: TResult[]
+        ): LoDashExplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.transform
+         */
+        transform(
+            this: LoDashExplicitWrapper<any[]>,
+        ): LoDashExplicitWrapper<any[]>;
+
+        /**
+         * @see _.transform
+         */
+        transform(): LoDashExplicitWrapper<Dictionary<any>>;
+    }
+
+    // unset
+
+    interface LoDashStatic {
+        /**
+         * Removes the property at path of object.
+         *
+         * Note: This method mutates object.
+         *
+         * @param object The object to modify.
+         * @param path The path of the property to unset.
+         * @return Returns true if the property is deleted, else false.
+         */
+        unset(
+            object: any,
+            path: PropertyPath
+        ): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.unset
+         */
+        unset(path: PropertyPath): LoDashImplicitWrapper<boolean>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.unset
+         */
+        unset(path: PropertyPath): LoDashExplicitWrapper<boolean>;
+    }
+
+    // update
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.set except that accepts updater to produce the value to set. Use _.updateWith to
+         * customize path creation. The updater is invoked with one argument: (value).
+         *
+         * @param object The object to modify.
+         * @param path The path of the property to set.
+         * @param updater The function to produce the updated value.
+         * @return Returns object.
+         */
+        update(
+            object: object,
+            path: PropertyPath,
+            updater: (value: any) => any
+        ): any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.update
+         */
+        update(
+            path: PropertyPath,
+            updater: (value: any) => any
+        ): LoDashImplicitWrapper<any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.update
+         */
+        update(
+            path: PropertyPath,
+            updater: (value: any) => any
+        ): LoDashExplicitWrapper<any>;
+    }
+
+    // updateWith
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.update` except that it accepts `customizer` which is
+         * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
+         * path creation is handled by the method instead. The `customizer` is invoked
+         * with three arguments: (nsValue, key, nsObject).
+         *
+         * **Note:** This method mutates `object`.
+         *
+         * @since 4.6.0
+         * @category Object
+         * @param object The object to modify.
+         * @param path The path of the property to set.
+         * @param updater The function to produce the updated value.
+         * @param [customizer] The function to customize assigned values.
+         * @returns Returns `object`.
+         * @example
+         *
+         * var object = {};
+         *
+         * _.updateWith(object, '[0][1]', _.constant('a'), Object);
+         * // => { '0': { '1': 'a' } }
+         */
+        updateWith<T extends object>(
+            object: T,
+            path: PropertyPath,
+            updater: (oldValue: any) => any,
+            customizer?: SetWithCustomizer<T>
+        ): T;
+
+        /**
+         * @see _.updateWith
+         */
+        updateWith<T extends object, TResult>(
+            object: T,
+            path: PropertyPath,
+            updater: (oldValue: any) => any,
+            customizer?: SetWithCustomizer<T>
+        ): TResult;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.updateWith
+         */
+        updateWith(
+            path: PropertyPath,
+            updater: (oldValue: any) => any,
+            customizer?: SetWithCustomizer<TValue>
+        ): this;
+
+        /**
+         * @see _.updateWith
+         */
+        updateWith<TResult>(
+            path: PropertyPath,
+            updater: (oldValue: any) => any,
+            customizer?: SetWithCustomizer<TValue>
+        ): LoDashImplicitWrapper<TResult>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.updateWith
+         */
+        updateWith(
+            path: PropertyPath,
+            updater: (oldValue: any) => any,
+            customizer?: SetWithCustomizer<TValue>
+        ): this;
+
+        /**
+         * @see _.updateWith
+         */
+        updateWith<TResult>(
+            path: PropertyPath,
+            updater: (oldValue: any) => any,
+            customizer?: SetWithCustomizer<TValue>
+        ): LoDashExplicitWrapper<TResult>;
+    }
+
+    // values
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of the own enumerable property values of object.
+         *
+         * @param object The object to query.
+         * @return Returns an array of property values.
+         */
+        values<T>(object: Dictionary<T> | NumericDictionary<T> | List<T> | null | undefined): T[];
+
+        /**
+         * @see _.values
+         */
+        values<T extends object>(object: T | null | undefined): Array<T[keyof T]>;
+
+        /**
+         * @see _.values
+         */
+        values(object: any): any[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.values
+         */
+        values<T>(this: LoDashImplicitWrapper<Dictionary<T> | NumericDictionary<T> | List<T> | null | undefined>): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.values
+         */
+        values<T extends object>(this: LoDashImplicitWrapper<T | null | undefined>): LoDashImplicitWrapper<Array<T[keyof T]>>;
+
+        /**
+         * @see _.values
+         */
+        values(): LoDashImplicitWrapper<any[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.values
+         */
+        values<T>(this: LoDashExplicitWrapper<Dictionary<T> | NumericDictionary<T> | List<T> | null | undefined>): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.values
+         */
+        values<T extends object>(this: LoDashExplicitWrapper<T | null | undefined>): LoDashExplicitWrapper<Array<T[keyof T]>>;
+
+        /**
+         * @see _.values
+         */
+        values(): LoDashExplicitWrapper<any[]>;
+    }
+
+    // valuesIn
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of the own and inherited enumerable property values of object.
+         *
+         * @param object The object to query.
+         * @return Returns the array of property values.
+         */
+        valuesIn<T>(object: Dictionary<T>|NumericDictionary<T>|List<T> | null | undefined): T[];
+
+        /**
+         * @see _.valuesIn
+         */
+        valuesIn<T extends object>(object: T | null | undefined): Array<T[keyof T]>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.valuesIn
+         */
+        valuesIn<T>(this: LoDashImplicitWrapper<Dictionary<T> | NumericDictionary<T> | List<T> | null | undefined>): LoDashImplicitWrapper<T[]>;
+
+        /**
+         * @see _.valuesIn
+         */
+        valuesIn<T extends object>(this: LoDashImplicitWrapper<T | null | undefined>): LoDashImplicitWrapper<Array<T[keyof T]>>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.valuesIn
+         */
+        valuesIn<T>(this: LoDashExplicitWrapper<Dictionary<T> | NumericDictionary<T> | List<T> | null | undefined>): LoDashExplicitWrapper<T[]>;
+
+        /**
+         * @see _.valuesIn
+         */
+        valuesIn<T extends object>(this: LoDashExplicitWrapper<T | null | undefined>): LoDashExplicitWrapper<Array<T[keyof T]>>;
+    }
+}
diff --git a/jtg js/node_modules/@types/lodash/common/seq.d.ts b/jtg js/node_modules/@types/lodash/common/seq.d.ts
new file mode 100644
index 0000000..bc3cc39
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/common/seq.d.ts	
@@ -0,0 +1,196 @@
+import _ = require("../index");
+declare module "../index" {
+    // chain
+
+    interface LoDashStatic {
+        /**
+         * Creates a lodash object that wraps value with explicit method chaining enabled.
+         *
+         * @param value The value to wrap.
+         * @return Returns the new lodash wrapper instance.
+         */
+        chain<T>(value: T): LoDashExplicitWrapper<T>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.chain
+         */
+        chain(): LoDashExplicitWrapper<TValue>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.chain
+         */
+        chain(): this;
+    }
+
+    // prototype.chain
+
+    interface LoDashStatic {
+        /**
+         * Creates a lodash object that wraps value with explicit method chaining enabled.
+         *
+         * @param value The value to wrap.
+         * @return Returns the new lodash wrapper instance.
+         */
+        chain<T>(value: T): LoDashExplicitWrapper<T>;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.chain
+         */
+        chain(): LoDashExplicitWrapper<TValue>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.chain
+         */
+        chain(): this;
+    }
+
+    // prototype.commit
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * Executes the chained sequence and returns the wrapped result.
+         *
+         * @return Returns the new lodash wrapper instance.
+         */
+        commit(): this;
+    }
+
+    // prototype.plant
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * Creates a clone of the chained sequence planting value as the wrapped value.
+         * @param value The value to plant as the wrapped value.
+         * @return Returns the new lodash wrapper instance.
+         */
+        plant<T>(value: T): LoDashImplicitWrapper<T>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.plant
+         */
+        plant<T>(value: T): LoDashExplicitWrapper<T>;
+    }
+
+    // prototype.reverse
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * Reverses the wrapped array so the first element becomes the last, the second element becomes the second to
+         * last, and so on.
+         *
+         * Note: This method mutates the wrapped array.
+         *
+         * @return Returns the new reversed lodash wrapper instance.
+         */
+        reverse(): this;
+    }
+
+    // prototype.toJSON
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * @see _.value
+         */
+        toJSON(): TValue;
+    }
+
+    // prototype.toString
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * Produces the result of coercing the unwrapped value to a string.
+         *
+         * @return Returns the coerced string value.
+         */
+        toString(): string;
+    }
+
+    // prototype.value
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * Executes the chained sequence to extract the unwrapped value.
+         *
+         * @alias _.toJSON, _.valueOf
+         *
+         * @return Returns the resolved unwrapped value.
+         */
+        value(): TValue;
+    }
+
+    // prototype.valueOf
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * @see _.value
+         */
+        valueOf(): TValue;
+    }
+
+    // tap
+
+    interface LoDashStatic {
+        /**
+         * This method invokes interceptor and returns value. The interceptor is invoked with one
+         * argument; (value). The purpose of this method is to "tap into" a method chain in order to perform operations
+         * on intermediate results within the chain.
+         *
+         * @param value The value to provide to interceptor.
+         * @param interceptor The function to invoke.
+         * @return Returns value.
+         **/
+        tap<T>(
+            value: T,
+            interceptor: (value: T) => void
+        ): T;
+    }
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * @see _.tap
+         */
+        tap(
+            interceptor: (value: TValue) => void
+        ): this;
+    }
+
+    // thru
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.tap except that it returns the result of interceptor.
+         *
+         * @param value The value to provide to interceptor.
+         * @param interceptor The function to invoke.
+         * @return Returns the result of interceptor.
+         */
+        thru<T, TResult>(
+            value: T,
+            interceptor: (value: T) => TResult
+        ): TResult;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.thru
+         */
+        thru<TResult>(interceptor: (value: TValue) => TResult): LoDashImplicitWrapper<TResult>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.thru
+         */
+        thru<TResult>(interceptor: (value: TValue) => TResult): LoDashExplicitWrapper<TResult>;
+    }
+}
diff --git a/jtg js/node_modules/@types/lodash/common/string.d.ts b/jtg js/node_modules/@types/lodash/common/string.d.ts
new file mode 100644
index 0000000..d940406
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/common/string.d.ts	
@@ -0,0 +1,1059 @@
+import _ = require("../index");
+declare module "../index" {
+    // camelCase
+
+    interface LoDashStatic {
+        /**
+         * Converts string to camel case.
+         *
+         * @param string The string to convert.
+         * @return Returns the camel cased string.
+         */
+        camelCase(string?: string): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.camelCase
+         */
+        camelCase(): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.camelCase
+         */
+        camelCase(): LoDashExplicitWrapper<string>;
+    }
+
+    // capitalize
+
+    interface LoDashStatic {
+        /**
+         * Converts the first character of string to upper case and the remaining to lower case.
+         *
+         * @param string The string to capitalize.
+         * @return Returns the capitalized string.
+         */
+        capitalize(string?: string): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.capitalize
+         */
+        capitalize(): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.capitalize
+         */
+        capitalize(): LoDashExplicitWrapper<string>;
+    }
+
+    // deburr
+
+    interface LoDashStatic {
+        /**
+         * Deburrs string by converting latin-1 supplementary letters to basic latin letters and removing combining
+         * diacritical marks.
+         *
+         * @param string The string to deburr.
+         * @return Returns the deburred string.
+         */
+        deburr(string?: string): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.deburr
+         */
+        deburr(): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.deburr
+         */
+        deburr(): LoDashExplicitWrapper<string>;
+    }
+
+    // endsWith
+
+    interface LoDashStatic {
+        /**
+         * Checks if string ends with the given target string.
+         *
+         * @param string The string to search.
+         * @param target The string to search for.
+         * @param position The position to search from.
+         * @return Returns true if string ends with target, else false.
+         */
+        endsWith(
+            string?: string,
+            target?: string,
+            position?: number
+        ): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.endsWith
+         */
+        endsWith(
+            target?: string,
+            position?: number
+        ): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.endsWith
+         */
+        endsWith(
+            target?: string,
+            position?: number
+        ): LoDashExplicitWrapper<boolean>;
+    }
+
+    // escape
+
+    interface LoDashStatic {
+        /**
+         * Converts the characters "&", "<", ">", '"', "'", and "`" in string to their corresponding HTML entities.
+         *
+         * Note: No other characters are escaped. To escape additional characters use a third-party library like he.
+         *
+         * hough the ">" character is escaped for symmetry, characters like ">" and "/" don’t need escaping in HTML
+         * and have no special meaning unless they're part of a tag or unquoted attribute value. See Mathias Bynens’s
+         * article (under "semi-related fun fact") for more details.
+         *
+         * Backticks are escaped because in IE < 9, they can break out of attribute values or HTML comments. See #59,
+         * #102, #108, and #133 of the HTML5 Security Cheatsheet for more details.
+         *
+         * When working with HTML you should always quote attribute values to reduce XSS vectors.
+         *
+         * @param string The string to escape.
+         * @return Returns the escaped string.
+         */
+        escape(string?: string): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.escape
+         */
+        escape(): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.escape
+         */
+        escape(): LoDashExplicitWrapper<string>;
+    }
+
+    // escapeRegExp
+
+    interface LoDashStatic {
+        /**
+         * Escapes the RegExp special characters "^", "$", "\", ".", "*", "+", "?", "(", ")", "[", "]",
+         * "{", "}", and "|" in string.
+         *
+         * @param string The string to escape.
+         * @return Returns the escaped string.
+         */
+        escapeRegExp(string?: string): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.escapeRegExp
+         */
+        escapeRegExp(): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.escapeRegExp
+         */
+        escapeRegExp(): LoDashExplicitWrapper<string>;
+    }
+
+    // kebabCase
+
+    interface LoDashStatic {
+        /**
+         * Converts string to kebab case.
+         *
+         * @param string The string to convert.
+         * @return Returns the kebab cased string.
+         */
+        kebabCase(string?: string): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.kebabCase
+         */
+        kebabCase(): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.kebabCase
+         */
+        kebabCase(): LoDashExplicitWrapper<string>;
+    }
+
+    // lowerCase
+
+    interface LoDashStatic {
+        /**
+         * Converts `string`, as space separated words, to lower case.
+         *
+         * @param string The string to convert.
+         * @return Returns the lower cased string.
+         */
+        lowerCase(string?: string): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.lowerCase
+         */
+        lowerCase(): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.lowerCase
+         */
+        lowerCase(): LoDashExplicitWrapper<string>;
+    }
+
+    // lowerFirst
+
+    interface LoDashStatic {
+        /**
+         * Converts the first character of `string` to lower case.
+         *
+         * @param string The string to convert.
+         * @return Returns the converted string.
+         */
+        lowerFirst(string?: string): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.lowerFirst
+         */
+        lowerFirst(): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.lowerFirst
+         */
+        lowerFirst(): LoDashExplicitWrapper<string>;
+    }
+
+    // pad
+
+    interface LoDashStatic {
+        /**
+         * Pads string on the left and right sides if it’s shorter than length. Padding characters are truncated if
+         * they can’t be evenly divided by length.
+         *
+         * @param string The string to pad.
+         * @param length The padding length.
+         * @param chars The string used as padding.
+         * @return Returns the padded string.
+         */
+        pad(
+            string?: string,
+            length?: number,
+            chars?: string
+        ): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.pad
+         */
+        pad(
+            length?: number,
+            chars?: string
+        ): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.pad
+         */
+        pad(
+            length?: number,
+            chars?: string
+        ): LoDashExplicitWrapper<string>;
+    }
+
+    // padEnd
+
+    interface LoDashStatic {
+        /**
+         * Pads string on the right side if it’s shorter than length. Padding characters are truncated if they exceed
+         * length.
+         *
+         * @param string The string to pad.
+         * @param length The padding length.
+         * @param chars The string used as padding.
+         * @return Returns the padded string.
+         */
+        padEnd(
+            string?: string,
+            length?: number,
+            chars?: string
+        ): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.padEnd
+         */
+        padEnd(
+            length?: number,
+            chars?: string
+        ): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.padEnd
+         */
+        padEnd(
+            length?: number,
+            chars?: string
+        ): LoDashExplicitWrapper<string>;
+    }
+
+    // padStart
+
+    interface LoDashStatic {
+        /**
+         * Pads string on the left side if it’s shorter than length. Padding characters are truncated if they exceed
+         * length.
+         *
+         * @param string The string to pad.
+         * @param length The padding length.
+         * @param chars The string used as padding.
+         * @return Returns the padded string.
+         */
+        padStart(
+            string?: string,
+            length?: number,
+            chars?: string
+        ): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.padStart
+         */
+        padStart(
+            length?: number,
+            chars?: string
+        ): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.padStart
+         */
+        padStart(
+            length?: number,
+            chars?: string
+        ): LoDashExplicitWrapper<string>;
+    }
+
+    // parseInt
+
+    interface LoDashStatic {
+        /**
+         * Converts string to an integer of the specified radix. If radix is undefined or 0, a radix of 10 is used
+         * unless value is a hexadecimal, in which case a radix of 16 is used.
+         *
+         * Note: This method aligns with the ES5 implementation of parseInt.
+         *
+         * @param string The string to convert.
+         * @param radix The radix to interpret value by.
+         * @return Returns the converted integer.
+         */
+        parseInt(
+            string: string,
+            radix?: number
+        ): number;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.parseInt
+         */
+        parseInt(radix?: number): number;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.parseInt
+         */
+        parseInt(radix?: number): LoDashExplicitWrapper<number>;
+    }
+
+    // repeat
+
+    interface LoDashStatic {
+        /**
+         * Repeats the given string n times.
+         *
+         * @param string The string to repeat.
+         * @param n The number of times to repeat the string.
+         * @return Returns the repeated string.
+         */
+        repeat(
+            string?: string,
+            n?: number
+        ): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.repeat
+         */
+        repeat(n?: number): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.repeat
+         */
+        repeat(n?: number): LoDashExplicitWrapper<string>;
+    }
+
+    type ReplaceFunction = (match: string, ...args: any[]) => string;
+
+    // replace
+
+    interface LoDashStatic {
+        /**
+         * Replaces matches for pattern in string with replacement.
+         *
+         * Note: This method is based on String#replace.
+         *
+         * @return Returns the modified string.
+         */
+        replace(
+            string: string,
+            pattern: RegExp | string,
+            replacement: ReplaceFunction | string
+        ): string;
+
+        /**
+         * @see _.replace
+         */
+        replace(
+            pattern: RegExp | string,
+            replacement: ReplaceFunction | string
+        ): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.replace
+         */
+        replace(
+            pattern: RegExp|string,
+            replacement: ReplaceFunction | string
+        ): string;
+
+        /**
+         * @see _.replace
+         */
+        replace(
+            replacement: ReplaceFunction | string
+        ): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.replace
+         */
+        replace(
+            pattern: RegExp | string,
+            replacement: ReplaceFunction | string
+        ): LoDashExplicitWrapper<string>;
+
+        /**
+         * @see _.replace
+         */
+        replace(
+            replacement: ReplaceFunction | string
+        ): LoDashExplicitWrapper<string>;
+    }
+
+    // snakeCase
+
+    interface LoDashStatic {
+        /**
+         * Converts string to snake case.
+         *
+         * @param string The string to convert.
+         * @return Returns the snake cased string.
+         */
+        snakeCase(string?: string): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.snakeCase
+         */
+        snakeCase(): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.snakeCase
+         */
+        snakeCase(): LoDashExplicitWrapper<string>;
+    }
+
+    // split
+
+    interface LoDashStatic {
+        /**
+         * Splits string by separator.
+         *
+         * Note: This method is based on String#split.
+         *
+         * @param string The string to trim.
+         * @param separator The separator pattern to split by.
+         * @param limit The length to truncate results to.
+         * @return Returns the new array of string segments.
+         */
+        split(
+            string: string,
+            separator?: RegExp|string,
+            limit?: number
+        ): string[];
+
+        /**
+         * Splits string by separator.
+         *
+         * Note: This method is based on String#split.
+         *
+         * @param string The string to trim.
+         * @param index Not used in this overload.
+         * @param guard Enables use as an iteratee for methods like _.map. You should not pass this parameter directly in your code.
+         * @return Returns the new array of string segments.
+         */
+        split(
+            string: string,
+            index: string | number,
+            guard: object
+        ): string[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.split
+         */
+        split(
+            separator?: RegExp|string,
+            limit?: number
+        ): LoDashImplicitWrapper<string[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.split
+         */
+        split(
+            separator?: RegExp|string,
+            limit?: number
+        ): LoDashExplicitWrapper<string[]>;
+    }
+
+    // startCase
+
+    interface LoDashStatic {
+        /**
+         * Converts string to start case.
+         *
+         * @param string The string to convert.
+         * @return Returns the start cased string.
+         */
+        startCase(string?: string): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.startCase
+         */
+        startCase(): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.startCase
+         */
+        startCase(): LoDashExplicitWrapper<string>;
+    }
+
+    // startsWith
+
+    interface LoDashStatic {
+        /**
+         * Checks if string starts with the given target string.
+         *
+         * @param string The string to search.
+         * @param target The string to search for.
+         * @param position The position to search from.
+         * @return Returns true if string starts with target, else false.
+         */
+        startsWith(
+            string?: string,
+            target?: string,
+            position?: number
+        ): boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.startsWith
+         */
+        startsWith(
+            target?: string,
+            position?: number
+        ): boolean;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.startsWith
+         */
+        startsWith(
+            target?: string,
+            position?: number
+        ): LoDashExplicitWrapper<boolean>;
+    }
+
+    // template
+
+    interface TemplateOptions extends TemplateSettings {
+        /**
+         * The sourceURL of the template's compiled source.
+         */
+        sourceURL?: string;
+    }
+
+    interface TemplateExecutor {
+        (data?: object): string;
+        source: string;
+    }
+
+    interface LoDashStatic {
+        /**
+         * Creates a compiled template function that can interpolate data properties in "interpolate" delimiters,
+         * HTML-escape interpolated data properties in "escape" delimiters, and execute JavaScript in "evaluate"
+         * delimiters. Data properties may be accessed as free variables in the template. If a setting object is
+         * provided it takes precedence over _.templateSettings values.
+         *
+         * Note: In the development build _.template utilizes
+         * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl) for easier
+         * debugging.
+         *
+         * For more information on precompiling templates see
+         * [lodash's custom builds documentation](https://lodash.com/custom-builds).
+         *
+         * For more information on Chrome extension sandboxes see
+         * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
+         *
+         * @param string The template string.
+         * @param options The options object.
+         * @param options.escape The HTML "escape" delimiter.
+         * @param options.evaluate The "evaluate" delimiter.
+         * @param options.imports An object to import into the template as free variables.
+         * @param options.interpolate The "interpolate" delimiter.
+         * @param options.sourceURL The sourceURL of the template's compiled source.
+         * @param options.variable The data object variable name.
+         * @return Returns the compiled template function.
+         */
+        template(
+            string?: string,
+            options?: TemplateOptions
+        ): TemplateExecutor;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.template
+         */
+        template(options?: TemplateOptions): TemplateExecutor;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.template
+         */
+        template(options?: TemplateOptions): LoDashExplicitWrapper<TemplateExecutor>;
+    }
+
+    // toLower
+
+    interface LoDashStatic {
+        /**
+         * Converts `string`, as a whole, to lower case.
+         *
+         * @param string The string to convert.
+         * @return Returns the lower cased string.
+         */
+        toLower(string?: string): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.toLower
+         */
+        toLower(): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.toLower
+         */
+        toLower(): LoDashExplicitWrapper<string>;
+    }
+
+    // toUpper
+
+    interface LoDashStatic {
+        /**
+         * Converts `string`, as a whole, to upper case.
+         *
+         * @param string The string to convert.
+         * @return Returns the upper cased string.
+         */
+        toUpper(string?: string): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.toUpper
+         */
+        toUpper(): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.toUpper
+         */
+        toUpper(): LoDashExplicitWrapper<string>;
+    }
+
+    // trim
+
+    interface LoDashStatic {
+        /**
+         * Removes leading and trailing whitespace or specified characters from string.
+         *
+         * @param string The string to trim.
+         * @param chars The characters to trim.
+         * @return Returns the trimmed string.
+         */
+        trim(
+            string?: string,
+            chars?: string
+        ): string;
+
+        /**
+         * Removes leading and trailing whitespace or specified characters from string.
+         *
+         * @param string The string to trim.
+         * @param index Not used in this overload.
+         * @param guard Enables use as an iteratee for methods like _.map. You should not pass this parameter directly in your code.
+         * @return Returns the trimmed string.
+         */
+        trim(
+            string: string,
+            index: string | number,
+            guard: object
+        ): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.trim
+         */
+        trim(chars?: string): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.trim
+         */
+        trim(chars?: string): LoDashExplicitWrapper<string>;
+    }
+
+    // trimEnd
+
+    interface LoDashStatic {
+        /**
+         * Removes trailing whitespace or specified characters from string.
+         *
+         * @param string The string to trim.
+         * @param chars The characters to trim.
+         * @return Returns the trimmed string.
+         */
+        trimEnd(
+            string?: string,
+            chars?: string
+        ): string;
+
+        /**
+         * Removes trailing whitespace or specified characters from string.
+         *
+         * @param string The string to trim.
+         * @param index Not used in this overload.
+         * @param guard Enables use as an iteratee for methods like _.map. You should not pass this parameter directly in your code.
+         * @return Returns the trimmed string.
+         */
+        trimEnd(
+            string: string,
+            index: string | number,
+            guard: object
+        ): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.trimEnd
+         */
+        trimEnd(chars?: string): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.trimEnd
+         */
+        trimEnd(chars?: string): LoDashExplicitWrapper<string>;
+    }
+
+    // trimStart
+
+    interface LoDashStatic {
+        /**
+         * Removes leading whitespace or specified characters from string.
+         *
+         * @param string The string to trim.
+         * @param chars The characters to trim.
+         * @return Returns the trimmed string.
+         */
+        trimStart(
+            string?: string,
+            chars?: string
+        ): string;
+
+        /**
+         * Removes leading whitespace or specified characters from string.
+         *
+         * @param string The string to trim.
+         * @param index Not used in this overload.
+         * @param guard Enables use as an iteratee for methods like _.map. You should not pass this parameter directly in your code.
+         * @return Returns the trimmed string.
+         */
+        trimStart(
+            string: string,
+            index: string | number,
+            guard: object
+        ): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.trimStart
+         */
+        trimStart(chars?: string): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.trimStart
+         */
+        trimStart(chars?: string): LoDashExplicitWrapper<string>;
+    }
+
+    // truncate
+
+    interface TruncateOptions {
+        /** The maximum string length. */
+        length?: number;
+        /** The string to indicate text is omitted. */
+        omission?: string;
+        /** The separator pattern to truncate to. */
+        separator?: string|RegExp;
+    }
+
+    interface LoDashStatic {
+        /**
+         * Truncates string if it’s longer than the given maximum string length. The last characters of the truncated
+         * string are replaced with the omission string which defaults to "…".
+         *
+         * @param string The string to truncate.
+         * @param options The options object or maximum string length.
+         * @return Returns the truncated string.
+         */
+        truncate(
+            string?: string,
+            options?: TruncateOptions
+        ): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.truncate
+         */
+        truncate(options?: TruncateOptions): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.truncate
+         */
+        truncate(options?: TruncateOptions): LoDashExplicitWrapper<string>;
+    }
+
+    // unescape
+
+    interface LoDashStatic {
+        /**
+         * The inverse of _.escape; this method converts the HTML entities &amp;, &lt;, &gt;, &quot;, &#39;, and &#96;
+         * in string to their corresponding characters.
+         *
+         * Note: No other HTML entities are unescaped. To unescape additional HTML entities use a third-party library
+         * like he.
+         *
+         * @param string The string to unescape.
+         * @return Returns the unescaped string.
+         */
+        unescape(string?: string): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.unescape
+         */
+        unescape(): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.unescape
+         */
+        unescape(): LoDashExplicitWrapper<string>;
+    }
+
+    // upperCase
+
+    interface LoDashStatic {
+        /**
+         * Converts `string`, as space separated words, to upper case.
+         *
+         * @param string The string to convert.
+         * @return Returns the upper cased string.
+         */
+        upperCase(string?: string): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.upperCase
+         */
+        upperCase(): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.upperCase
+         */
+        upperCase(): LoDashExplicitWrapper<string>;
+    }
+
+    // upperFirst
+
+    interface LoDashStatic {
+        /**
+         * Converts the first character of `string` to upper case.
+         *
+         * @param string The string to convert.
+         * @return Returns the converted string.
+         */
+        upperFirst(string?: string): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.upperFirst
+         */
+        upperFirst(): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.upperFirst
+         */
+        upperFirst(): LoDashExplicitWrapper<string>;
+    }
+
+    // words
+
+    interface LoDashStatic {
+        /**
+         * Splits `string` into an array of its words.
+         *
+         * @param string The string to inspect.
+         * @param pattern The pattern to match words.
+         * @return Returns the words of `string`.
+         */
+        words(
+            string?: string,
+            pattern?: string|RegExp
+        ): string[];
+
+        /**
+         * Splits `string` into an array of its words.
+         *
+         * @param string The string to inspect.
+         * @param index Not used in this overload.
+         * @param guard Enables use as an iteratee for methods like _.map. You should not pass this parameter directly in your code.
+         * @return Returns the words of `string`.
+         */
+        words(
+            string: string,
+            index: string | number,
+            guard: object
+        ): string[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.words
+         */
+        words(pattern?: string|RegExp): string[];
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.words
+         */
+        words(pattern?: string|RegExp): LoDashExplicitWrapper<string[]>;
+    }
+}
diff --git a/jtg js/node_modules/@types/lodash/common/util.d.ts b/jtg js/node_modules/@types/lodash/common/util.d.ts
new file mode 100644
index 0000000..80b0677
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/common/util.d.ts	
@@ -0,0 +1,1463 @@
+import _ = require("../index");
+declare module "../index" {
+    // attempt
+
+    interface LoDashStatic {
+        /**
+         * Attempts to invoke func, returning either the result or the caught error object. Any additional arguments
+         * are provided to func when it’s invoked.
+         *
+         * @param func The function to attempt.
+         * @return Returns the func result or error object.
+         */
+        attempt<TResult>(func: (...args: any[]) => TResult, ...args: any[]): TResult|Error;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.attempt
+         */
+        attempt<TResult>(...args: any[]): TResult|Error;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.attempt
+         */
+        attempt<TResult>(...args: any[]): LoDashExplicitWrapper<TResult|Error>;
+    }
+
+    // bindAll
+
+    interface LoDashStatic {
+        /**
+         * Binds methods of an object to the object itself, overwriting the existing method. Method names may be
+         * specified as individual arguments or as arrays of method names. If no method names are provided all
+         * enumerable function properties, own and inherited, of object are bound.
+         *
+         * Note: This method does not set the "length" property of bound functions.
+         *
+         * @param object The object to bind and assign the bound methods to.
+         * @param methodNames The object method names to bind, specified as individual method names or arrays of
+         * method names.
+         * @return Returns object.
+         */
+        bindAll<T>(
+            object: T,
+            ...methodNames: Array<Many<string>>
+        ): T;
+    }
+
+    interface LoDashWrapper<TValue> {
+        /**
+         * @see _.bindAll
+         */
+        bindAll(...methodNames: Array<Many<string>>): this;
+    }
+
+    // cond
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that iterates over `pairs` and invokes the corresponding
+         * function of the first predicate to return truthy. The predicate-function
+         * pairs are invoked with the `this` binding and arguments of the created
+         * function.
+         *
+         * @since 4.0.0
+         * @category Util
+         * @param pairs The predicate-function pairs.
+         * @returns Returns the new composite function.
+         * @example
+         *
+         * var func = _.cond([
+         *   [_.matches({ 'a': 1 }),           _.constant('matches A')],
+         *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
+         *   [_.stubTrue,                      _.constant('no match')]
+         * ]);
+         *
+         * func({ 'a': 1, 'b': 2 });
+         * // => 'matches A'
+         *
+         * func({ 'a': 0, 'b': 1 });
+         * // => 'matches B'
+         *
+         * func({ 'a': '1', 'b': '2' });
+         * // => 'no match'
+         */
+        cond<T, R>(pairs: Array<CondPair<T, R>>): (Target: T) => R;
+    }
+
+    // conforms
+
+    type ConformsPredicateObject<T> = {
+        [P in keyof T]?: (val: T[P]) => boolean;
+    };
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that invokes the predicate properties of `source` with the corresponding
+         * property values of a given object, returning true if all predicates return truthy, else false.
+         */
+        conforms<T>(source: ConformsPredicateObject<T>): (value: T) => boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.conforms
+         */
+        conforms<T>(this: LoDashImplicitWrapper<ConformsPredicateObject<T>>): LoDashImplicitWrapper<(value: T) => boolean>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.conforms
+         */
+        conforms<T>(this: LoDashExplicitWrapper<ConformsPredicateObject<T>>): LoDashExplicitWrapper<(value: T) => boolean>;
+    }
+
+    // constant
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that returns value.
+         *
+         * @param value The value to return from the new function.
+         * @return Returns the new function.
+         */
+        constant<T>(value: T): () => T;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.constant
+         */
+        constant(): LoDashImplicitWrapper<() => TValue>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.constant
+         */
+        constant(): LoDashExplicitWrapper<() => TValue>;
+    }
+
+    // defaultTo
+
+    interface LoDashStatic {
+        /**
+         * Checks `value` to determine whether a default value should be returned in
+         * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,
+         * or `undefined`.
+         *
+         * @param value The value to check.
+         * @param defaultValue The default value.
+         * @returns Returns the resolved value.
+         */
+        defaultTo<T>(value: T | null | undefined, defaultValue: T): T;
+
+        /**
+         * @see _.defaultTo
+         */
+        defaultTo<T, TDefault>(
+            value: T | null | undefined,
+            defaultValue: TDefault
+        ): T | TDefault;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.defaultTo
+         */
+        defaultTo<T>(this: LoDashImplicitWrapper<T | null | undefined>, defaultValue: T): T;
+
+        /**
+         * @see _.defaultTo
+         */
+        defaultTo<T, TDefault>(
+            this: LoDashImplicitWrapper<T | null | undefined>,
+            defaultValue: TDefault
+        ): T | TDefault;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.defaultTo
+         */
+        defaultTo<T>(this: LoDashExplicitWrapper<T | null | undefined>, defaultValue: T): LoDashExplicitWrapper<T>;
+
+        /**
+         * @see _.defaultTo
+         */
+        defaultTo<T, TDefault>(
+            this: LoDashExplicitWrapper<T | null | undefined>,
+            defaultValue: TDefault
+        ): LoDashExplicitWrapper<T | TDefault>;
+    }
+
+    // flow
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that returns the result of invoking the provided functions with the this binding of the
+         * created function, where each successive invocation is supplied the return value of the previous.
+         *
+         * @param funcs Functions to invoke.
+         * @return Returns the new function.
+         */
+        // 0-argument first function
+        flow<R1, R2>(f1: () => R1, f2: (a: R1) => R2): () => R2;
+        flow<R1, R2, R3>(f1: () => R1, f2: (a: R1) => R2, f3: (a: R2) => R3): () => R3;
+        flow<R1, R2, R3, R4>(f1: () => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): () => R4;
+        flow<R1, R2, R3, R4, R5>(f1: () => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): () => R5;
+        flow<R1, R2, R3, R4, R5, R6>(f1: () => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): () => R6;
+        flow<R1, R2, R3, R4, R5, R6, R7>(f1: () => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): () => R7;
+        flow<R1, R2, R3, R4, R5, R6, R7>(f1: () => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<Many<(a: any) => any>>): () => any;
+        // 1-argument first function
+        flow<A1, R1, R2>(f1: (a1: A1) => R1, f2: (a: R1) => R2): (a1: A1) => R2;
+        flow<A1, R1, R2, R3>(f1: (a1: A1) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3): (a1: A1) => R3;
+        flow<A1, R1, R2, R3, R4>(f1: (a1: A1) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): (a1: A1) => R4;
+        flow<A1, R1, R2, R3, R4, R5>(f1: (a1: A1) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): (a1: A1) => R5;
+        flow<A1, R1, R2, R3, R4, R5, R6>(f1: (a1: A1) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): (a1: A1) => R6;
+        flow<A1, R1, R2, R3, R4, R5, R6, R7>(f1: (a1: A1) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): (a1: A1) => R7;
+        flow<A1, R1, R2, R3, R4, R5, R6, R7>(f1: (a1: A1) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<Many<(a: any) => any>>): (a1: A1) => any;
+        // 2-argument first function
+        flow<A1, A2, R1, R2>(f1: (a1: A1, a2: A2) => R1, f2: (a: R1) => R2): (a1: A1, a2: A2) => R2;
+        flow<A1, A2, R1, R2, R3>(f1: (a1: A1, a2: A2) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3): (a1: A1, a2: A2) => R3;
+        flow<A1, A2, R1, R2, R3, R4>(f1: (a1: A1, a2: A2) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): (a1: A1, a2: A2) => R4;
+        flow<A1, A2, R1, R2, R3, R4, R5>(f1: (a1: A1, a2: A2) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): (a1: A1, a2: A2) => R5;
+        flow<A1, A2, R1, R2, R3, R4, R5, R6>(f1: (a1: A1, a2: A2) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): (a1: A1, a2: A2) => R6;
+        flow<A1, A2, R1, R2, R3, R4, R5, R6, R7>(f1: (a1: A1, a2: A2) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): (a1: A1, a2: A2) => R7;
+        flow<A1, A2, R1, R2, R3, R4, R5, R6, R7>(f1: (a1: A1, a2: A2) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<Many<(a: any) => any>>): (a1: A1, a2: A2) => any;
+        // 3-argument first function
+        flow<A1, A2, A3, R1, R2>(f1: (a1: A1, a2: A2, a3: A3) => R1, f2: (a: R1) => R2): (a1: A1, a2: A2, a3: A3) => R2;
+        flow<A1, A2, A3, R1, R2, R3>(f1: (a1: A1, a2: A2, a3: A3) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3): (a1: A1, a2: A2, a3: A3) => R3;
+        flow<A1, A2, A3, R1, R2, R3, R4>(f1: (a1: A1, a2: A2, a3: A3) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): (a1: A1, a2: A2, a3: A3) => R4;
+        flow<A1, A2, A3, R1, R2, R3, R4, R5>(f1: (a1: A1, a2: A2, a3: A3) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): (a1: A1, a2: A2, a3: A3) => R5;
+        flow<A1, A2, A3, R1, R2, R3, R4, R5, R6>(f1: (a1: A1, a2: A2, a3: A3) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): (a1: A1, a2: A2, a3: A3) => R6;
+        flow<A1, A2, A3, R1, R2, R3, R4, R5, R6, R7>(f1: (a1: A1, a2: A2, a3: A3) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): (a1: A1, a2: A2, a3: A3) => R7;
+        flow<A1, A2, A3, R1, R2, R3, R4, R5, R6, R7>(f1: (a1: A1, a2: A2, a3: A3) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<Many<(a: any) => any>>): (a1: A1, a2: A2, a3: A3) => any;
+        // 4-argument first function
+        flow<A1, A2, A3, A4, R1, R2>(f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1, f2: (a: R1) => R2): (a1: A1, a2: A2, a3: A3, a4: A4) => R2;
+        flow<A1, A2, A3, A4, R1, R2, R3>(f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3): (a1: A1, a2: A2, a3: A3, a4: A4) => R3;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4>(f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): (a1: A1, a2: A2, a3: A3, a4: A4) => R4;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5>(f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): (a1: A1, a2: A2, a3: A3, a4: A4) => R5;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5, R6>(f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): (a1: A1, a2: A2, a3: A3, a4: A4) => R6;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5, R6, R7>(f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): (a1: A1, a2: A2, a3: A3, a4: A4) => R7;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5, R6, R7>(f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<Many<(a: any) => any>>): (a1: A1, a2: A2, a3: A3, a4: A4) => any;
+        // any-argument first function
+        flow<A1, A2, A3, A4, R1, R2>(f1: (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1, f2: (a: R1) => R2): (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R2;
+        flow<A1, A2, A3, A4, R1, R2, R3>(f1: (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3): (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R3;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4>(f1: (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R4;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5>(f1: (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R5;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5, R6>(f1: (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R6;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5, R6, R7>(f1: (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R7;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5, R6, R7>(f1: (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<Many<(a: any) => any>>): (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => any;
+        flow(funcs: Array<Many<(...args: any[]) => any>>): (...args: any[]) => any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.flow
+         */
+        // 0-argument first function
+        flow<R1, R2>(this: LoDashImplicitWrapper<() => R1>, f2: (a: R1) => R2): LoDashImplicitWrapper<() => R2>;
+        flow<R1, R2, R3>(this: LoDashImplicitWrapper<() => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3): LoDashImplicitWrapper<() => R3>;
+        flow<R1, R2, R3, R4>(this: LoDashImplicitWrapper<() => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): LoDashImplicitWrapper<() => R4>;
+        flow<R1, R2, R3, R4, R5>(this: LoDashImplicitWrapper<() => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): LoDashImplicitWrapper<() => R5>;
+        flow<R1, R2, R3, R4, R5, R6>(this: LoDashImplicitWrapper<() => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): LoDashImplicitWrapper<() => R6>;
+        flow<R1, R2, R3, R4, R5, R6, R7>(this: LoDashImplicitWrapper<() => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): LoDashImplicitWrapper<() => R7>;
+        flow<R1, R2, R3, R4, R5, R6, R7>(this: LoDashImplicitWrapper<() => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<Many<(a: any) => any>>): LoDashImplicitWrapper<() => any>;
+        // 1-argument first function
+        flow<A1, R1, R2>(this: LoDashImplicitWrapper<(a1: A1) => R1>, f2: (a: R1) => R2): LoDashImplicitWrapper<(a1: A1) => R2>;
+        flow<A1, R1, R2, R3>(this: LoDashImplicitWrapper<(a1: A1) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3): LoDashImplicitWrapper<(a1: A1) => R3>;
+        flow<A1, R1, R2, R3, R4>(this: LoDashImplicitWrapper<(a1: A1) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): LoDashImplicitWrapper<(a1: A1) => R4>;
+        flow<A1, R1, R2, R3, R4, R5>(this: LoDashImplicitWrapper<(a1: A1) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): LoDashImplicitWrapper<(a1: A1) => R5>;
+        flow<A1, R1, R2, R3, R4, R5, R6>(this: LoDashImplicitWrapper<(a1: A1) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): LoDashImplicitWrapper<(a1: A1) => R6>;
+        flow<A1, R1, R2, R3, R4, R5, R6, R7>(this: LoDashImplicitWrapper<(a1: A1) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): LoDashImplicitWrapper<(a1: A1) => R7>;
+        flow<A1, R1, R2, R3, R4, R5, R6, R7>(this: LoDashImplicitWrapper<(a1: A1) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<Many<(a: any) => any>>): LoDashImplicitWrapper<(a1: A1) => any>;
+        // 2-argument first function
+        flow<A1, A2, R1, R2>(this: LoDashImplicitWrapper<(a1: A1, a2: A2) => R1>, f2: (a: R1) => R2): LoDashImplicitWrapper<(a1: A1, a2: A2) => R2>;
+        flow<A1, A2, R1, R2, R3>(this: LoDashImplicitWrapper<(a1: A1, a2: A2) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3): LoDashImplicitWrapper<(a1: A1, a2: A2) => R3>;
+        flow<A1, A2, R1, R2, R3, R4>(this: LoDashImplicitWrapper<(a1: A1, a2: A2) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): LoDashImplicitWrapper<(a1: A1, a2: A2) => R4>;
+        flow<A1, A2, R1, R2, R3, R4, R5>(this: LoDashImplicitWrapper<(a1: A1, a2: A2) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): LoDashImplicitWrapper<(a1: A1, a2: A2) => R5>;
+        flow<A1, A2, R1, R2, R3, R4, R5, R6>(this: LoDashImplicitWrapper<(a1: A1, a2: A2) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): LoDashImplicitWrapper<(a1: A1, a2: A2) => R6>;
+        flow<A1, A2, R1, R2, R3, R4, R5, R6, R7>(this: LoDashImplicitWrapper<(a1: A1, a2: A2) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): LoDashImplicitWrapper<(a1: A1, a2: A2) => R7>;
+        flow<A1, A2, R1, R2, R3, R4, R5, R6, R7>(this: LoDashImplicitWrapper<(a1: A1, a2: A2) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<Many<(a: any) => any>>): LoDashImplicitWrapper<(a1: A1, a2: A2) => any>;
+        // 3-argument first function
+        flow<A1, A2, A3, R1, R2>(this: LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3) => R1>, f2: (a: R1) => R2): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3) => R2>;
+        flow<A1, A2, A3, R1, R2, R3>(this: LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3) => R3>;
+        flow<A1, A2, A3, R1, R2, R3, R4>(this: LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3) => R4>;
+        flow<A1, A2, A3, R1, R2, R3, R4, R5>(this: LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3) => R5>;
+        flow<A1, A2, A3, R1, R2, R3, R4, R5, R6>(this: LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3) => R6>;
+        flow<A1, A2, A3, R1, R2, R3, R4, R5, R6, R7>(this: LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3) => R7>;
+        flow<A1, A2, A3, R1, R2, R3, R4, R5, R6, R7>(this: LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<Many<(a: any) => any>>): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3) => any>;
+        // 4-argument first function
+        flow<A1, A2, A3, A4, R1, R2>(this: LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R1>, f2: (a: R1) => R2): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R2>;
+        flow<A1, A2, A3, A4, R1, R2, R3>(this: LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R3>;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4>(this: LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R4>;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5>(this: LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R5>;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5, R6>(this: LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R6>;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5, R6, R7>(this: LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R7>;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5, R6, R7>(this: LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<Many<(a: any) => any>>): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => any>;
+        // any-argument first function
+        flow<A1, A2, A3, A4, R1, R2>(this: LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1>, f2: (a: R1) => R2): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R2>;
+        flow<A1, A2, A3, A4, R1, R2, R3>(this: LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R3>;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4>(this: LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R4>;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5>(this: LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R5>;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5, R6>(this: LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R6>;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5, R6, R7>(this: LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R7>;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5, R6, R7>(this: LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<Many<(a: any) => any>>): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => any>;
+        flow(this: LoDashImplicitWrapper<(...args: any[]) => any>, funcs: Array<Many<(a: any) => any>>): LoDashImplicitWrapper<(...args: any[]) => any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.flow
+         */
+        // 0-argument first function
+        flow<R1, R2>(this: LoDashExplicitWrapper<() => R1>, f2: (a: R1) => R2): LoDashExplicitWrapper<() => R2>;
+        flow<R1, R2, R3>(this: LoDashExplicitWrapper<() => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3): LoDashExplicitWrapper<() => R3>;
+        flow<R1, R2, R3, R4>(this: LoDashExplicitWrapper<() => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): LoDashExplicitWrapper<() => R4>;
+        flow<R1, R2, R3, R4, R5>(this: LoDashExplicitWrapper<() => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): LoDashExplicitWrapper<() => R5>;
+        flow<R1, R2, R3, R4, R5, R6>(this: LoDashExplicitWrapper<() => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): LoDashExplicitWrapper<() => R6>;
+        flow<R1, R2, R3, R4, R5, R6, R7>(this: LoDashExplicitWrapper<() => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): LoDashExplicitWrapper<() => R7>;
+        flow<R1, R2, R3, R4, R5, R6, R7>(this: LoDashExplicitWrapper<() => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<Many<(a: any) => any>>): LoDashExplicitWrapper<() => any>;
+        // 1-argument first function
+        flow<A1, R1, R2>(this: LoDashExplicitWrapper<(a1: A1) => R1>, f2: (a: R1) => R2): LoDashExplicitWrapper<(a1: A1) => R2>;
+        flow<A1, R1, R2, R3>(this: LoDashExplicitWrapper<(a1: A1) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3): LoDashExplicitWrapper<(a1: A1) => R3>;
+        flow<A1, R1, R2, R3, R4>(this: LoDashExplicitWrapper<(a1: A1) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): LoDashExplicitWrapper<(a1: A1) => R4>;
+        flow<A1, R1, R2, R3, R4, R5>(this: LoDashExplicitWrapper<(a1: A1) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): LoDashExplicitWrapper<(a1: A1) => R5>;
+        flow<A1, R1, R2, R3, R4, R5, R6>(this: LoDashExplicitWrapper<(a1: A1) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): LoDashExplicitWrapper<(a1: A1) => R6>;
+        flow<A1, R1, R2, R3, R4, R5, R6, R7>(this: LoDashExplicitWrapper<(a1: A1) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): LoDashExplicitWrapper<(a1: A1) => R7>;
+        flow<A1, R1, R2, R3, R4, R5, R6, R7>(this: LoDashExplicitWrapper<(a1: A1) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<Many<(a: any) => any>>): LoDashExplicitWrapper<(a1: A1) => any>;
+        // 2-argument first function
+        flow<A1, A2, R1, R2>(this: LoDashExplicitWrapper<(a1: A1, a2: A2) => R1>, f2: (a: R1) => R2): LoDashExplicitWrapper<(a1: A1, a2: A2) => R2>;
+        flow<A1, A2, R1, R2, R3>(this: LoDashExplicitWrapper<(a1: A1, a2: A2) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3): LoDashExplicitWrapper<(a1: A1, a2: A2) => R3>;
+        flow<A1, A2, R1, R2, R3, R4>(this: LoDashExplicitWrapper<(a1: A1, a2: A2) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): LoDashExplicitWrapper<(a1: A1, a2: A2) => R4>;
+        flow<A1, A2, R1, R2, R3, R4, R5>(this: LoDashExplicitWrapper<(a1: A1, a2: A2) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): LoDashExplicitWrapper<(a1: A1, a2: A2) => R5>;
+        flow<A1, A2, R1, R2, R3, R4, R5, R6>(this: LoDashExplicitWrapper<(a1: A1, a2: A2) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): LoDashExplicitWrapper<(a1: A1, a2: A2) => R6>;
+        flow<A1, A2, R1, R2, R3, R4, R5, R6, R7>(this: LoDashExplicitWrapper<(a1: A1, a2: A2) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): LoDashExplicitWrapper<(a1: A1, a2: A2) => R7>;
+        flow<A1, A2, R1, R2, R3, R4, R5, R6, R7>(this: LoDashExplicitWrapper<(a1: A1, a2: A2) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<Many<(a: any) => any>>): LoDashExplicitWrapper<(a1: A1, a2: A2) => any>;
+        // 3-argument first function
+        flow<A1, A2, A3, R1, R2>(this: LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3) => R1>, f2: (a: R1) => R2): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3) => R2>;
+        flow<A1, A2, A3, R1, R2, R3>(this: LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3) => R3>;
+        flow<A1, A2, A3, R1, R2, R3, R4>(this: LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3) => R4>;
+        flow<A1, A2, A3, R1, R2, R3, R4, R5>(this: LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3) => R5>;
+        flow<A1, A2, A3, R1, R2, R3, R4, R5, R6>(this: LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3) => R6>;
+        flow<A1, A2, A3, R1, R2, R3, R4, R5, R6, R7>(this: LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3) => R7>;
+        flow<A1, A2, A3, R1, R2, R3, R4, R5, R6, R7>(this: LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<Many<(a: any) => any>>): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3) => any>;
+        // 4-argument first function
+        flow<A1, A2, A3, A4, R1, R2>(this: LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R1>, f2: (a: R1) => R2): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R2>;
+        flow<A1, A2, A3, A4, R1, R2, R3>(this: LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R3>;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4>(this: LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R4>;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5>(this: LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R5>;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5, R6>(this: LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R6>;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5, R6, R7>(this: LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R7>;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5, R6, R7>(this: LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<Many<(a: any) => any>>): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => any>;
+        // any-argument first function
+        flow<A1, A2, A3, A4, R1, R2>(this: LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1>, f2: (a: R1) => R2): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R2>;
+        flow<A1, A2, A3, A4, R1, R2, R3>(this: LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R3>;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4>(this: LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R4>;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5>(this: LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R5>;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5, R6>(this: LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R6>;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5, R6, R7>(this: LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R7>;
+        flow<A1, A2, A3, A4, R1, R2, R3, R4, R5, R6, R7>(this: LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1>, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<Many<(a: any) => any>>): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => any>;
+        flow(this: LoDashExplicitWrapper<(...args: any[]) => any>, funcs: Array<Many<(a: any) => any>>): LoDashExplicitWrapper<(...args: any[]) => any>;
+    }
+
+    // flowRight
+
+    interface LoDashStatic {
+        /**
+         * This method is like _.flow except that it creates a function that invokes the provided functions from right
+         * to left.
+         *
+         * @param funcs Functions to invoke.
+         * @return Returns the new function.
+         */
+        // 0-argument first function
+        flowRight<R2, R1>(f2: (a: R1) => R2, f1: () => R1): () => R2;
+        flowRight<R3, R2, R1>(f3: (a: R2) => R3, f2: (a: R1) => R2, f1: () => R1): () => R3;
+        flowRight<R4, R3, R2, R1>(f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: () => R1): () => R4;
+        flowRight<R5, R4, R3, R2, R1>(f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: () => R1): () => R5;
+        flowRight<R6, R5, R4, R3, R2, R1>(f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: () => R1): () => R6;
+        flowRight<R7, R6, R5, R4, R3, R2, R1>(f7: (a: R6) => R7, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: () => R1): () => R7;
+        // 1-argument first function
+        flowRight<A1, R2, R1>(f2: (a: R1) => R2, f1: (a1: A1) => R1): (a1: A1) => R2;
+        flowRight<A1, R3, R2, R1>(f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1) => R1): (a1: A1) => R3;
+        flowRight<A1, R4, R3, R2, R1>(f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1) => R1): (a1: A1) => R4;
+        flowRight<A1, R5, R4, R3, R2, R1>(f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1) => R1): (a1: A1) => R5;
+        flowRight<A1, R6, R5, R4, R3, R2, R1>(f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1) => R1): (a1: A1) => R6;
+        flowRight<A1, R7, R6, R5, R4, R3, R2, R1>(f7: (a: R6) => R7, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1) => R1): (a1: A1) => R7;
+        // 2-argument first function
+        flowRight<A1, A2, R2, R1>(f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): (a1: A1, a2: A2) => R2;
+        flowRight<A1, A2, R3, R2, R1>(f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): (a1: A1, a2: A2) => R3;
+        flowRight<A1, A2, R4, R3, R2, R1>(f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): (a1: A1, a2: A2) => R4;
+        flowRight<A1, A2, R5, R4, R3, R2, R1>(f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): (a1: A1, a2: A2) => R5;
+        flowRight<A1, A2, R6, R5, R4, R3, R2, R1>(f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): (a1: A1, a2: A2) => R6;
+        flowRight<A1, A2, R7, R6, R5, R4, R3, R2, R1>(f7: (a: R6) => R7, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): (a1: A1, a2: A2) => R7;
+        // 3-argument first function
+        flowRight<A1, A2, A3, R2, R1>(f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): (a1: A1, a2: A2, a3: A3) => R2;
+        flowRight<A1, A2, A3, R3, R2, R1>(f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): (a1: A1, a2: A2, a3: A3) => R3;
+        flowRight<A1, A2, A3, R4, R3, R2, R1>(f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): (a1: A1, a2: A2, a3: A3) => R4;
+        flowRight<A1, A2, A3, R5, R4, R3, R2, R1>(f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): (a1: A1, a2: A2, a3: A3) => R5;
+        flowRight<A1, A2, A3, R6, R5, R4, R3, R2, R1>(f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): (a1: A1, a2: A2, a3: A3) => R6;
+        flowRight<A1, A2, A3, R7, R6, R5, R4, R3, R2, R1>(f7: (a: R6) => R7, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): (a1: A1, a2: A2, a3: A3) => R7;
+        // 4-argument first function
+        flowRight<A1, A2, A3, A4, R2, R1>(f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): (a1: A1, a2: A2, a3: A3, a4: A4) => R2;
+        flowRight<A1, A2, A3, A4, R3, R2, R1>(f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): (a1: A1, a2: A2, a3: A3, a4: A4) => R3;
+        flowRight<A1, A2, A3, A4, R4, R3, R2, R1>(f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): (a1: A1, a2: A2, a3: A3, a4: A4) => R4;
+        flowRight<A1, A2, A3, A4, R5, R4, R3, R2, R1>(f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): (a1: A1, a2: A2, a3: A3, a4: A4) => R5;
+        flowRight<A1, A2, A3, A4, R6, R5, R4, R3, R2, R1>(f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): (a1: A1, a2: A2, a3: A3, a4: A4) => R6;
+        flowRight<A1, A2, A3, A4, R7, R6, R5, R4, R3, R2, R1>(f7: (a: R6) => R7, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): (a1: A1, a2: A2, a3: A3, a4: A4) => R7;
+        // any-argument first function
+        flowRight<R2, R1>(f2: (a: R1) => R2, f1: (...args: any[]) => R1): (...args: any[]) => R2;
+        flowRight<R3, R2, R1>(f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (...args: any[]) => R1): (...args: any[]) => R3;
+        flowRight<R4, R3, R2, R1>(f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (...args: any[]) => R1): (...args: any[]) => R4;
+        flowRight<R5, R4, R3, R2, R1>(f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (...args: any[]) => R1): (...args: any[]) => R5;
+        flowRight<R6, R5, R4, R3, R2, R1>(f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (...args: any[]) => R1): (...args: any[]) => R6;
+        flowRight<R7, R6, R5, R4, R3, R2, R1>(f7: (a: R6) => R7, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (...args: any[]) => R1): (...args: any[]) => R7;
+        flowRight(f7: (a: any) => any, f6: (a: any) => any, f5: (a: any) => any, f4: (a: any) => any, f3: (a: any) => any, f2: (a: any) => any, f1: () => any, ...funcs: Array<Many<(...args: any[]) => any>>): (...args: any[]) => any;
+        flowRight(funcs: Array<Many<(...args: any[]) => any>>): (...args: any[]) => any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.flowRight
+         */
+        // 0-argument first function
+        flowRight<R2, R1>(this: LoDashImplicitWrapper<(a: R1) => R2>, f1: () => R1): LoDashImplicitWrapper<() => R2>;
+        flowRight<R3, R2, R1>(this: LoDashImplicitWrapper<(a: R2) => R3>, f2: (a: R1) => R2, f1: () => R1): LoDashImplicitWrapper<() => R3>;
+        flowRight<R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R3) => R4>, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: () => R1): LoDashImplicitWrapper<() => R4>;
+        flowRight<R5, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R4) => R5>, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: () => R1): LoDashImplicitWrapper<() => R5>;
+        flowRight<R6, R5, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R5) => R6>, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: () => R1): LoDashImplicitWrapper<() => R6>;
+        flowRight<R7, R6, R5, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R6) => R7>, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: () => R1): LoDashImplicitWrapper<() => R7>;
+        // 1-argument first function
+        flowRight<A1, R2, R1>(this: LoDashImplicitWrapper<(a: R1) => R2>, f1: (a1: A1) => R1): LoDashImplicitWrapper<(a1: A1) => R2>;
+        flowRight<A1, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R2) => R3>, f2: (a: R1) => R2, f1: (a1: A1) => R1): LoDashImplicitWrapper<(a1: A1) => R3>;
+        flowRight<A1, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R3) => R4>, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1) => R1): LoDashImplicitWrapper<(a1: A1) => R4>;
+        flowRight<A1, R5, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R4) => R5>, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1) => R1): LoDashImplicitWrapper<(a1: A1) => R5>;
+        flowRight<A1, R6, R5, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R5) => R6>, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1) => R1): LoDashImplicitWrapper<(a1: A1) => R6>;
+        flowRight<A1, R7, R6, R5, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R6) => R7>, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1) => R1): LoDashImplicitWrapper<(a1: A1) => R7>;
+        // 2-argument first function
+        flowRight<A1, A2, R2, R1>(this: LoDashImplicitWrapper<(a: R1) => R2>, f1: (a1: A1, a2: A2) => R1): LoDashImplicitWrapper<(a1: A1, a2: A2) => R2>;
+        flowRight<A1, A2, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R2) => R3>, f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): LoDashImplicitWrapper<(a1: A1, a2: A2) => R3>;
+        flowRight<A1, A2, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R3) => R4>, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): LoDashImplicitWrapper<(a1: A1, a2: A2) => R4>;
+        flowRight<A1, A2, R5, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R4) => R5>, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): LoDashImplicitWrapper<(a1: A1, a2: A2) => R5>;
+        flowRight<A1, A2, R6, R5, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R5) => R6>, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): LoDashImplicitWrapper<(a1: A1, a2: A2) => R6>;
+        flowRight<A1, A2, R7, R6, R5, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R6) => R7>, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): LoDashImplicitWrapper<(a1: A1, a2: A2) => R7>;
+        // 3-argument first function
+        flowRight<A1, A2, A3, R2, R1>(this: LoDashImplicitWrapper<(a: R1) => R2>, f1: (a1: A1, a2: A2, a3: A3) => R1): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3) => R2>;
+        flowRight<A1, A2, A3, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R2) => R3>, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3) => R3>;
+        flowRight<A1, A2, A3, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R3) => R4>, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3) => R4>;
+        flowRight<A1, A2, A3, R5, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R4) => R5>, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3) => R5>;
+        flowRight<A1, A2, A3, R6, R5, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R5) => R6>, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3) => R6>;
+        flowRight<A1, A2, A3, R7, R6, R5, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R6) => R7>, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3) => R7>;
+        // 4-argument first function
+        flowRight<A1, A2, A3, A4, R2, R1>(this: LoDashImplicitWrapper<(a: R1) => R2>, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R2>;
+        flowRight<A1, A2, A3, A4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R2) => R3>, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R3>;
+        flowRight<A1, A2, A3, A4, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R3) => R4>, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R4>;
+        flowRight<A1, A2, A3, A4, R5, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R4) => R5>, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R5>;
+        flowRight<A1, A2, A3, A4, R6, R5, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R5) => R6>, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R6>;
+        flowRight<A1, A2, A3, A4, R7, R6, R5, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R6) => R7>, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): LoDashImplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R7>;
+        // any-argument first function
+        flowRight<R2, R1>(this: LoDashImplicitWrapper<(a: R1) => R2>, f1: (...args: any[]) => R1): LoDashImplicitWrapper<(...args: any[]) => R2>;
+        flowRight<R3, R2, R1>(this: LoDashImplicitWrapper<(a: R1) => R2>, f2: (a: R1) => R2, f1: (...args: any[]) => R1): LoDashImplicitWrapper<(...args: any[]) => R3>;
+        flowRight<R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R1) => R2>, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (...args: any[]) => R1): LoDashImplicitWrapper<(...args: any[]) => R4>;
+        flowRight<R5, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R1) => R2>, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (...args: any[]) => R1): LoDashImplicitWrapper<(...args: any[]) => R5>;
+        flowRight<R6, R5, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R1) => R2>, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (...args: any[]) => R1): LoDashImplicitWrapper<(...args: any[]) => R6>;
+        flowRight<R7, R6, R5, R4, R3, R2, R1>(this: LoDashImplicitWrapper<(a: R1) => R2>, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (...args: any[]) => R1): LoDashImplicitWrapper<(...args: any[]) => R7>;
+        flowRight(this: LoDashImplicitWrapper<(a: any) => any>, f6: (a: any) => any, f5: (a: any) => any, f4: (a: any) => any, f3: (a: any) => any, f2: (a: any) => any, f1: () => any, ...funcs: Array<Many<(...args: any[]) => any>>): LoDashImplicitWrapper<(...args: any[]) => any>;
+        flowRight(this: LoDashImplicitWrapper<(a: any) => any>, funcs: Array<Many<(...args: any[]) => any>>): LoDashImplicitWrapper<(...args: any[]) => any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.flowRight
+         */
+        // 0-argument first function
+        flowRight<R2, R1>(this: LoDashExplicitWrapper<(a: R1) => R2>, f1: () => R1): LoDashExplicitWrapper<() => R2>;
+        flowRight<R3, R2, R1>(this: LoDashExplicitWrapper<(a: R2) => R3>, f2: (a: R1) => R2, f1: () => R1): LoDashExplicitWrapper<() => R3>;
+        flowRight<R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R3) => R4>, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: () => R1): LoDashExplicitWrapper<() => R4>;
+        flowRight<R5, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R4) => R5>, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: () => R1): LoDashExplicitWrapper<() => R5>;
+        flowRight<R6, R5, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R5) => R6>, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: () => R1): LoDashExplicitWrapper<() => R6>;
+        flowRight<R7, R6, R5, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R6) => R7>, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: () => R1): LoDashExplicitWrapper<() => R7>;
+        // 1-argument first function
+        flowRight<A1, R2, R1>(this: LoDashExplicitWrapper<(a: R1) => R2>, f1: (a1: A1) => R1): LoDashExplicitWrapper<(a1: A1) => R2>;
+        flowRight<A1, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R2) => R3>, f2: (a: R1) => R2, f1: (a1: A1) => R1): LoDashExplicitWrapper<(a1: A1) => R3>;
+        flowRight<A1, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R3) => R4>, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1) => R1): LoDashExplicitWrapper<(a1: A1) => R4>;
+        flowRight<A1, R5, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R4) => R5>, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1) => R1): LoDashExplicitWrapper<(a1: A1) => R5>;
+        flowRight<A1, R6, R5, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R5) => R6>, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1) => R1): LoDashExplicitWrapper<(a1: A1) => R6>;
+        flowRight<A1, R7, R6, R5, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R6) => R7>, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1) => R1): LoDashExplicitWrapper<(a1: A1) => R7>;
+        // 2-argument first function
+        flowRight<A1, A2, R2, R1>(this: LoDashExplicitWrapper<(a: R1) => R2>, f1: (a1: A1, a2: A2) => R1): LoDashExplicitWrapper<(a1: A1, a2: A2) => R2>;
+        flowRight<A1, A2, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R2) => R3>, f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): LoDashExplicitWrapper<(a1: A1, a2: A2) => R3>;
+        flowRight<A1, A2, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R3) => R4>, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): LoDashExplicitWrapper<(a1: A1, a2: A2) => R4>;
+        flowRight<A1, A2, R5, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R4) => R5>, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): LoDashExplicitWrapper<(a1: A1, a2: A2) => R5>;
+        flowRight<A1, A2, R6, R5, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R5) => R6>, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): LoDashExplicitWrapper<(a1: A1, a2: A2) => R6>;
+        flowRight<A1, A2, R7, R6, R5, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R6) => R7>, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): LoDashExplicitWrapper<(a1: A1, a2: A2) => R7>;
+        // 3-argument first function
+        flowRight<A1, A2, A3, R2, R1>(this: LoDashExplicitWrapper<(a: R1) => R2>, f1: (a1: A1, a2: A2, a3: A3) => R1): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3) => R2>;
+        flowRight<A1, A2, A3, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R2) => R3>, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3) => R3>;
+        flowRight<A1, A2, A3, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R3) => R4>, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3) => R4>;
+        flowRight<A1, A2, A3, R5, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R4) => R5>, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3) => R5>;
+        flowRight<A1, A2, A3, R6, R5, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R5) => R6>, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3) => R6>;
+        flowRight<A1, A2, A3, R7, R6, R5, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R6) => R7>, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3) => R7>;
+        // 4-argument first function
+        flowRight<A1, A2, A3, A4, R2, R1>(this: LoDashExplicitWrapper<(a: R1) => R2>, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R2>;
+        flowRight<A1, A2, A3, A4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R2) => R3>, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R3>;
+        flowRight<A1, A2, A3, A4, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R3) => R4>, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R4>;
+        flowRight<A1, A2, A3, A4, R5, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R4) => R5>, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R5>;
+        flowRight<A1, A2, A3, A4, R6, R5, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R5) => R6>, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R6>;
+        flowRight<A1, A2, A3, A4, R7, R6, R5, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R6) => R7>, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): LoDashExplicitWrapper<(a1: A1, a2: A2, a3: A3, a4: A4) => R7>;
+        // any-argument first function
+        flowRight<R2, R1>(this: LoDashExplicitWrapper<(a: R1) => R2>, f1: (...args: any[]) => R1): LoDashExplicitWrapper<(...args: any[]) => R2>;
+        flowRight<R3, R2, R1>(this: LoDashExplicitWrapper<(a: R1) => R2>, f2: (a: R1) => R2, f1: (...args: any[]) => R1): LoDashExplicitWrapper<(...args: any[]) => R3>;
+        flowRight<R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R1) => R2>, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (...args: any[]) => R1): LoDashExplicitWrapper<(...args: any[]) => R4>;
+        flowRight<R5, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R1) => R2>, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (...args: any[]) => R1): LoDashExplicitWrapper<(...args: any[]) => R5>;
+        flowRight<R6, R5, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R1) => R2>, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (...args: any[]) => R1): LoDashExplicitWrapper<(...args: any[]) => R6>;
+        flowRight<R7, R6, R5, R4, R3, R2, R1>(this: LoDashExplicitWrapper<(a: R1) => R2>, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (...args: any[]) => R1): LoDashExplicitWrapper<(...args: any[]) => R7>;
+        flowRight(this: LoDashExplicitWrapper<(a: any) => any>, f6: (a: any) => any, f5: (a: any) => any, f4: (a: any) => any, f3: (a: any) => any, f2: (a: any) => any, f1: () => any, ...funcs: Array<Many<(...args: any[]) => any>>): LoDashExplicitWrapper<(...args: any[]) => any>;
+        flowRight(this: LoDashExplicitWrapper<(a: any) => any>, funcs: Array<Many<(...args: any[]) => any>>): LoDashExplicitWrapper<(...args: any[]) => any>;
+    }
+
+    // identity
+
+    interface LoDashStatic {
+        /**
+         * This method returns the first argument provided to it.
+         *
+         * @param value Any value.
+         * @return Returns value.
+         */
+        identity<T>(value: T): T;
+
+        /**
+         * @see _.identity
+         */
+        identity(): undefined;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.identity
+         */
+        identity(): TValue;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.identity
+         */
+        identity(): this;
+    }
+
+    // iteratee
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that invokes `func` with the arguments of the created
+         * function. If `func` is a property name the created callback returns the
+         * property value for a given element. If `func` is an object the created
+         * callback returns `true` for elements that contain the equivalent object properties, otherwise it returns `false`.
+         *
+         * @category Util
+         * @param [func=_.identity] The value to convert to a callback.
+         * @returns Returns the callback.
+         * @example
+         *
+         * var users = [
+         *   { 'user': 'barney', 'age': 36 },
+         *   { 'user': 'fred',   'age': 40 }
+         * ];
+         *
+         * // create custom iteratee shorthands
+         * _.iteratee = _.wrap(_.iteratee, function(callback, func) {
+         *   var p = /^(\S+)\s*([<>])\s*(\S+)$/.exec(func);
+         *   return !p ? callback(func) : function(object) {
+         *     return (p[2] == '>' ? object[p[1]] > p[3] : object[p[1]] < p[3]);
+         *   };
+         * });
+         *
+         * _.filter(users, 'age > 36');
+         * // => [{ 'user': 'fred', 'age': 40 }]
+         */
+        iteratee<TFunction extends (...args: any[]) => any>(
+            func: TFunction
+        ): TFunction;
+
+        /**
+         * @see _.iteratee
+         */
+        // tslint:disable-next-line:unified-signatures Tests fail in TS2.3 if the overloads are joined
+        iteratee(
+            func: string | object
+        ): (...args: any[]) => any;
+
+        /**
+         * @see _.iteratee
+         */
+        iteratee(): typeof _.identity; // tslint:disable-line:no-unnecessary-qualifier
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.iteratee
+         */
+        iteratee<TFunction extends (...args: any[]) => any>(
+            this: LoDashImplicitWrapper<TFunction | string | object>
+        ): LoDashImplicitWrapper<TFunction>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.iteratee
+         */
+        iteratee<TFunction extends (...args: any[]) => any>(
+            this: LoDashExplicitWrapper<TFunction | string | object>
+        ): LoDashExplicitWrapper<TFunction>;
+    }
+
+    // matches
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that performs a deep comparison between a given object and source, returning true if the
+         * given object has equivalent property values, else false.
+         *
+         * Note: This method supports comparing arrays, booleans, Date objects, numbers, Object objects, regexes, and
+         * strings. Objects are compared by their own, not inherited, enumerable properties. For comparing a single own
+         * or inherited property value see _.matchesProperty.
+         *
+         * @param source The object of property values to match.
+         * @return Returns the new function.
+         */
+        matches<T>(source: T): (value: any) => boolean;
+
+        /**
+         * @see _.matches
+         */
+        matches<T, V>(source: T): (value: V) => boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.matches
+         */
+        matches<V>(): LoDashImplicitWrapper<(value: V) => boolean>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.matches
+         */
+        matches<V>(): LoDashExplicitWrapper<(value: V) => boolean>;
+    }
+
+    // matchesProperty
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that compares the property value of path on a given object to value.
+         *
+         * Note: This method supports comparing arrays, booleans, Date objects, numbers, Object objects, regexes, and
+         * strings. Objects are compared by their own, not inherited, enumerable properties.
+         *
+         * @param path The path of the property to get.
+         * @param srcValue The value to match.
+         * @return Returns the new function.
+         */
+        matchesProperty<T>(
+            path: PropertyPath,
+            srcValue: T
+        ): (value: any) => boolean;
+
+        /**
+         * @see _.matchesProperty
+         */
+        matchesProperty<T, V>(
+            path: PropertyPath,
+            srcValue: T
+        ): (value: V) => boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.matchesProperty
+         */
+        matchesProperty<SrcValue>(
+            srcValue: SrcValue
+        ): LoDashImplicitWrapper<(value: any) => boolean>;
+
+        /**
+         * @see _.matchesProperty
+         */
+        matchesProperty<SrcValue, Value>(
+            srcValue: SrcValue
+        ): LoDashImplicitWrapper<(value: Value) => boolean>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.matchesProperty
+         */
+        matchesProperty<SrcValue>(
+            srcValue: SrcValue
+        ): LoDashExplicitWrapper<(value: any) => boolean>;
+
+        /**
+         * @see _.matchesProperty
+         */
+        matchesProperty<SrcValue, Value>(
+            srcValue: SrcValue
+        ): LoDashExplicitWrapper<(value: Value) => boolean>;
+    }
+
+    // method
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that invokes the method at path on a given object. Any additional arguments are provided
+         * to the invoked method.
+         *
+         * @param path The path of the method to invoke.
+         * @param args The arguments to invoke the method with.
+         * @return Returns the new function.
+         */
+        method(
+            path: PropertyPath,
+            ...args: any[]
+        ): (object: any) => any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.method
+         */
+        method(...args: any[]): LoDashImplicitWrapper<(object: any) => any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.method
+         */
+        method(...args: any[]): LoDashExplicitWrapper<(object: any) => any>;
+    }
+
+    // methodOf
+
+    interface LoDashStatic {
+        /**
+         * The opposite of _.method; this method creates a function that invokes the method at a given path on object.
+         * Any additional arguments are provided to the invoked method.
+         *
+         * @param object The object to query.
+         * @param args The arguments to invoke the method with.
+         * @return Returns the new function.
+         */
+        methodOf(
+            object: object,
+            ...args: any[]
+        ): (path: PropertyPath) => any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.methodOf
+         */
+        methodOf(
+            ...args: any[]
+        ): LoDashImplicitWrapper<(path: PropertyPath) => any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.methodOf
+         */
+        methodOf(
+            ...args: any[]
+        ): LoDashExplicitWrapper<(path: PropertyPath) => any>;
+    }
+
+    // mixin
+
+    interface MixinOptions {
+        chain?: boolean;
+    }
+
+    interface LoDashStatic {
+        /**
+         * Adds all own enumerable function properties of a source object to the destination object. If object is a
+         * function then methods are added to its prototype as well.
+         *
+         * Note: Use _.runInContext to create a pristine lodash function to avoid conflicts caused by modifying
+         * the original.
+         *
+         * @param object The destination object.
+         * @param source The object of functions to add.
+         * @param options The options object.
+         * @param options.chain Specify whether the functions added are chainable.
+         * @return Returns object.
+         */
+        mixin<TObject>(
+            object: TObject,
+            source: Dictionary<(...args: any[]) => any>,
+            options?: MixinOptions
+        ): TObject;
+
+        /**
+         * @see _.mixin
+         */
+        mixin<TResult>(
+            source: Dictionary<(...args: any[]) => any>,
+            options?: MixinOptions
+        ): LoDashStatic;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.mixin
+         */
+        mixin(
+            source: Dictionary<(...args: any[]) => any>,
+            options?: MixinOptions
+        ): this;
+
+        /**
+         * @see _.mixin
+         */
+        mixin(
+            options?: MixinOptions
+        ): LoDashImplicitWrapper<LoDashStatic>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.mixin
+         */
+        mixin(
+            source: Dictionary<(...args: any[]) => any>,
+            options?: MixinOptions
+        ): this;
+
+        /**
+         * @see _.mixin
+         */
+        mixin(
+            options?: MixinOptions
+        ): LoDashExplicitWrapper<LoDashStatic>;
+    }
+
+    // noConflict
+
+    interface LoDashStatic {
+        /**
+         * Reverts the _ variable to its previous value and returns a reference to the lodash function.
+         *
+         * @return Returns the lodash function.
+         */
+        noConflict(): typeof _;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.noConflict
+         */
+        noConflict(): typeof _;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.noConflict
+         */
+        noConflict(): LoDashExplicitWrapper<typeof _>;
+    }
+
+    // noop
+
+    interface LoDashStatic {
+        /**
+         * A no-operation function that returns undefined regardless of the arguments it receives.
+         *
+         * @return undefined
+         */
+        noop(...args: any[]): void;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.noop
+         */
+        noop(...args: any[]): void;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.noop
+         */
+        noop(...args: any[]): LoDashExplicitWrapper<undefined>;
+    }
+
+    // nthArg
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that returns its nth argument.
+         *
+         * @param n The index of the argument to return.
+         * @return Returns the new function.
+         */
+        nthArg(n?: number): (...args: any[]) => any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.nthArg
+         */
+        nthArg(): LoDashImplicitWrapper<(...args: any[]) => any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.nthArg
+         */
+        nthArg(): LoDashExplicitWrapper<(...args: any[]) => any>;
+    }
+
+    // over
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that invokes iteratees with the arguments provided to the created function and returns
+         * their results.
+         *
+         * @param iteratees The iteratees to invoke.
+         * @return Returns the new function.
+         */
+        over<TResult>(...iteratees: Array<Many<(...args: any[]) => TResult>>): (...args: any[]) => TResult[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.over
+         */
+        over<TResult>(
+            this: LoDashImplicitWrapper<Many<(...args: any[]) => TResult>>,
+            ...iteratees: Array<Many<(...args: any[]) => TResult>>
+        ): LoDashImplicitWrapper<(...args: any[]) => TResult[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.over
+         */
+        over<TResult>(
+            this: LoDashExplicitWrapper<Many<(...args: any[]) => TResult>>,
+            ...iteratees: Array<Many<(...args: any[]) => TResult>>
+        ): LoDashExplicitWrapper<(...args: any[]) => TResult[]>;
+    }
+
+    // overEvery
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that checks if all of the predicates return truthy when invoked with the arguments
+         * provided to the created function.
+         *
+         * @param predicates The predicates to check.
+         * @return Returns the new function.
+         */
+        overEvery<T>(...predicates: Array<Many<(...args: T[]) => boolean>>): (...args: T[]) => boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.overEvery
+         */
+        overEvery<T>(...predicates: Array<Many<(...args: T[]) => boolean>>): LoDashImplicitWrapper<(...args: T[]) => boolean>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.overEvery
+         */
+        overEvery<T>(...predicates: Array<Many<(...args: T[]) => boolean>>): LoDashExplicitWrapper<(...args: T[]) => boolean>;
+    }
+
+    // overSome
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that checks if any of the predicates return truthy when invoked with the arguments
+         * provided to the created function.
+         *
+         * @param predicates The predicates to check.
+         * @return Returns the new function.
+         */
+        overSome<T>(...predicates: Array<Many<(...args: T[]) => boolean>>): (...args: T[]) => boolean;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.overSome
+         */
+        overSome<T>(...predicates: Array<Many<(...args: T[]) => boolean>>): LoDashImplicitWrapper<(...args: T[]) => boolean>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.overSome
+         */
+        overSome<T>(...predicates: Array<Many<(...args: T[]) => boolean>>): LoDashExplicitWrapper<(...args: T[]) => boolean>;
+    }
+
+    // property
+
+    interface LoDashStatic {
+        /**
+         * Creates a function that returns the property value at path on a given object.
+         *
+         * @param path The path of the property to get.
+         * @return Returns the new function.
+         */
+        property<TObj, TResult>(path: PropertyPath): (obj: TObj) => TResult;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.property
+         */
+        property<TObj, TResult>(): LoDashImplicitWrapper<(obj: TObj) => TResult>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.property
+         */
+        property<TObj, TResult>(): LoDashExplicitWrapper<(obj: TObj) => TResult>;
+    }
+
+    // propertyOf
+
+    interface LoDashStatic {
+        /**
+         * The opposite of _.property; this method creates a function that returns the property value at a given path
+         * on object.
+         *
+         * @param object The object to query.
+         * @return Returns the new function.
+         */
+        propertyOf<T extends {}>(object: T): (path: PropertyPath) => any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.propertyOf
+         */
+        propertyOf(): LoDashImplicitWrapper<(path: PropertyPath) => any>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.propertyOf
+         */
+        propertyOf(): LoDashExplicitWrapper<(path: PropertyPath) => any>;
+    }
+
+    // range
+
+    interface LoDashStatic {
+        /**
+         * Creates an array of numbers (positive and/or negative) progressing from start up to, but not including, end.
+         * If end is not specified it’s set to start with start then set to 0. If end is less than start a zero-length
+         * range is created unless a negative step is specified.
+         *
+         * @param start The start of the range.
+         * @param end The end of the range.
+         * @param step The value to increment or decrement by.
+         * @return Returns a new range array.
+         */
+        range(
+            start: number,
+            end?: number,
+            step?: number
+        ): number[];
+
+        /**
+         * Creates an array of numbers (positive and/or negative) progressing from start up to, but not including, end.
+         * If end is not specified it’s set to start with start then set to 0. If end is less than start a zero-length
+         * range is created unless a negative step is specified.
+         *
+         * @param start The start of the range.
+         * @param index Not used in this overload.
+         * @param guard Enables use as an iteratee for methods like _.map. You should not pass this parameter directly in your code.
+         * @return Returns a new range array.
+         */
+        range(
+            end: number,
+            index: string | number,
+            guard: object
+        ): number[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.range
+         */
+        range(
+            end?: number,
+            step?: number
+        ): LoDashImplicitWrapper<number[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.range
+         */
+        range(
+            end?: number,
+            step?: number
+        ): LoDashExplicitWrapper<number[]>;
+    }
+
+    // rangeRight
+
+    interface LoDashStatic {
+        /**
+         * This method is like `_.range` except that it populates values in
+         * descending order.
+         *
+         * @category Util
+         * @param start The start of the range.
+         * @param end The end of the range.
+         * @param step The value to increment or decrement by.
+         * @returns Returns the new array of numbers.
+         * @example
+         *
+         * _.rangeRight(4);
+         * // => [3, 2, 1, 0]
+         *
+         * _.rangeRight(-4);
+         * // => [-3, -2, -1, 0]
+         *
+         * _.rangeRight(1, 5);
+         * // => [4, 3, 2, 1]
+         *
+         * _.rangeRight(0, 20, 5);
+         * // => [15, 10, 5, 0]
+         *
+         * _.rangeRight(0, -4, -1);
+         * // => [-3, -2, -1, 0]
+         *
+         * _.rangeRight(1, 4, 0);
+         * // => [1, 1, 1]
+         *
+         * _.rangeRight(0);
+         * // => []
+         */
+        rangeRight(
+            start: number,
+            end?: number,
+            step?: number
+        ): number[];
+
+        /**
+         * This method is like _.range except that it populates values in
+         * descending order.
+         *
+         * @param start The start of the range.
+         * @param index Not used in this overload.
+         * @param guard Enables use as an iteratee for methods like _.map. You should not pass this parameter directly in your code.
+         * @return Returns a new range array.
+         */
+        rangeRight(
+            end: number,
+            index: string | number,
+            guard: object
+        ): number[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.rangeRight
+         */
+        rangeRight(
+            end?: number,
+            step?: number
+        ): LoDashImplicitWrapper<number[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.rangeRight
+         */
+        rangeRight(
+            end?: number,
+            step?: number
+        ): LoDashExplicitWrapper<number[]>;
+    }
+
+    // runInContext
+
+    interface LoDashStatic {
+        /**
+         * Create a new pristine lodash function using the given context object.
+         *
+         * @param context The context object.
+         * @return Returns a new lodash function.
+         */
+        runInContext(context?: object): LoDashStatic;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.runInContext
+         */
+        runInContext(): LoDashStatic;
+    }
+
+    // stubArray
+
+    interface LoDashStatic {
+        /**
+         * This method returns a new empty array.
+         *
+         * @returns Returns the new empty array.
+         */
+        stubArray(): any[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.stubArray
+         */
+        stubArray(): any[];
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.stubArray
+         */
+        stubArray(): LoDashExplicitWrapper<any[]>;
+    }
+
+    // stubFalse
+
+    interface LoDashStatic {
+        /**
+         * This method returns `false`.
+         *
+         * @returns Returns `false`.
+         */
+        stubFalse(): false;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.stubFalse
+         */
+        stubFalse(): false;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.stubFalse
+         */
+        stubFalse(): LoDashExplicitWrapper<false>;
+    }
+
+    // stubObject
+
+    interface LoDashStatic {
+        /**
+         * This method returns a new empty object.
+         *
+         * @returns Returns the new empty object.
+         */
+        stubObject(): any;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.stubObject
+         */
+        stubObject(): any;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.stubObject
+         */
+        stubObject(): LoDashExplicitWrapper<any>;
+    }
+
+    // stubString
+
+    interface LoDashStatic {
+        /**
+         * This method returns an empty string.
+         *
+         * @returns Returns the empty string.
+         */
+        stubString(): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.stubString
+         */
+        stubString(): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.stubString
+         */
+        stubString(): LoDashExplicitWrapper<string>;
+    }
+
+    // stubTrue
+
+    interface LoDashStatic {
+        /**
+         * This method returns `true`.
+         *
+         * @returns Returns `true`.
+         */
+        stubTrue(): true;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.stubTrue
+         */
+        stubTrue(): true;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.stubTrue
+         */
+        stubTrue(): LoDashExplicitWrapper<true>;
+    }
+
+    // times
+
+    interface LoDashStatic {
+        /**
+         * Invokes the iteratee function n times, returning an array of the results of each invocation. The iteratee
+         * is invoked with one argument; (index).
+         *
+         * @param n The number of times to invoke iteratee.
+         * @param iteratee The function invoked per iteration.
+         * @return Returns the array of results.
+         */
+        times<TResult>(
+            n: number,
+            iteratee: (num: number) => TResult
+        ): TResult[];
+
+        /**
+         * @see _.times
+         */
+        times(n: number): number[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.times
+         */
+        times<TResult>(
+            iteratee: (num: number) => TResult
+        ): TResult[];
+
+        /**
+         * @see _.times
+         */
+        times(): number[];
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.times
+         */
+        times<TResult>(
+            iteratee: (num: number) => TResult
+        ): LoDashExplicitWrapper<TResult[]>;
+
+        /**
+         * @see _.times
+         */
+        times(): LoDashExplicitWrapper<number[]>;
+    }
+
+    // toPath
+
+    interface LoDashStatic {
+        /**
+         * Converts `value` to a property path array.
+         *
+         * @category Util
+         * @param value The value to convert.
+         * @returns Returns the new property path array.
+         * @example
+         *
+         * _.toPath('a.b.c');
+         * // => ['a', 'b', 'c']
+         *
+         * _.toPath('a[0].b.c');
+         * // => ['a', '0', 'b', 'c']
+         *
+         * var path = ['a', 'b', 'c'],
+         *     newPath = _.toPath(path);
+         *
+         * console.log(newPath);
+         * // => ['a', 'b', 'c']
+         *
+         * console.log(path === newPath);
+         * // => false
+         */
+        toPath(value: any): string[];
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.toPath
+         */
+        toPath(): LoDashImplicitWrapper<string[]>;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.toPath
+         */
+        toPath(): LoDashExplicitWrapper<string[]>;
+    }
+
+    // uniqueId
+
+    interface LoDashStatic {
+        /**
+         * Generates a unique ID. If prefix is provided the ID is appended to it.
+         *
+         * @param prefix The value to prefix the ID with.
+         * @return Returns the unique ID.
+         */
+        uniqueId(prefix?: string): string;
+    }
+
+    interface LoDashImplicitWrapper<TValue> {
+        /**
+         * @see _.uniqueId
+         */
+        uniqueId(): string;
+    }
+
+    interface LoDashExplicitWrapper<TValue> {
+        /**
+         * @see _.uniqueId
+         */
+        uniqueId(): LoDashExplicitWrapper<string>;
+    }
+}
diff --git a/jtg js/node_modules/@types/lodash/compact.d.ts b/jtg js/node_modules/@types/lodash/compact.d.ts
new file mode 100644
index 0000000..94a5397
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/compact.d.ts	
@@ -0,0 +1,2 @@
+import { compact } from "./index";
+export = compact;
diff --git a/jtg js/node_modules/@types/lodash/concat.d.ts b/jtg js/node_modules/@types/lodash/concat.d.ts
new file mode 100644
index 0000000..f8c2612
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/concat.d.ts	
@@ -0,0 +1,2 @@
+import { concat } from "./index";
+export = concat;
diff --git a/jtg js/node_modules/@types/lodash/cond.d.ts b/jtg js/node_modules/@types/lodash/cond.d.ts
new file mode 100644
index 0000000..a325bad
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/cond.d.ts	
@@ -0,0 +1,2 @@
+import { cond } from "./index";
+export = cond;
diff --git a/jtg js/node_modules/@types/lodash/conformsTo.d.ts b/jtg js/node_modules/@types/lodash/conformsTo.d.ts
new file mode 100644
index 0000000..320b180
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/conformsTo.d.ts	
@@ -0,0 +1,2 @@
+import { conformsTo } from "./index";
+export = conformsTo;
diff --git a/jtg js/node_modules/@types/lodash/constant.d.ts b/jtg js/node_modules/@types/lodash/constant.d.ts
new file mode 100644
index 0000000..ebab572
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/constant.d.ts	
@@ -0,0 +1,2 @@
+import { constant } from "./index";
+export = constant;
diff --git a/jtg js/node_modules/@types/lodash/countBy.d.ts b/jtg js/node_modules/@types/lodash/countBy.d.ts
new file mode 100644
index 0000000..db56ff3
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/countBy.d.ts	
@@ -0,0 +1,2 @@
+import { countBy } from "./index";
+export = countBy;
diff --git a/jtg js/node_modules/@types/lodash/create.d.ts b/jtg js/node_modules/@types/lodash/create.d.ts
new file mode 100644
index 0000000..5c7dc7a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/create.d.ts	
@@ -0,0 +1,2 @@
+import { create } from "./index";
+export = create;
diff --git a/jtg js/node_modules/@types/lodash/curry.d.ts b/jtg js/node_modules/@types/lodash/curry.d.ts
new file mode 100644
index 0000000..afbb8f4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/curry.d.ts	
@@ -0,0 +1,2 @@
+import { curry } from "./index";
+export = curry;
diff --git a/jtg js/node_modules/@types/lodash/curryRight.d.ts b/jtg js/node_modules/@types/lodash/curryRight.d.ts
new file mode 100644
index 0000000..7d224c9
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/curryRight.d.ts	
@@ -0,0 +1,2 @@
+import { curryRight } from "./index";
+export = curryRight;
diff --git a/jtg js/node_modules/@types/lodash/debounce.d.ts b/jtg js/node_modules/@types/lodash/debounce.d.ts
new file mode 100644
index 0000000..983edd7
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/debounce.d.ts	
@@ -0,0 +1,2 @@
+import { debounce } from "./index";
+export = debounce;
diff --git a/jtg js/node_modules/@types/lodash/deburr.d.ts b/jtg js/node_modules/@types/lodash/deburr.d.ts
new file mode 100644
index 0000000..cf1fa37
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/deburr.d.ts	
@@ -0,0 +1,2 @@
+import { deburr } from "./index";
+export = deburr;
diff --git a/jtg js/node_modules/@types/lodash/defaultTo.d.ts b/jtg js/node_modules/@types/lodash/defaultTo.d.ts
new file mode 100644
index 0000000..89fb565
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/defaultTo.d.ts	
@@ -0,0 +1,2 @@
+import { defaultTo } from "./index";
+export = defaultTo;
diff --git a/jtg js/node_modules/@types/lodash/defaults.d.ts b/jtg js/node_modules/@types/lodash/defaults.d.ts
new file mode 100644
index 0000000..e83508d
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/defaults.d.ts	
@@ -0,0 +1,2 @@
+import { defaults } from "./index";
+export = defaults;
diff --git a/jtg js/node_modules/@types/lodash/defaultsDeep.d.ts b/jtg js/node_modules/@types/lodash/defaultsDeep.d.ts
new file mode 100644
index 0000000..19ff551
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/defaultsDeep.d.ts	
@@ -0,0 +1,2 @@
+import { defaultsDeep } from "./index";
+export = defaultsDeep;
diff --git a/jtg js/node_modules/@types/lodash/defer.d.ts b/jtg js/node_modules/@types/lodash/defer.d.ts
new file mode 100644
index 0000000..144bf5b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/defer.d.ts	
@@ -0,0 +1,2 @@
+import { defer } from "./index";
+export = defer;
diff --git a/jtg js/node_modules/@types/lodash/delay.d.ts b/jtg js/node_modules/@types/lodash/delay.d.ts
new file mode 100644
index 0000000..ead89c1
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/delay.d.ts	
@@ -0,0 +1,2 @@
+import { delay } from "./index";
+export = delay;
diff --git a/jtg js/node_modules/@types/lodash/difference.d.ts b/jtg js/node_modules/@types/lodash/difference.d.ts
new file mode 100644
index 0000000..4a73c56
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/difference.d.ts	
@@ -0,0 +1,2 @@
+import { difference } from "./index";
+export = difference;
diff --git a/jtg js/node_modules/@types/lodash/differenceBy.d.ts b/jtg js/node_modules/@types/lodash/differenceBy.d.ts
new file mode 100644
index 0000000..34558c4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/differenceBy.d.ts	
@@ -0,0 +1,2 @@
+import { differenceBy } from "./index";
+export = differenceBy;
diff --git a/jtg js/node_modules/@types/lodash/differenceWith.d.ts b/jtg js/node_modules/@types/lodash/differenceWith.d.ts
new file mode 100644
index 0000000..86aebd8
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/differenceWith.d.ts	
@@ -0,0 +1,2 @@
+import { differenceWith } from "./index";
+export = differenceWith;
diff --git a/jtg js/node_modules/@types/lodash/divide.d.ts b/jtg js/node_modules/@types/lodash/divide.d.ts
new file mode 100644
index 0000000..3d8e393
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/divide.d.ts	
@@ -0,0 +1,2 @@
+import { divide } from "./index";
+export = divide;
diff --git a/jtg js/node_modules/@types/lodash/drop.d.ts b/jtg js/node_modules/@types/lodash/drop.d.ts
new file mode 100644
index 0000000..1283f99
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/drop.d.ts	
@@ -0,0 +1,2 @@
+import { drop } from "./index";
+export = drop;
diff --git a/jtg js/node_modules/@types/lodash/dropRight.d.ts b/jtg js/node_modules/@types/lodash/dropRight.d.ts
new file mode 100644
index 0000000..4133c98
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/dropRight.d.ts	
@@ -0,0 +1,2 @@
+import { dropRight } from "./index";
+export = dropRight;
diff --git a/jtg js/node_modules/@types/lodash/dropRightWhile.d.ts b/jtg js/node_modules/@types/lodash/dropRightWhile.d.ts
new file mode 100644
index 0000000..0dda808
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/dropRightWhile.d.ts	
@@ -0,0 +1,2 @@
+import { dropRightWhile } from "./index";
+export = dropRightWhile;
diff --git a/jtg js/node_modules/@types/lodash/dropWhile.d.ts b/jtg js/node_modules/@types/lodash/dropWhile.d.ts
new file mode 100644
index 0000000..894ebaa
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/dropWhile.d.ts	
@@ -0,0 +1,2 @@
+import { dropWhile } from "./index";
+export = dropWhile;
diff --git a/jtg js/node_modules/@types/lodash/each.d.ts b/jtg js/node_modules/@types/lodash/each.d.ts
new file mode 100644
index 0000000..608f8a9
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/each.d.ts	
@@ -0,0 +1,2 @@
+import { each } from "./index";
+export = each;
diff --git a/jtg js/node_modules/@types/lodash/eachRight.d.ts b/jtg js/node_modules/@types/lodash/eachRight.d.ts
new file mode 100644
index 0000000..ae0bb6f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/eachRight.d.ts	
@@ -0,0 +1,2 @@
+import { eachRight } from "./index";
+export = eachRight;
diff --git a/jtg js/node_modules/@types/lodash/endsWith.d.ts b/jtg js/node_modules/@types/lodash/endsWith.d.ts
new file mode 100644
index 0000000..d8475b1
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/endsWith.d.ts	
@@ -0,0 +1,2 @@
+import { endsWith } from "./index";
+export = endsWith;
diff --git a/jtg js/node_modules/@types/lodash/entries.d.ts b/jtg js/node_modules/@types/lodash/entries.d.ts
new file mode 100644
index 0000000..24b2417
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/entries.d.ts	
@@ -0,0 +1,2 @@
+import { entries } from "./index";
+export = entries;
diff --git a/jtg js/node_modules/@types/lodash/entriesIn.d.ts b/jtg js/node_modules/@types/lodash/entriesIn.d.ts
new file mode 100644
index 0000000..a68ab1e
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/entriesIn.d.ts	
@@ -0,0 +1,2 @@
+import { entriesIn } from "./index";
+export = entriesIn;
diff --git a/jtg js/node_modules/@types/lodash/eq.d.ts b/jtg js/node_modules/@types/lodash/eq.d.ts
new file mode 100644
index 0000000..88ec887
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/eq.d.ts	
@@ -0,0 +1,2 @@
+import { eq } from "./index";
+export = eq;
diff --git a/jtg js/node_modules/@types/lodash/escape.d.ts b/jtg js/node_modules/@types/lodash/escape.d.ts
new file mode 100644
index 0000000..9f628a3
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/escape.d.ts	
@@ -0,0 +1,2 @@
+import { escape } from "./index";
+export = escape;
diff --git a/jtg js/node_modules/@types/lodash/escapeRegExp.d.ts b/jtg js/node_modules/@types/lodash/escapeRegExp.d.ts
new file mode 100644
index 0000000..97519c1
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/escapeRegExp.d.ts	
@@ -0,0 +1,2 @@
+import { escapeRegExp } from "./index";
+export = escapeRegExp;
diff --git a/jtg js/node_modules/@types/lodash/every.d.ts b/jtg js/node_modules/@types/lodash/every.d.ts
new file mode 100644
index 0000000..d9717d4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/every.d.ts	
@@ -0,0 +1,2 @@
+import { every } from "./index";
+export = every;
diff --git a/jtg js/node_modules/@types/lodash/extend.d.ts b/jtg js/node_modules/@types/lodash/extend.d.ts
new file mode 100644
index 0000000..1b3107a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/extend.d.ts	
@@ -0,0 +1,2 @@
+import { extend } from "./index";
+export = extend;
diff --git a/jtg js/node_modules/@types/lodash/extendWith.d.ts b/jtg js/node_modules/@types/lodash/extendWith.d.ts
new file mode 100644
index 0000000..99ca5d0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/extendWith.d.ts	
@@ -0,0 +1,2 @@
+import { extendWith } from "./index";
+export = extendWith;
diff --git a/jtg js/node_modules/@types/lodash/fill.d.ts b/jtg js/node_modules/@types/lodash/fill.d.ts
new file mode 100644
index 0000000..f595dfc
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fill.d.ts	
@@ -0,0 +1,2 @@
+import { fill } from "./index";
+export = fill;
diff --git a/jtg js/node_modules/@types/lodash/filter.d.ts b/jtg js/node_modules/@types/lodash/filter.d.ts
new file mode 100644
index 0000000..a4496de
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/filter.d.ts	
@@ -0,0 +1,2 @@
+import { filter } from "./index";
+export = filter;
diff --git a/jtg js/node_modules/@types/lodash/find.d.ts b/jtg js/node_modules/@types/lodash/find.d.ts
new file mode 100644
index 0000000..e8da4b4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/find.d.ts	
@@ -0,0 +1,2 @@
+import { find } from "./index";
+export = find;
diff --git a/jtg js/node_modules/@types/lodash/findIndex.d.ts b/jtg js/node_modules/@types/lodash/findIndex.d.ts
new file mode 100644
index 0000000..6b72444
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/findIndex.d.ts	
@@ -0,0 +1,2 @@
+import { findIndex } from "./index";
+export = findIndex;
diff --git a/jtg js/node_modules/@types/lodash/findKey.d.ts b/jtg js/node_modules/@types/lodash/findKey.d.ts
new file mode 100644
index 0000000..90230b4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/findKey.d.ts	
@@ -0,0 +1,2 @@
+import { findKey } from "./index";
+export = findKey;
diff --git a/jtg js/node_modules/@types/lodash/findLast.d.ts b/jtg js/node_modules/@types/lodash/findLast.d.ts
new file mode 100644
index 0000000..c4f24fc
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/findLast.d.ts	
@@ -0,0 +1,2 @@
+import { findLast } from "./index";
+export = findLast;
diff --git a/jtg js/node_modules/@types/lodash/findLastIndex.d.ts b/jtg js/node_modules/@types/lodash/findLastIndex.d.ts
new file mode 100644
index 0000000..21856e5
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/findLastIndex.d.ts	
@@ -0,0 +1,2 @@
+import { findLastIndex } from "./index";
+export = findLastIndex;
diff --git a/jtg js/node_modules/@types/lodash/findLastKey.d.ts b/jtg js/node_modules/@types/lodash/findLastKey.d.ts
new file mode 100644
index 0000000..ed7ff79
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/findLastKey.d.ts	
@@ -0,0 +1,2 @@
+import { findLastKey } from "./index";
+export = findLastKey;
diff --git a/jtg js/node_modules/@types/lodash/first.d.ts b/jtg js/node_modules/@types/lodash/first.d.ts
new file mode 100644
index 0000000..fd1cda7
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/first.d.ts	
@@ -0,0 +1,2 @@
+import { first } from "./index";
+export = first;
diff --git a/jtg js/node_modules/@types/lodash/flatMap.d.ts b/jtg js/node_modules/@types/lodash/flatMap.d.ts
new file mode 100644
index 0000000..0057053
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/flatMap.d.ts	
@@ -0,0 +1,2 @@
+import { flatMap } from "./index";
+export = flatMap;
diff --git a/jtg js/node_modules/@types/lodash/flatMapDeep.d.ts b/jtg js/node_modules/@types/lodash/flatMapDeep.d.ts
new file mode 100644
index 0000000..c65639a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/flatMapDeep.d.ts	
@@ -0,0 +1,2 @@
+import { flatMapDeep } from "./index";
+export = flatMapDeep;
diff --git a/jtg js/node_modules/@types/lodash/flatMapDepth.d.ts b/jtg js/node_modules/@types/lodash/flatMapDepth.d.ts
new file mode 100644
index 0000000..7ec1853
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/flatMapDepth.d.ts	
@@ -0,0 +1,2 @@
+import { flatMapDepth } from "./index";
+export = flatMapDepth;
diff --git a/jtg js/node_modules/@types/lodash/flatten.d.ts b/jtg js/node_modules/@types/lodash/flatten.d.ts
new file mode 100644
index 0000000..43ac0f4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/flatten.d.ts	
@@ -0,0 +1,2 @@
+import { flatten } from "./index";
+export = flatten;
diff --git a/jtg js/node_modules/@types/lodash/flattenDeep.d.ts b/jtg js/node_modules/@types/lodash/flattenDeep.d.ts
new file mode 100644
index 0000000..df08bfa
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/flattenDeep.d.ts	
@@ -0,0 +1,2 @@
+import { flattenDeep } from "./index";
+export = flattenDeep;
diff --git a/jtg js/node_modules/@types/lodash/flattenDepth.d.ts b/jtg js/node_modules/@types/lodash/flattenDepth.d.ts
new file mode 100644
index 0000000..f6be541
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/flattenDepth.d.ts	
@@ -0,0 +1,2 @@
+import { flattenDepth } from "./index";
+export = flattenDepth;
diff --git a/jtg js/node_modules/@types/lodash/flip.d.ts b/jtg js/node_modules/@types/lodash/flip.d.ts
new file mode 100644
index 0000000..48c9924
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/flip.d.ts	
@@ -0,0 +1,2 @@
+import { flip } from "./index";
+export = flip;
diff --git a/jtg js/node_modules/@types/lodash/floor.d.ts b/jtg js/node_modules/@types/lodash/floor.d.ts
new file mode 100644
index 0000000..a101e5d
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/floor.d.ts	
@@ -0,0 +1,2 @@
+import { floor } from "./index";
+export = floor;
diff --git a/jtg js/node_modules/@types/lodash/flow.d.ts b/jtg js/node_modules/@types/lodash/flow.d.ts
new file mode 100644
index 0000000..37af0d4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/flow.d.ts	
@@ -0,0 +1,2 @@
+import { flow } from "./index";
+export = flow;
diff --git a/jtg js/node_modules/@types/lodash/flowRight.d.ts b/jtg js/node_modules/@types/lodash/flowRight.d.ts
new file mode 100644
index 0000000..6c63f3e
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/flowRight.d.ts	
@@ -0,0 +1,2 @@
+import { flowRight } from "./index";
+export = flowRight;
diff --git a/jtg js/node_modules/@types/lodash/forEach.d.ts b/jtg js/node_modules/@types/lodash/forEach.d.ts
new file mode 100644
index 0000000..8416aab
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/forEach.d.ts	
@@ -0,0 +1,2 @@
+import { forEach } from "./index";
+export = forEach;
diff --git a/jtg js/node_modules/@types/lodash/forEachRight.d.ts b/jtg js/node_modules/@types/lodash/forEachRight.d.ts
new file mode 100644
index 0000000..af65b5c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/forEachRight.d.ts	
@@ -0,0 +1,2 @@
+import { forEachRight } from "./index";
+export = forEachRight;
diff --git a/jtg js/node_modules/@types/lodash/forIn.d.ts b/jtg js/node_modules/@types/lodash/forIn.d.ts
new file mode 100644
index 0000000..77d6f48
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/forIn.d.ts	
@@ -0,0 +1,2 @@
+import { forIn } from "./index";
+export = forIn;
diff --git a/jtg js/node_modules/@types/lodash/forInRight.d.ts b/jtg js/node_modules/@types/lodash/forInRight.d.ts
new file mode 100644
index 0000000..d732969
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/forInRight.d.ts	
@@ -0,0 +1,2 @@
+import { forInRight } from "./index";
+export = forInRight;
diff --git a/jtg js/node_modules/@types/lodash/forOwn.d.ts b/jtg js/node_modules/@types/lodash/forOwn.d.ts
new file mode 100644
index 0000000..dfa930f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/forOwn.d.ts	
@@ -0,0 +1,2 @@
+import { forOwn } from "./index";
+export = forOwn;
diff --git a/jtg js/node_modules/@types/lodash/forOwnRight.d.ts b/jtg js/node_modules/@types/lodash/forOwnRight.d.ts
new file mode 100644
index 0000000..fddde6a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/forOwnRight.d.ts	
@@ -0,0 +1,2 @@
+import { forOwnRight } from "./index";
+export = forOwnRight;
diff --git a/jtg js/node_modules/@types/lodash/fp.d.ts b/jtg js/node_modules/@types/lodash/fp.d.ts
new file mode 100644
index 0000000..c799bd7
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp.d.ts	
@@ -0,0 +1,4765 @@
+// AUTO-GENERATED: do not modify this file directly.
+// If you need to make changes, modify generate-fp.ts (if necessary), then open a terminal in types/lodash/scripts, and do:
+// npm install && npm run generate
+
+import lodash = require("./index");
+
+export = _;
+
+declare const _: _.LoDashFp;
+declare namespace _ {
+    interface LodashAdd {
+        (augend: number): LodashAdd1x1;
+        (augend: lodash.__, addend: number): LodashAdd1x2;
+        (augend: number, addend: number): number;
+    }
+    type LodashAdd1x1 = (addend: number) => number;
+    type LodashAdd1x2 = (augend: number) => number;
+    interface LodashAfter {
+        <TFunc extends (...args: any[]) => any>(func: TFunc): LodashAfter1x1<TFunc>;
+        (func: lodash.__, n: number): LodashAfter1x2;
+        <TFunc extends (...args: any[]) => any>(func: TFunc, n: number): TFunc;
+    }
+    type LodashAfter1x1<TFunc> = (n: number) => TFunc;
+    type LodashAfter1x2 = <TFunc extends (...args: any[]) => any>(func: TFunc) => TFunc;
+    interface LodashEvery {
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>): LodashEvery1x1<T>;
+        <T>(predicate: lodash.__, collection: lodash.List<T> | null | undefined): LodashEvery1x2<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, collection: lodash.List<T> | null | undefined): boolean;
+        <T extends object>(predicate: lodash.__, collection: T | null | undefined): LodashEvery2x2<T>;
+        <T extends object>(predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>, collection: T | null | undefined): boolean;
+    }
+    type LodashEvery1x1<T> = (collection: lodash.List<T> | object | null | undefined) => boolean;
+    type LodashEvery1x2<T> = (predicate: lodash.ValueIterateeCustom<T, boolean>) => boolean;
+    type LodashEvery2x2<T> = (predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>) => boolean;
+    type LodashOverEvery = <T>(predicates: lodash.Many<(...args: T[]) => boolean>) => (...args: T[]) => boolean;
+    type LodashConstant = <T>(value: T) => () => T;
+    interface LodashSome {
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>): LodashSome1x1<T>;
+        <T>(predicate: lodash.__, collection: lodash.List<T> | null | undefined): LodashSome1x2<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, collection: lodash.List<T> | null | undefined): boolean;
+        <T extends object>(predicate: lodash.__, collection: T | null | undefined): LodashSome2x2<T>;
+        <T extends object>(predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>, collection: T | null | undefined): boolean;
+    }
+    type LodashSome1x1<T> = (collection: lodash.List<T> | object | null | undefined) => boolean;
+    type LodashSome1x2<T> = (predicate: lodash.ValueIterateeCustom<T, boolean>) => boolean;
+    type LodashSome2x2<T> = (predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>) => boolean;
+    type LodashOverSome = <T>(predicates: lodash.Many<(...args: T[]) => boolean>) => (...args: T[]) => boolean;
+    type LodashApply = <TResult>(func: (...args: any[]) => TResult) => (...args: any[]) => TResult;
+    interface LodashAry {
+        (n: number): LodashAry1x1;
+        (n: lodash.__, func: (...args: any[]) => any): LodashAry1x2;
+        (n: number, func: (...args: any[]) => any): (...args: any[]) => any;
+    }
+    type LodashAry1x1 = (func: (...args: any[]) => any) => (...args: any[]) => any;
+    type LodashAry1x2 = (n: number) => (...args: any[]) => any;
+    interface LodashAssign {
+        <TObject>(object: TObject): LodashAssign1x1<TObject>;
+        <TSource>(object: lodash.__, source: TSource): LodashAssign1x2<TSource>;
+        <TObject, TSource>(object: TObject, source: TSource): TObject & TSource;
+    }
+    type LodashAssign1x1<TObject> = <TSource>(source: TSource) => TObject & TSource;
+    type LodashAssign1x2<TSource> = <TObject>(object: TObject) => TObject & TSource;
+    interface LodashAssignAll {
+        <TObject, TSource>(object: [TObject, TSource]): TObject & TSource;
+        <TObject, TSource1, TSource2>(object: [TObject, TSource1, TSource2]): TObject & TSource1 & TSource2;
+        <TObject, TSource1, TSource2, TSource3>(object: [TObject, TSource1, TSource2, TSource3]): TObject & TSource1 & TSource2 & TSource3;
+        <TObject, TSource1, TSource2, TSource3, TSource4>(object: [TObject, TSource1, TSource2, TSource3, TSource4]): TObject & TSource1 & TSource2 & TSource3 & TSource4;
+        <TObject>(object: [TObject]): TObject;
+        (object: ReadonlyArray<any>): any;
+    }
+    interface LodashAssignAllWith {
+        (customizer: lodash.AssignCustomizer): LodashAssignAllWith1x1;
+        (customizer: lodash.__, args: ReadonlyArray<any>): LodashAssignAllWith1x2;
+        (customizer: lodash.AssignCustomizer, args: ReadonlyArray<any>): any;
+    }
+    type LodashAssignAllWith1x1 = (args: ReadonlyArray<any>) => any;
+    type LodashAssignAllWith1x2 = (customizer: lodash.AssignCustomizer) => any;
+    interface LodashAssignIn {
+        <TObject>(object: TObject): LodashAssignIn1x1<TObject>;
+        <TSource>(object: lodash.__, source: TSource): LodashAssignIn1x2<TSource>;
+        <TObject, TSource>(object: TObject, source: TSource): TObject & TSource;
+    }
+    type LodashAssignIn1x1<TObject> = <TSource>(source: TSource) => TObject & TSource;
+    type LodashAssignIn1x2<TSource> = <TObject>(object: TObject) => TObject & TSource;
+    interface LodashAssignInAll {
+        <TObject, TSource>(object: [TObject, TSource]): TObject & TSource;
+        <TObject, TSource1, TSource2>(object: [TObject, TSource1, TSource2]): TObject & TSource1 & TSource2;
+        <TObject, TSource1, TSource2, TSource3>(object: [TObject, TSource1, TSource2, TSource3]): TObject & TSource1 & TSource2 & TSource3;
+        <TObject, TSource1, TSource2, TSource3, TSource4>(object: [TObject, TSource1, TSource2, TSource3, TSource4]): TObject & TSource1 & TSource2 & TSource3 & TSource4;
+        <TObject>(object: [TObject]): TObject;
+        <TResult>(object: ReadonlyArray<any>): TResult;
+    }
+    interface LodashAssignInAllWith {
+        (customizer: lodash.AssignCustomizer): LodashAssignInAllWith1x1;
+        (customizer: lodash.__, args: ReadonlyArray<any>): LodashAssignInAllWith1x2;
+        (customizer: lodash.AssignCustomizer, args: ReadonlyArray<any>): any;
+    }
+    type LodashAssignInAllWith1x1 = (args: ReadonlyArray<any>) => any;
+    type LodashAssignInAllWith1x2 = (customizer: lodash.AssignCustomizer) => any;
+    interface LodashAssignInWith {
+        (customizer: lodash.AssignCustomizer): LodashAssignInWith1x1;
+        <TObject>(customizer: lodash.__, object: TObject): LodashAssignInWith1x2<TObject>;
+        <TObject>(customizer: lodash.AssignCustomizer, object: TObject): LodashAssignInWith1x3<TObject>;
+        <TSource>(customizer: lodash.__, object: lodash.__, source: TSource): LodashAssignInWith1x4<TSource>;
+        <TSource>(customizer: lodash.AssignCustomizer, object: lodash.__, source: TSource): LodashAssignInWith1x5<TSource>;
+        <TObject, TSource>(customizer: lodash.__, object: TObject, source: TSource): LodashAssignInWith1x6<TObject, TSource>;
+        <TObject, TSource>(customizer: lodash.AssignCustomizer, object: TObject, source: TSource): TObject & TSource;
+    }
+    interface LodashAssignInWith1x1 {
+        <TObject>(object: TObject): LodashAssignInWith1x3<TObject>;
+        <TSource>(object: lodash.__, source: TSource): LodashAssignInWith1x5<TSource>;
+        <TObject, TSource>(object: TObject, source: TSource): TObject & TSource;
+    }
+    interface LodashAssignInWith1x2<TObject> {
+        (customizer: lodash.AssignCustomizer): LodashAssignInWith1x3<TObject>;
+        <TSource>(customizer: lodash.__, source: TSource): LodashAssignInWith1x6<TObject, TSource>;
+        <TSource>(customizer: lodash.AssignCustomizer, source: TSource): TObject & TSource;
+    }
+    type LodashAssignInWith1x3<TObject> = <TSource>(source: TSource) => TObject & TSource;
+    interface LodashAssignInWith1x4<TSource> {
+        (customizer: lodash.AssignCustomizer): LodashAssignInWith1x5<TSource>;
+        <TObject>(customizer: lodash.__, object: TObject): LodashAssignInWith1x6<TObject, TSource>;
+        <TObject>(customizer: lodash.AssignCustomizer, object: TObject): TObject & TSource;
+    }
+    type LodashAssignInWith1x5<TSource> = <TObject>(object: TObject) => TObject & TSource;
+    type LodashAssignInWith1x6<TObject, TSource> = (customizer: lodash.AssignCustomizer) => TObject & TSource;
+    interface LodashAssignWith {
+        (customizer: lodash.AssignCustomizer): LodashAssignWith1x1;
+        <TObject>(customizer: lodash.__, object: TObject): LodashAssignWith1x2<TObject>;
+        <TObject>(customizer: lodash.AssignCustomizer, object: TObject): LodashAssignWith1x3<TObject>;
+        <TSource>(customizer: lodash.__, object: lodash.__, source: TSource): LodashAssignWith1x4<TSource>;
+        <TSource>(customizer: lodash.AssignCustomizer, object: lodash.__, source: TSource): LodashAssignWith1x5<TSource>;
+        <TObject, TSource>(customizer: lodash.__, object: TObject, source: TSource): LodashAssignWith1x6<TObject, TSource>;
+        <TObject, TSource>(customizer: lodash.AssignCustomizer, object: TObject, source: TSource): TObject & TSource;
+    }
+    interface LodashAssignWith1x1 {
+        <TObject>(object: TObject): LodashAssignWith1x3<TObject>;
+        <TSource>(object: lodash.__, source: TSource): LodashAssignWith1x5<TSource>;
+        <TObject, TSource>(object: TObject, source: TSource): TObject & TSource;
+    }
+    interface LodashAssignWith1x2<TObject> {
+        (customizer: lodash.AssignCustomizer): LodashAssignWith1x3<TObject>;
+        <TSource>(customizer: lodash.__, source: TSource): LodashAssignWith1x6<TObject, TSource>;
+        <TSource>(customizer: lodash.AssignCustomizer, source: TSource): TObject & TSource;
+    }
+    type LodashAssignWith1x3<TObject> = <TSource>(source: TSource) => TObject & TSource;
+    interface LodashAssignWith1x4<TSource> {
+        (customizer: lodash.AssignCustomizer): LodashAssignWith1x5<TSource>;
+        <TObject>(customizer: lodash.__, object: TObject): LodashAssignWith1x6<TObject, TSource>;
+        <TObject>(customizer: lodash.AssignCustomizer, object: TObject): TObject & TSource;
+    }
+    type LodashAssignWith1x5<TSource> = <TObject>(object: TObject) => TObject & TSource;
+    type LodashAssignWith1x6<TObject, TSource> = (customizer: lodash.AssignCustomizer) => TObject & TSource;
+    interface LodashSet {
+        (path: lodash.PropertyPath): LodashSet1x1;
+        (path: lodash.__, value: any): LodashSet1x2;
+        (path: lodash.PropertyPath, value: any): LodashSet1x3;
+        <T extends object>(path: lodash.__, value: lodash.__, object: T): LodashSet1x4<T>;
+        <T extends object>(path: lodash.PropertyPath, value: lodash.__, object: T): LodashSet1x5<T>;
+        <T extends object>(path: lodash.__, value: any, object: T): LodashSet1x6<T>;
+        <T extends object>(path: lodash.PropertyPath, value: any, object: T): T;
+        (path: lodash.__, value: lodash.__, object: object): LodashSet2x4;
+        (path: lodash.PropertyPath, value: lodash.__, object: object): LodashSet2x5;
+        (path: lodash.__, value: any, object: object): LodashSet2x6;
+        <TResult>(path: lodash.PropertyPath, value: any, object: object): TResult;
+    }
+    interface LodashSet1x1 {
+        (value: any): LodashSet1x3;
+        <T extends object>(value: lodash.__, object: T): LodashSet1x5<T>;
+        <T extends object>(value: any, object: T): T;
+        (value: lodash.__, object: object): LodashSet2x5;
+        <TResult>(value: any, object: object): TResult;
+    }
+    interface LodashSet1x2 {
+        (path: lodash.PropertyPath): LodashSet1x3;
+        <T extends object>(path: lodash.__, object: T): LodashSet1x6<T>;
+        <T extends object>(path: lodash.PropertyPath, object: T): T;
+        (path: lodash.__, object: object): LodashSet2x6;
+        <TResult>(path: lodash.PropertyPath, object: object): TResult;
+    }
+    interface LodashSet1x3 {
+        <T extends object>(object: T): T;
+        <TResult>(object: object): TResult;
+    }
+    interface LodashSet1x4<T> {
+        (path: lodash.PropertyPath): LodashSet1x5<T>;
+        (path: lodash.__, value: any): LodashSet1x6<T>;
+        (path: lodash.PropertyPath, value: any): T;
+    }
+    type LodashSet1x5<T> = (value: any) => T;
+    type LodashSet1x6<T> = (path: lodash.PropertyPath) => T;
+    interface LodashSet2x4 {
+        (path: lodash.PropertyPath): LodashSet2x5;
+        (path: lodash.__, value: any): LodashSet2x6;
+        <TResult>(path: lodash.PropertyPath, value: any): TResult;
+    }
+    type LodashSet2x5 = <TResult>(value: any) => TResult;
+    type LodashSet2x6 = <TResult>(path: lodash.PropertyPath) => TResult;
+    interface LodashAt {
+        (props: lodash.PropertyPath): LodashAt1x1;
+        <T>(props: lodash.__, object: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): LodashAt1x2<T>;
+        <T>(props: lodash.PropertyPath, object: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): T[];
+        <T extends object>(props: lodash.Many<keyof T>): LodashAt2x1<T>;
+        <T extends object>(props: lodash.__, object: T | null | undefined): LodashAt2x2<T>;
+        <T extends object>(props: lodash.Many<keyof T>, object: T | null | undefined): Array<T[keyof T]>;
+    }
+    type LodashAt1x1 = <T>(object: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined) => T[];
+    type LodashAt1x2<T> = (props: lodash.PropertyPath) => T[];
+    type LodashAt2x1<T> = (object: T | null | undefined) => Array<T[keyof T]>;
+    type LodashAt2x2<T> = (props: lodash.Many<keyof T>) => Array<T[keyof T]>;
+    type LodashAttempt = <TResult>(func: (...args: any[]) => TResult) => TResult|Error;
+    interface LodashBefore {
+        <TFunc extends (...args: any[]) => any>(func: TFunc): LodashBefore1x1<TFunc>;
+        (func: lodash.__, n: number): LodashBefore1x2;
+        <TFunc extends (...args: any[]) => any>(func: TFunc, n: number): TFunc;
+    }
+    type LodashBefore1x1<TFunc> = (n: number) => TFunc;
+    type LodashBefore1x2 = <TFunc extends (...args: any[]) => any>(func: TFunc) => TFunc;
+    interface LodashBind {
+        (func: (...args: any[]) => any): LodashBind1x1;
+        (func: lodash.__, thisArg: any): LodashBind1x2;
+        (func: (...args: any[]) => any, thisArg: any): (...args: any[]) => any;
+        placeholder: lodash.__;
+    }
+    type LodashBind1x1 = (thisArg: any) => (...args: any[]) => any;
+    type LodashBind1x2 = (func: (...args: any[]) => any) => (...args: any[]) => any;
+    interface LodashBindAll {
+        (methodNames: lodash.Many<string>): LodashBindAll1x1;
+        <T>(methodNames: lodash.__, object: T): LodashBindAll1x2<T>;
+        <T>(methodNames: lodash.Many<string>, object: T): T;
+    }
+    type LodashBindAll1x1 = <T>(object: T) => T;
+    type LodashBindAll1x2<T> = (methodNames: lodash.Many<string>) => T;
+    interface LodashBindKey {
+        (object: object): LodashBindKey1x1;
+        (object: lodash.__, key: string): LodashBindKey1x2;
+        (object: object, key: string): (...args: any[]) => any;
+        placeholder: lodash.__;
+    }
+    type LodashBindKey1x1 = (key: string) => (...args: any[]) => any;
+    type LodashBindKey1x2 = (object: object) => (...args: any[]) => any;
+    type LodashCamelCase = (string: string) => string;
+    type LodashCapitalize = (string: string) => string;
+    type LodashCastArray = <T>(value: lodash.Many<T>) => T[];
+    type LodashCeil = (n: number) => number;
+    interface LodashChunk {
+        (size: number): LodashChunk1x1;
+        <T>(size: lodash.__, array: lodash.List<T> | null | undefined): LodashChunk1x2<T>;
+        <T>(size: number, array: lodash.List<T> | null | undefined): T[][];
+    }
+    type LodashChunk1x1 = <T>(array: lodash.List<T> | null | undefined) => T[][];
+    type LodashChunk1x2<T> = (size: number) => T[][];
+    interface LodashClamp {
+        (lower: number): LodashClamp1x1;
+        (lower: lodash.__, upper: number): LodashClamp1x2;
+        (lower: number, upper: number): LodashClamp1x3;
+        (lower: lodash.__, upper: lodash.__, number: number): LodashClamp1x4;
+        (lower: number, upper: lodash.__, number: number): LodashClamp1x5;
+        (lower: lodash.__, upper: number, number: number): LodashClamp1x6;
+        (lower: number, upper: number, number: number): number;
+    }
+    interface LodashClamp1x1 {
+        (upper: number): LodashClamp1x3;
+        (upper: lodash.__, number: number): LodashClamp1x5;
+        (upper: number, number: number): number;
+    }
+    interface LodashClamp1x2 {
+        (lower: number): LodashClamp1x3;
+        (lower: lodash.__, number: number): LodashClamp1x6;
+        (lower: number, number: number): number;
+    }
+    type LodashClamp1x3 = (number: number) => number;
+    interface LodashClamp1x4 {
+        (lower: number): LodashClamp1x5;
+        (lower: lodash.__, upper: number): LodashClamp1x6;
+        (lower: number, upper: number): number;
+    }
+    type LodashClamp1x5 = (upper: number) => number;
+    type LodashClamp1x6 = (lower: number) => number;
+    type LodashClone = <T>(value: T) => T;
+    type LodashCloneDeep = <T>(value: T) => T;
+    interface LodashCloneDeepWith {
+        <T>(customizer: lodash.CloneDeepWithCustomizer<T>): LodashCloneDeepWith1x1<T>;
+        <T>(customizer: lodash.__, value: T): LodashCloneDeepWith1x2<T>;
+        <T>(customizer: lodash.CloneDeepWithCustomizer<T>, value: T): any;
+    }
+    type LodashCloneDeepWith1x1<T> = (value: T) => any;
+    type LodashCloneDeepWith1x2<T> = (customizer: lodash.CloneDeepWithCustomizer<T>) => any;
+    interface LodashCloneWith {
+        <T, TResult extends object | string | number | boolean | null>(customizer: lodash.CloneWithCustomizer<T, TResult>): LodashCloneWith1x1<T, TResult>;
+        <T>(customizer: lodash.__, value: T): LodashCloneWith1x2<T>;
+        <T, TResult extends object | string | number | boolean | null>(customizer: lodash.CloneWithCustomizer<T, TResult>, value: T): TResult;
+        <T, TResult>(customizer: lodash.CloneWithCustomizer<T, TResult | undefined>): LodashCloneWith2x1<T, TResult>;
+        <T, TResult>(customizer: lodash.CloneWithCustomizer<T, TResult | undefined>, value: T): TResult | T;
+    }
+    type LodashCloneWith1x1<T, TResult> = (value: T) => TResult;
+    interface LodashCloneWith1x2<T> {
+        <TResult extends object | string | number | boolean | null>(customizer: lodash.CloneWithCustomizer<T, TResult>): TResult;
+        <TResult>(customizer: lodash.CloneWithCustomizer<T, TResult | undefined>): TResult | T;
+    }
+    type LodashCloneWith2x1<T, TResult> = (value: T) => TResult | T;
+    type LodashCompact = <T>(array: lodash.List<T | null | undefined | false | "" | 0> | null | undefined) => T[];
+    type LodashNegate = <T extends (...args: any[]) => any>(predicate: T) => T;
+    interface LodashFlowRight {
+        <R2, R1>(f2: (a: R1) => R2, f1: () => R1): () => R2;
+        <R3, R2, R1>(f3: (a: R2) => R3, f2: (a: R1) => R2, f1: () => R1): () => R3;
+        <R4, R3, R2, R1>(f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: () => R1): () => R4;
+        <R5, R4, R3, R2, R1>(f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: () => R1): () => R5;
+        <R6, R5, R4, R3, R2, R1>(f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: () => R1): () => R6;
+        <R7, R6, R5, R4, R3, R2, R1>(f7: (a: R6) => R7, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: () => R1): () => R7;
+        <A1, R2, R1>(f2: (a: R1) => R2, f1: (a1: A1) => R1): (a1: A1) => R2;
+        <A1, R3, R2, R1>(f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1) => R1): (a1: A1) => R3;
+        <A1, R4, R3, R2, R1>(f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1) => R1): (a1: A1) => R4;
+        <A1, R5, R4, R3, R2, R1>(f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1) => R1): (a1: A1) => R5;
+        <A1, R6, R5, R4, R3, R2, R1>(f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1) => R1): (a1: A1) => R6;
+        <A1, R7, R6, R5, R4, R3, R2, R1>(f7: (a: R6) => R7, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1) => R1): (a1: A1) => R7;
+        <A1, A2, R2, R1>(f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): (a1: A1, a2: A2) => R2;
+        <A1, A2, R3, R2, R1>(f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): (a1: A1, a2: A2) => R3;
+        <A1, A2, R4, R3, R2, R1>(f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): (a1: A1, a2: A2) => R4;
+        <A1, A2, R5, R4, R3, R2, R1>(f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): (a1: A1, a2: A2) => R5;
+        <A1, A2, R6, R5, R4, R3, R2, R1>(f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): (a1: A1, a2: A2) => R6;
+        <A1, A2, R7, R6, R5, R4, R3, R2, R1>(f7: (a: R6) => R7, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2) => R1): (a1: A1, a2: A2) => R7;
+        <A1, A2, A3, R2, R1>(f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): (a1: A1, a2: A2, a3: A3) => R2;
+        <A1, A2, A3, R3, R2, R1>(f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): (a1: A1, a2: A2, a3: A3) => R3;
+        <A1, A2, A3, R4, R3, R2, R1>(f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): (a1: A1, a2: A2, a3: A3) => R4;
+        <A1, A2, A3, R5, R4, R3, R2, R1>(f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): (a1: A1, a2: A2, a3: A3) => R5;
+        <A1, A2, A3, R6, R5, R4, R3, R2, R1>(f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): (a1: A1, a2: A2, a3: A3) => R6;
+        <A1, A2, A3, R7, R6, R5, R4, R3, R2, R1>(f7: (a: R6) => R7, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3) => R1): (a1: A1, a2: A2, a3: A3) => R7;
+        <A1, A2, A3, A4, R2, R1>(f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): (a1: A1, a2: A2, a3: A3, a4: A4) => R2;
+        <A1, A2, A3, A4, R3, R2, R1>(f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): (a1: A1, a2: A2, a3: A3, a4: A4) => R3;
+        <A1, A2, A3, A4, R4, R3, R2, R1>(f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): (a1: A1, a2: A2, a3: A3, a4: A4) => R4;
+        <A1, A2, A3, A4, R5, R4, R3, R2, R1>(f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): (a1: A1, a2: A2, a3: A3, a4: A4) => R5;
+        <A1, A2, A3, A4, R6, R5, R4, R3, R2, R1>(f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): (a1: A1, a2: A2, a3: A3, a4: A4) => R6;
+        <A1, A2, A3, A4, R7, R6, R5, R4, R3, R2, R1>(f7: (a: R6) => R7, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1): (a1: A1, a2: A2, a3: A3, a4: A4) => R7;
+        <R2, R1>(f2: (a: R1) => R2, f1: (...args: any[]) => R1): (...args: any[]) => R2;
+        <R3, R2, R1>(f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (...args: any[]) => R1): (...args: any[]) => R3;
+        <R4, R3, R2, R1>(f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (...args: any[]) => R1): (...args: any[]) => R4;
+        <R5, R4, R3, R2, R1>(f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (...args: any[]) => R1): (...args: any[]) => R5;
+        <R6, R5, R4, R3, R2, R1>(f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (...args: any[]) => R1): (...args: any[]) => R6;
+        <R7, R6, R5, R4, R3, R2, R1>(f7: (a: R6) => R7, f6: (a: R5) => R6, f5: (a: R4) => R5, f4: (a: R3) => R4, f3: (a: R2) => R3, f2: (a: R1) => R2, f1: (...args: any[]) => R1): (...args: any[]) => R7;
+        (f7: (a: any) => any, f6: (a: any) => any, f5: (a: any) => any, f4: (a: any) => any, f3: (a: any) => any, f2: (a: any) => any, f1: () => any, ...funcs: Array<lodash.Many<(...args: any[]) => any>>): (...args: any[]) => any;
+        (funcs: Array<lodash.Many<(...args: any[]) => any>>): (...args: any[]) => any;
+    }
+    interface LodashConcat {
+        <T>(array: lodash.Many<T>): LodashConcat1x1<T>;
+        <T>(array: lodash.__, values: lodash.Many<T>): LodashConcat1x2<T>;
+        <T>(array: lodash.Many<T>, values: lodash.Many<T>): T[];
+    }
+    type LodashConcat1x1<T> = (values: lodash.Many<T>) => T[];
+    type LodashConcat1x2<T> = (array: lodash.Many<T>) => T[];
+    type LodashCond = <T, R>(pairs: Array<lodash.CondPair<T, R>>) => (Target: T) => R;
+    interface LodashConformsTo {
+        <T>(source: lodash.ConformsPredicateObject<T>): LodashConformsTo1x1<T>;
+        <T>(source: lodash.__, object: T): LodashConformsTo1x2<T>;
+        <T>(source: lodash.ConformsPredicateObject<T>, object: T): boolean;
+    }
+    type LodashConformsTo1x1<T> = (object: T) => boolean;
+    type LodashConformsTo1x2<T> = (source: lodash.ConformsPredicateObject<T>) => boolean;
+    interface LodashContains {
+        <T>(target: T): LodashContains1x1<T>;
+        <T>(target: lodash.__, collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): LodashContains1x2<T>;
+        <T>(target: T, collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): boolean;
+    }
+    type LodashContains1x1<T> = (collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined) => boolean;
+    type LodashContains1x2<T> = (target: T) => boolean;
+    interface LodashCountBy {
+        <T>(iteratee: lodash.ValueIteratee<T>): LodashCountBy1x1<T>;
+        <T>(iteratee: lodash.__, collection: lodash.List<T> | null | undefined): LodashCountBy1x2<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, collection: lodash.List<T> | null | undefined): lodash.Dictionary<number>;
+        <T extends object>(iteratee: lodash.__, collection: T | null | undefined): LodashCountBy2x2<T>;
+        <T extends object>(iteratee: lodash.ValueIteratee<T[keyof T]>, collection: T | null | undefined): lodash.Dictionary<number>;
+    }
+    type LodashCountBy1x1<T> = (collection: lodash.List<T> | object | null | undefined) => lodash.Dictionary<number>;
+    type LodashCountBy1x2<T> = (iteratee: lodash.ValueIteratee<T>) => lodash.Dictionary<number>;
+    type LodashCountBy2x2<T> = (iteratee: lodash.ValueIteratee<T[keyof T]>) => lodash.Dictionary<number>;
+    type LodashCreate = <T extends object, U extends object>(prototype: T) => T & U;
+    interface LodashCurry {
+        <T1, R>(func: (t1: T1) => R): lodash.CurriedFunction1<T1, R>;
+        <T1, T2, R>(func: (t1: T1, t2: T2) => R): lodash.CurriedFunction2<T1, T2, R>;
+        <T1, T2, T3, R>(func: (t1: T1, t2: T2, t3: T3) => R): lodash.CurriedFunction3<T1, T2, T3, R>;
+        <T1, T2, T3, T4, R>(func: (t1: T1, t2: T2, t3: T3, t4: T4) => R): lodash.CurriedFunction4<T1, T2, T3, T4, R>;
+        <T1, T2, T3, T4, T5, R>(func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5) => R): lodash.CurriedFunction5<T1, T2, T3, T4, T5, R>;
+        (func: (...args: any[]) => any): (...args: any[]) => any;
+        placeholder: lodash.__;
+    }
+    interface LodashCurryN {
+        (arity: number): LodashCurryN1x1;
+        <T1, R>(arity: lodash.__, func: (t1: T1) => R): LodashCurryN1x2<T1, R>;
+        <T1, R>(arity: number, func: (t1: T1) => R): lodash.CurriedFunction1<T1, R>;
+        <T1, T2, R>(arity: lodash.__, func: (t1: T1, t2: T2) => R): LodashCurryN2x2<T1, T2, R>;
+        <T1, T2, R>(arity: number, func: (t1: T1, t2: T2) => R): lodash.CurriedFunction2<T1, T2, R>;
+        <T1, T2, T3, R>(arity: lodash.__, func: (t1: T1, t2: T2, t3: T3) => R): LodashCurryN3x2<T1, T2, T3, R>;
+        <T1, T2, T3, R>(arity: number, func: (t1: T1, t2: T2, t3: T3) => R): lodash.CurriedFunction3<T1, T2, T3, R>;
+        <T1, T2, T3, T4, R>(arity: lodash.__, func: (t1: T1, t2: T2, t3: T3, t4: T4) => R): LodashCurryN4x2<T1, T2, T3, T4, R>;
+        <T1, T2, T3, T4, R>(arity: number, func: (t1: T1, t2: T2, t3: T3, t4: T4) => R): lodash.CurriedFunction4<T1, T2, T3, T4, R>;
+        <T1, T2, T3, T4, T5, R>(arity: lodash.__, func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5) => R): LodashCurryN5x2<T1, T2, T3, T4, T5, R>;
+        <T1, T2, T3, T4, T5, R>(arity: number, func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5) => R): lodash.CurriedFunction5<T1, T2, T3, T4, T5, R>;
+        (arity: lodash.__, func: (...args: any[]) => any): LodashCurryN6x2;
+        (arity: number, func: (...args: any[]) => any): (...args: any[]) => any;
+        placeholder: lodash.__;
+    }
+    interface LodashCurryN1x1 {
+        <T1, R>(func: (t1: T1) => R): lodash.CurriedFunction1<T1, R>;
+        <T1, T2, R>(func: (t1: T1, t2: T2) => R): lodash.CurriedFunction2<T1, T2, R>;
+        <T1, T2, T3, R>(func: (t1: T1, t2: T2, t3: T3) => R): lodash.CurriedFunction3<T1, T2, T3, R>;
+        <T1, T2, T3, T4, R>(func: (t1: T1, t2: T2, t3: T3, t4: T4) => R): lodash.CurriedFunction4<T1, T2, T3, T4, R>;
+        <T1, T2, T3, T4, T5, R>(func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5) => R): lodash.CurriedFunction5<T1, T2, T3, T4, T5, R>;
+        (func: (...args: any[]) => any): (...args: any[]) => any;
+    }
+    type LodashCurryN1x2<T1, R> = (arity: number) => lodash.CurriedFunction1<T1, R>;
+    type LodashCurryN2x2<T1, T2, R> = (arity: number) => lodash.CurriedFunction2<T1, T2, R>;
+    type LodashCurryN3x2<T1, T2, T3, R> = (arity: number) => lodash.CurriedFunction3<T1, T2, T3, R>;
+    type LodashCurryN4x2<T1, T2, T3, T4, R> = (arity: number) => lodash.CurriedFunction4<T1, T2, T3, T4, R>;
+    type LodashCurryN5x2<T1, T2, T3, T4, T5, R> = (arity: number) => lodash.CurriedFunction5<T1, T2, T3, T4, T5, R>;
+    type LodashCurryN6x2 = (arity: number) => (...args: any[]) => any;
+    interface LodashCurryRight {
+        <T1, R>(func: (t1: T1) => R): lodash.RightCurriedFunction1<T1, R>;
+        <T1, T2, R>(func: (t1: T1, t2: T2) => R): lodash.RightCurriedFunction2<T1, T2, R>;
+        <T1, T2, T3, R>(func: (t1: T1, t2: T2, t3: T3) => R): lodash.RightCurriedFunction3<T1, T2, T3, R>;
+        <T1, T2, T3, T4, R>(func: (t1: T1, t2: T2, t3: T3, t4: T4) => R): lodash.RightCurriedFunction4<T1, T2, T3, T4, R>;
+        <T1, T2, T3, T4, T5, R>(func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5) => R): lodash.RightCurriedFunction5<T1, T2, T3, T4, T5, R>;
+        (func: (...args: any[]) => any): (...args: any[]) => any;
+        placeholder: lodash.__;
+    }
+    interface LodashCurryRightN {
+        (arity: number): LodashCurryRightN1x1;
+        <T1, R>(arity: lodash.__, func: (t1: T1) => R): LodashCurryRightN1x2<T1, R>;
+        <T1, R>(arity: number, func: (t1: T1) => R): lodash.RightCurriedFunction1<T1, R>;
+        <T1, T2, R>(arity: lodash.__, func: (t1: T1, t2: T2) => R): LodashCurryRightN2x2<T1, T2, R>;
+        <T1, T2, R>(arity: number, func: (t1: T1, t2: T2) => R): lodash.RightCurriedFunction2<T1, T2, R>;
+        <T1, T2, T3, R>(arity: lodash.__, func: (t1: T1, t2: T2, t3: T3) => R): LodashCurryRightN3x2<T1, T2, T3, R>;
+        <T1, T2, T3, R>(arity: number, func: (t1: T1, t2: T2, t3: T3) => R): lodash.RightCurriedFunction3<T1, T2, T3, R>;
+        <T1, T2, T3, T4, R>(arity: lodash.__, func: (t1: T1, t2: T2, t3: T3, t4: T4) => R): LodashCurryRightN4x2<T1, T2, T3, T4, R>;
+        <T1, T2, T3, T4, R>(arity: number, func: (t1: T1, t2: T2, t3: T3, t4: T4) => R): lodash.RightCurriedFunction4<T1, T2, T3, T4, R>;
+        <T1, T2, T3, T4, T5, R>(arity: lodash.__, func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5) => R): LodashCurryRightN5x2<T1, T2, T3, T4, T5, R>;
+        <T1, T2, T3, T4, T5, R>(arity: number, func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5) => R): lodash.RightCurriedFunction5<T1, T2, T3, T4, T5, R>;
+        (arity: lodash.__, func: (...args: any[]) => any): LodashCurryRightN6x2;
+        (arity: number, func: (...args: any[]) => any): (...args: any[]) => any;
+        placeholder: lodash.__;
+    }
+    interface LodashCurryRightN1x1 {
+        <T1, R>(func: (t1: T1) => R): lodash.RightCurriedFunction1<T1, R>;
+        <T1, T2, R>(func: (t1: T1, t2: T2) => R): lodash.RightCurriedFunction2<T1, T2, R>;
+        <T1, T2, T3, R>(func: (t1: T1, t2: T2, t3: T3) => R): lodash.RightCurriedFunction3<T1, T2, T3, R>;
+        <T1, T2, T3, T4, R>(func: (t1: T1, t2: T2, t3: T3, t4: T4) => R): lodash.RightCurriedFunction4<T1, T2, T3, T4, R>;
+        <T1, T2, T3, T4, T5, R>(func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5) => R): lodash.RightCurriedFunction5<T1, T2, T3, T4, T5, R>;
+        (func: (...args: any[]) => any): (...args: any[]) => any;
+    }
+    type LodashCurryRightN1x2<T1, R> = (arity: number) => lodash.RightCurriedFunction1<T1, R>;
+    type LodashCurryRightN2x2<T1, T2, R> = (arity: number) => lodash.RightCurriedFunction2<T1, T2, R>;
+    type LodashCurryRightN3x2<T1, T2, T3, R> = (arity: number) => lodash.RightCurriedFunction3<T1, T2, T3, R>;
+    type LodashCurryRightN4x2<T1, T2, T3, T4, R> = (arity: number) => lodash.RightCurriedFunction4<T1, T2, T3, T4, R>;
+    type LodashCurryRightN5x2<T1, T2, T3, T4, T5, R> = (arity: number) => lodash.RightCurriedFunction5<T1, T2, T3, T4, T5, R>;
+    type LodashCurryRightN6x2 = (arity: number) => (...args: any[]) => any;
+    interface LodashDebounce {
+        (wait: number): LodashDebounce1x1;
+        <T extends (...args: any[]) => any>(wait: lodash.__, func: T): LodashDebounce1x2<T>;
+        <T extends (...args: any[]) => any>(wait: number, func: T): T & lodash.Cancelable;
+    }
+    type LodashDebounce1x1 = <T extends (...args: any[]) => any>(func: T) => T & lodash.Cancelable;
+    type LodashDebounce1x2<T> = (wait: number) => T & lodash.Cancelable;
+    type LodashDeburr = (string: string) => string;
+    interface LodashDefaults {
+        <TSource>(source: TSource): LodashDefaults1x1<TSource>;
+        <TObject>(source: lodash.__, object: TObject): LodashDefaults1x2<TObject>;
+        <TObject, TSource>(source: TSource, object: TObject): TSource & TObject;
+    }
+    type LodashDefaults1x1<TSource> = <TObject>(object: TObject) => TSource & TObject;
+    type LodashDefaults1x2<TObject> = <TSource>(source: TSource) => TSource & TObject;
+    interface LodashDefaultsAll {
+        <TObject, TSource>(object: [TObject, TSource]): TSource & TObject;
+        <TObject, TSource1, TSource2>(object: [TObject, TSource1, TSource2]): TSource2 & TSource1 & TObject;
+        <TObject, TSource1, TSource2, TSource3>(object: [TObject, TSource1, TSource2, TSource3]): TSource3 & TSource2 & TSource1 & TObject;
+        <TObject, TSource1, TSource2, TSource3, TSource4>(object: [TObject, TSource1, TSource2, TSource3, TSource4]): TSource4 & TSource3 & TSource2 & TSource1 & TObject;
+        <TObject>(object: [TObject]): TObject;
+        (object: ReadonlyArray<any>): any;
+    }
+    interface LodashDefaultsDeep {
+        (sources: any): LodashDefaultsDeep1x1;
+        (sources: lodash.__, object: any): LodashDefaultsDeep1x2;
+        (sources: any, object: any): any;
+    }
+    type LodashDefaultsDeep1x1 = (object: any) => any;
+    type LodashDefaultsDeep1x2 = (sources: any) => any;
+    type LodashDefaultsDeepAll = (object: ReadonlyArray<any>) => any;
+    interface LodashDefaultTo {
+        <T>(defaultValue: T): LodashDefaultTo1x1<T>;
+        <T>(defaultValue: lodash.__, value: T | null | undefined): LodashDefaultTo1x2<T>;
+        <T>(defaultValue: T, value: T | null | undefined): T;
+        <TDefault>(defaultValue: TDefault): LodashDefaultTo2x1<TDefault>;
+        <T, TDefault>(defaultValue: TDefault, value: T | null | undefined): T | TDefault;
+    }
+    type LodashDefaultTo1x1<T> = (value: T | null | undefined) => T;
+    interface LodashDefaultTo1x2<T> {
+        (defaultValue: T): T;
+        <TDefault>(defaultValue: TDefault): T | TDefault;
+    }
+    type LodashDefaultTo2x1<TDefault> = <T>(value: T | null | undefined) => T | TDefault;
+    type LodashDefer = (func: (...args: any[]) => any, ...args: any[]) => number;
+    interface LodashDelay {
+        (wait: number): LodashDelay1x1;
+        (wait: lodash.__, func: (...args: any[]) => any): LodashDelay1x2;
+        (wait: number, func: (...args: any[]) => any): number;
+    }
+    type LodashDelay1x1 = (func: (...args: any[]) => any) => number;
+    type LodashDelay1x2 = (wait: number) => number;
+    interface LodashDifference {
+        <T>(array: lodash.List<T> | null | undefined): LodashDifference1x1<T>;
+        <T>(array: lodash.__, values: lodash.List<T>): LodashDifference1x2<T>;
+        <T>(array: lodash.List<T> | null | undefined, values: lodash.List<T>): T[];
+    }
+    type LodashDifference1x1<T> = (values: lodash.List<T>) => T[];
+    type LodashDifference1x2<T> = (array: lodash.List<T> | null | undefined) => T[];
+    interface LodashDifferenceBy {
+        <T1, T2>(iteratee: lodash.ValueIteratee<T1 | T2>): LodashDifferenceBy1x1<T1, T2>;
+        <T1>(iteratee: lodash.__, array: lodash.List<T1> | null | undefined): LodashDifferenceBy1x2<T1>;
+        <T1, T2>(iteratee: lodash.ValueIteratee<T1 | T2>, array: lodash.List<T1> | null | undefined): LodashDifferenceBy1x3<T1, T2>;
+        <T2>(iteratee: lodash.__, array: lodash.__, values: lodash.List<T2>): LodashDifferenceBy1x4<T2>;
+        <T1, T2>(iteratee: lodash.ValueIteratee<T1 | T2>, array: lodash.__, values: lodash.List<T2>): LodashDifferenceBy1x5<T1>;
+        <T1, T2>(iteratee: lodash.__, array: lodash.List<T1> | null | undefined, values: lodash.List<T2>): LodashDifferenceBy1x6<T1, T2>;
+        <T1, T2>(iteratee: lodash.ValueIteratee<T1 | T2>, array: lodash.List<T1> | null | undefined, values: lodash.List<T2>): T1[];
+    }
+    interface LodashDifferenceBy1x1<T1, T2> {
+        (array: lodash.List<T1> | null | undefined): LodashDifferenceBy1x3<T1, T2>;
+        (array: lodash.__, values: lodash.List<T2>): LodashDifferenceBy1x5<T1>;
+        (array: lodash.List<T1> | null | undefined, values: lodash.List<T2>): T1[];
+    }
+    interface LodashDifferenceBy1x2<T1> {
+        <T2>(iteratee: lodash.ValueIteratee<T1 | T2>): LodashDifferenceBy1x3<T1, T2>;
+        <T2>(iteratee: lodash.__, values: lodash.List<T2>): LodashDifferenceBy1x6<T1, T2>;
+        <T2>(iteratee: lodash.ValueIteratee<T1 | T2>, values: lodash.List<T2>): T1[];
+    }
+    type LodashDifferenceBy1x3<T1, T2> = (values: lodash.List<T2>) => T1[];
+    interface LodashDifferenceBy1x4<T2> {
+        <T1>(iteratee: lodash.ValueIteratee<T1 | T2>): LodashDifferenceBy1x5<T1>;
+        <T1>(iteratee: lodash.__, array: lodash.List<T1> | null | undefined): LodashDifferenceBy1x6<T1, T2>;
+        <T1>(iteratee: lodash.ValueIteratee<T1 | T2>, array: lodash.List<T1> | null | undefined): T1[];
+    }
+    type LodashDifferenceBy1x5<T1> = (array: lodash.List<T1> | null | undefined) => T1[];
+    type LodashDifferenceBy1x6<T1, T2> = (iteratee: lodash.ValueIteratee<T1 | T2>) => T1[];
+    interface LodashDifferenceWith {
+        <T1, T2>(comparator: lodash.Comparator2<T1, T2>): LodashDifferenceWith1x1<T1, T2>;
+        <T1>(comparator: lodash.__, array: lodash.List<T1> | null | undefined): LodashDifferenceWith1x2<T1>;
+        <T1, T2>(comparator: lodash.Comparator2<T1, T2>, array: lodash.List<T1> | null | undefined): LodashDifferenceWith1x3<T1, T2>;
+        <T2>(comparator: lodash.__, array: lodash.__, values: lodash.List<T2>): LodashDifferenceWith1x4<T2>;
+        <T1, T2>(comparator: lodash.Comparator2<T1, T2>, array: lodash.__, values: lodash.List<T2>): LodashDifferenceWith1x5<T1>;
+        <T1, T2>(comparator: lodash.__, array: lodash.List<T1> | null | undefined, values: lodash.List<T2>): LodashDifferenceWith1x6<T1, T2>;
+        <T1, T2>(comparator: lodash.Comparator2<T1, T2>, array: lodash.List<T1> | null | undefined, values: lodash.List<T2>): T1[];
+    }
+    interface LodashDifferenceWith1x1<T1, T2> {
+        (array: lodash.List<T1> | null | undefined): LodashDifferenceWith1x3<T1, T2>;
+        (array: lodash.__, values: lodash.List<T2>): LodashDifferenceWith1x5<T1>;
+        (array: lodash.List<T1> | null | undefined, values: lodash.List<T2>): T1[];
+    }
+    interface LodashDifferenceWith1x2<T1> {
+        <T2>(comparator: lodash.Comparator2<T1, T2>): LodashDifferenceWith1x3<T1, T2>;
+        <T2>(comparator: lodash.__, values: lodash.List<T2>): LodashDifferenceWith1x6<T1, T2>;
+        <T2>(comparator: lodash.Comparator2<T1, T2>, values: lodash.List<T2>): T1[];
+    }
+    type LodashDifferenceWith1x3<T1, T2> = (values: lodash.List<T2>) => T1[];
+    interface LodashDifferenceWith1x4<T2> {
+        <T1>(comparator: lodash.Comparator2<T1, T2>): LodashDifferenceWith1x5<T1>;
+        <T1>(comparator: lodash.__, array: lodash.List<T1> | null | undefined): LodashDifferenceWith1x6<T1, T2>;
+        <T1>(comparator: lodash.Comparator2<T1, T2>, array: lodash.List<T1> | null | undefined): T1[];
+    }
+    type LodashDifferenceWith1x5<T1> = (array: lodash.List<T1> | null | undefined) => T1[];
+    type LodashDifferenceWith1x6<T1, T2> = (comparator: lodash.Comparator2<T1, T2>) => T1[];
+    interface LodashUnset {
+        (path: lodash.PropertyPath): LodashUnset1x1;
+        <T>(path: lodash.__, object: T): LodashUnset1x2<T>;
+        <T>(path: lodash.PropertyPath, object: T): T;
+    }
+    type LodashUnset1x1 = <T>(object: T) => T;
+    type LodashUnset1x2<T> = (path: lodash.PropertyPath) => T;
+    interface LodashDivide {
+        (dividend: number): LodashDivide1x1;
+        (dividend: lodash.__, divisor: number): LodashDivide1x2;
+        (dividend: number, divisor: number): number;
+    }
+    type LodashDivide1x1 = (divisor: number) => number;
+    type LodashDivide1x2 = (dividend: number) => number;
+    interface LodashDrop {
+        (n: number): LodashDrop1x1;
+        <T>(n: lodash.__, array: lodash.List<T> | null | undefined): LodashDrop1x2<T>;
+        <T>(n: number, array: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashDrop1x1 = <T>(array: lodash.List<T> | null | undefined) => T[];
+    type LodashDrop1x2<T> = (n: number) => T[];
+    interface LodashDropRight {
+        (n: number): LodashDropRight1x1;
+        <T>(n: lodash.__, array: lodash.List<T> | null | undefined): LodashDropRight1x2<T>;
+        <T>(n: number, array: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashDropRight1x1 = <T>(array: lodash.List<T> | null | undefined) => T[];
+    type LodashDropRight1x2<T> = (n: number) => T[];
+    interface LodashDropRightWhile {
+        <T>(predicate: lodash.ValueIteratee<T>): LodashDropRightWhile1x1<T>;
+        <T>(predicate: lodash.__, array: lodash.List<T> | null | undefined): LodashDropRightWhile1x2<T>;
+        <T>(predicate: lodash.ValueIteratee<T>, array: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashDropRightWhile1x1<T> = (array: lodash.List<T> | null | undefined) => T[];
+    type LodashDropRightWhile1x2<T> = (predicate: lodash.ValueIteratee<T>) => T[];
+    interface LodashDropWhile {
+        <T>(predicate: lodash.ValueIteratee<T>): LodashDropWhile1x1<T>;
+        <T>(predicate: lodash.__, array: lodash.List<T> | null | undefined): LodashDropWhile1x2<T>;
+        <T>(predicate: lodash.ValueIteratee<T>, array: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashDropWhile1x1<T> = (array: lodash.List<T> | null | undefined) => T[];
+    type LodashDropWhile1x2<T> = (predicate: lodash.ValueIteratee<T>) => T[];
+    interface LodashForEach {
+        <T>(iteratee: (value: T) => any): LodashForEach1x1<T>;
+        <T>(iteratee: lodash.__, collection: ReadonlyArray<T>): LodashForEach1x2<T>;
+        <T>(iteratee: (value: T) => any, collection: ReadonlyArray<T>): T[];
+        (iteratee: (value: string) => any): LodashForEach2x1;
+        (iteratee: lodash.__, collection: string): LodashForEach2x2;
+        (iteratee: (value: string) => any, collection: string): string;
+        <T>(iteratee: lodash.__, collection: lodash.List<T>): LodashForEach3x2<T>;
+        <T>(iteratee: (value: T) => any, collection: lodash.List<T>): lodash.List<T>;
+        <T extends object>(iteratee: lodash.__, collection: T): LodashForEach4x2<T>;
+        <T extends object>(iteratee: (value: T[keyof T]) => any, collection: T): T;
+        <T, TArray extends T[] | null | undefined>(iteratee: lodash.__, collection: TArray & (T[] | null | undefined)): LodashForEach5x2<T, TArray>;
+        <T, TArray extends T[] | null | undefined>(iteratee: (value: T) => any, collection: TArray & (T[] | null | undefined)): TArray;
+        <TString extends string | null | undefined>(iteratee: lodash.__, collection: TString): LodashForEach6x2<TString>;
+        <TString extends string | null | undefined>(iteratee: (value: string) => any, collection: TString): TString;
+        <T, TList extends lodash.List<T> | null | undefined>(iteratee: lodash.__, collection: TList & (lodash.List<T> | null | undefined)): LodashForEach7x2<T, TList>;
+        <T, TList extends lodash.List<T> | null | undefined>(iteratee: (value: T) => any, collection: TList & (lodash.List<T> | null | undefined)): TList;
+        <T extends object>(iteratee: lodash.__, collection: T | null | undefined): LodashForEach8x2<T>;
+        <T extends object>(iteratee: (value: T[keyof T]) => any, collection: T | null | undefined): T | null | undefined;
+    }
+    interface LodashForEach1x1<T> {
+        (collection: ReadonlyArray<T>): T[];
+        (collection: lodash.List<T>): lodash.List<T>;
+        <T1 extends object>(collection: T1): T1;
+        <TArray extends T[] | null | undefined>(collection: TArray & (T[] | null | undefined)): TArray;
+        <TList extends lodash.List<T> | null | undefined>(collection: TList & (lodash.List<T> | null | undefined)): TList;
+        <T1 extends object>(collection: T1 | null | undefined): T1 | null | undefined;
+    }
+    type LodashForEach1x2<T> = (iteratee: (value: T) => any) => T[];
+    interface LodashForEach2x1 {
+        (collection: string): string;
+        <TString extends string | null | undefined>(collection: TString): TString;
+    }
+    type LodashForEach2x2 = (iteratee: (value: string) => any) => string;
+    type LodashForEach3x2<T> = (iteratee: (value: T) => any) => lodash.List<T>;
+    type LodashForEach4x2<T> = (iteratee: (value: T[keyof T]) => any) => T;
+    type LodashForEach5x2<T, TArray> = (iteratee: (value: T) => any) => TArray;
+    type LodashForEach6x2<TString> = (iteratee: (value: string) => any) => TString;
+    type LodashForEach7x2<T, TList> = (iteratee: (value: T) => any) => TList;
+    type LodashForEach8x2<T> = (iteratee: (value: T[keyof T]) => any) => T | null | undefined;
+    interface LodashForEachRight {
+        <T>(iteratee: (value: T) => any): LodashForEachRight1x1<T>;
+        <T>(iteratee: lodash.__, collection: ReadonlyArray<T>): LodashForEachRight1x2<T>;
+        <T>(iteratee: (value: T) => any, collection: ReadonlyArray<T>): T[];
+        (iteratee: (value: string) => any): LodashForEachRight2x1;
+        (iteratee: lodash.__, collection: string): LodashForEachRight2x2;
+        (iteratee: (value: string) => any, collection: string): string;
+        <T>(iteratee: lodash.__, collection: lodash.List<T>): LodashForEachRight3x2<T>;
+        <T>(iteratee: (value: T) => any, collection: lodash.List<T>): lodash.List<T>;
+        <T extends object>(iteratee: lodash.__, collection: T): LodashForEachRight4x2<T>;
+        <T extends object>(iteratee: (value: T[keyof T]) => any, collection: T): T;
+        <T, TArray extends T[] | null | undefined>(iteratee: lodash.__, collection: TArray & (T[] | null | undefined)): LodashForEachRight5x2<T, TArray>;
+        <T, TArray extends T[] | null | undefined>(iteratee: (value: T) => any, collection: TArray & (T[] | null | undefined)): TArray;
+        <TString extends string | null | undefined>(iteratee: lodash.__, collection: TString): LodashForEachRight6x2<TString>;
+        <TString extends string | null | undefined>(iteratee: (value: string) => any, collection: TString): TString;
+        <T, TList extends lodash.List<T> | null | undefined>(iteratee: lodash.__, collection: TList & (lodash.List<T> | null | undefined)): LodashForEachRight7x2<T, TList>;
+        <T, TList extends lodash.List<T> | null | undefined>(iteratee: (value: T) => any, collection: TList & (lodash.List<T> | null | undefined)): TList;
+        <T extends object>(iteratee: lodash.__, collection: T | null | undefined): LodashForEachRight8x2<T>;
+        <T extends object>(iteratee: (value: T[keyof T]) => any, collection: T | null | undefined): T | null | undefined;
+    }
+    interface LodashForEachRight1x1<T> {
+        (collection: ReadonlyArray<T>): T[];
+        (collection: lodash.List<T>): lodash.List<T>;
+        <T1 extends object>(collection: T1): T1;
+        <TArray extends T[] | null | undefined>(collection: TArray & (T[] | null | undefined)): TArray;
+        <TList extends lodash.List<T> | null | undefined>(collection: TList & (lodash.List<T> | null | undefined)): TList;
+        <T1 extends object>(collection: T1 | null | undefined): T1 | null | undefined;
+    }
+    type LodashForEachRight1x2<T> = (iteratee: (value: T) => any) => T[];
+    interface LodashForEachRight2x1 {
+        (collection: string): string;
+        <TString extends string | null | undefined>(collection: TString): TString;
+    }
+    type LodashForEachRight2x2 = (iteratee: (value: string) => any) => string;
+    type LodashForEachRight3x2<T> = (iteratee: (value: T) => any) => lodash.List<T>;
+    type LodashForEachRight4x2<T> = (iteratee: (value: T[keyof T]) => any) => T;
+    type LodashForEachRight5x2<T, TArray> = (iteratee: (value: T) => any) => TArray;
+    type LodashForEachRight6x2<TString> = (iteratee: (value: string) => any) => TString;
+    type LodashForEachRight7x2<T, TList> = (iteratee: (value: T) => any) => TList;
+    type LodashForEachRight8x2<T> = (iteratee: (value: T[keyof T]) => any) => T | null | undefined;
+    interface LodashEndsWith {
+        (target: string): LodashEndsWith1x1;
+        (target: lodash.__, string: string): LodashEndsWith1x2;
+        (target: string, string: string): boolean;
+    }
+    type LodashEndsWith1x1 = (string: string) => boolean;
+    type LodashEndsWith1x2 = (target: string) => boolean;
+    interface LodashToPairs {
+        <T>(object: lodash.Dictionary<T> | lodash.NumericDictionary<T>): Array<[string, T]>;
+        (object: object): Array<[string, any]>;
+    }
+    interface LodashToPairsIn {
+        <T>(object: lodash.Dictionary<T> | lodash.NumericDictionary<T>): Array<[string, T]>;
+        (object: object): Array<[string, any]>;
+    }
+    interface LodashEq {
+        (value: any): LodashEq1x1;
+        (value: lodash.__, other: any): LodashEq1x2;
+        (value: any, other: any): boolean;
+    }
+    type LodashEq1x1 = (other: any) => boolean;
+    type LodashEq1x2 = (value: any) => boolean;
+    interface LodashIsEqual {
+        (value: any): LodashIsEqual1x1;
+        (value: lodash.__, other: any): LodashIsEqual1x2;
+        (value: any, other: any): boolean;
+    }
+    type LodashIsEqual1x1 = (other: any) => boolean;
+    type LodashIsEqual1x2 = (value: any) => boolean;
+    type LodashEscape = (string: string) => string;
+    type LodashEscapeRegExp = (string: string) => string;
+    interface LodashExtend {
+        <TObject>(object: TObject): LodashExtend1x1<TObject>;
+        <TSource>(object: lodash.__, source: TSource): LodashExtend1x2<TSource>;
+        <TObject, TSource>(object: TObject, source: TSource): TObject & TSource;
+    }
+    type LodashExtend1x1<TObject> = <TSource>(source: TSource) => TObject & TSource;
+    type LodashExtend1x2<TSource> = <TObject>(object: TObject) => TObject & TSource;
+    interface LodashExtendAll {
+        <TObject, TSource>(object: [TObject, TSource]): TObject & TSource;
+        <TObject, TSource1, TSource2>(object: [TObject, TSource1, TSource2]): TObject & TSource1 & TSource2;
+        <TObject, TSource1, TSource2, TSource3>(object: [TObject, TSource1, TSource2, TSource3]): TObject & TSource1 & TSource2 & TSource3;
+        <TObject, TSource1, TSource2, TSource3, TSource4>(object: [TObject, TSource1, TSource2, TSource3, TSource4]): TObject & TSource1 & TSource2 & TSource3 & TSource4;
+        <TObject>(object: [TObject]): TObject;
+        <TResult>(object: ReadonlyArray<any>): TResult;
+    }
+    interface LodashExtendAllWith {
+        (customizer: lodash.AssignCustomizer): LodashExtendAllWith1x1;
+        (customizer: lodash.__, args: ReadonlyArray<any>): LodashExtendAllWith1x2;
+        (customizer: lodash.AssignCustomizer, args: ReadonlyArray<any>): any;
+    }
+    type LodashExtendAllWith1x1 = (args: ReadonlyArray<any>) => any;
+    type LodashExtendAllWith1x2 = (customizer: lodash.AssignCustomizer) => any;
+    interface LodashExtendWith {
+        (customizer: lodash.AssignCustomizer): LodashExtendWith1x1;
+        <TObject>(customizer: lodash.__, object: TObject): LodashExtendWith1x2<TObject>;
+        <TObject>(customizer: lodash.AssignCustomizer, object: TObject): LodashExtendWith1x3<TObject>;
+        <TSource>(customizer: lodash.__, object: lodash.__, source: TSource): LodashExtendWith1x4<TSource>;
+        <TSource>(customizer: lodash.AssignCustomizer, object: lodash.__, source: TSource): LodashExtendWith1x5<TSource>;
+        <TObject, TSource>(customizer: lodash.__, object: TObject, source: TSource): LodashExtendWith1x6<TObject, TSource>;
+        <TObject, TSource>(customizer: lodash.AssignCustomizer, object: TObject, source: TSource): TObject & TSource;
+    }
+    interface LodashExtendWith1x1 {
+        <TObject>(object: TObject): LodashExtendWith1x3<TObject>;
+        <TSource>(object: lodash.__, source: TSource): LodashExtendWith1x5<TSource>;
+        <TObject, TSource>(object: TObject, source: TSource): TObject & TSource;
+    }
+    interface LodashExtendWith1x2<TObject> {
+        (customizer: lodash.AssignCustomizer): LodashExtendWith1x3<TObject>;
+        <TSource>(customizer: lodash.__, source: TSource): LodashExtendWith1x6<TObject, TSource>;
+        <TSource>(customizer: lodash.AssignCustomizer, source: TSource): TObject & TSource;
+    }
+    type LodashExtendWith1x3<TObject> = <TSource>(source: TSource) => TObject & TSource;
+    interface LodashExtendWith1x4<TSource> {
+        (customizer: lodash.AssignCustomizer): LodashExtendWith1x5<TSource>;
+        <TObject>(customizer: lodash.__, object: TObject): LodashExtendWith1x6<TObject, TSource>;
+        <TObject>(customizer: lodash.AssignCustomizer, object: TObject): TObject & TSource;
+    }
+    type LodashExtendWith1x5<TSource> = <TObject>(object: TObject) => TObject & TSource;
+    type LodashExtendWith1x6<TObject, TSource> = (customizer: lodash.AssignCustomizer) => TObject & TSource;
+    type LodashStubFalse = () => false;
+    interface LodashFill {
+        (start: number): LodashFill1x1;
+        (start: lodash.__, end: number): LodashFill1x2;
+        (start: number, end: number): LodashFill1x3;
+        <T>(start: lodash.__, end: lodash.__, value: T): LodashFill1x4<T>;
+        <T>(start: number, end: lodash.__, value: T): LodashFill1x5<T>;
+        <T>(start: lodash.__, end: number, value: T): LodashFill1x6<T>;
+        <T>(start: number, end: number, value: T): LodashFill1x7<T>;
+        <U>(start: lodash.__, end: lodash.__, value: lodash.__, array: U[] | null | undefined): LodashFill1x8<U>;
+        <U>(start: number, end: lodash.__, value: lodash.__, array: U[] | null | undefined): LodashFill1x9<U>;
+        <U>(start: lodash.__, end: number, value: lodash.__, array: U[] | null | undefined): LodashFill1x10<U>;
+        <U>(start: number, end: number, value: lodash.__, array: U[] | null | undefined): LodashFill1x11<U>;
+        <T, U>(start: lodash.__, end: lodash.__, value: T, array: U[] | null | undefined): LodashFill1x12<T, U>;
+        <T, U>(start: number, end: lodash.__, value: T, array: U[] | null | undefined): LodashFill1x13<T, U>;
+        <T, U>(start: lodash.__, end: number, value: T, array: U[] | null | undefined): LodashFill1x14<T, U>;
+        <T, U>(start: number, end: number, value: T, array: U[] | null | undefined): Array<T | U>;
+        <U>(start: lodash.__, end: lodash.__, value: lodash.__, array: lodash.List<U> | null | undefined): LodashFill2x8<U>;
+        <U>(start: number, end: lodash.__, value: lodash.__, array: lodash.List<U> | null | undefined): LodashFill2x9<U>;
+        <U>(start: lodash.__, end: number, value: lodash.__, array: lodash.List<U> | null | undefined): LodashFill2x10<U>;
+        <U>(start: number, end: number, value: lodash.__, array: lodash.List<U> | null | undefined): LodashFill2x11<U>;
+        <T, U>(start: lodash.__, end: lodash.__, value: T, array: lodash.List<U> | null | undefined): LodashFill2x12<T, U>;
+        <T, U>(start: number, end: lodash.__, value: T, array: lodash.List<U> | null | undefined): LodashFill2x13<T, U>;
+        <T, U>(start: lodash.__, end: number, value: T, array: lodash.List<U> | null | undefined): LodashFill2x14<T, U>;
+        <T, U>(start: number, end: number, value: T, array: lodash.List<U> | null | undefined): lodash.List<T | U>;
+    }
+    interface LodashFill1x1 {
+        (end: number): LodashFill1x3;
+        <T>(end: lodash.__, value: T): LodashFill1x5<T>;
+        <T>(end: number, value: T): LodashFill1x7<T>;
+        <U>(end: lodash.__, value: lodash.__, array: U[] | null | undefined): LodashFill1x9<U>;
+        <U>(end: number, value: lodash.__, array: U[] | null | undefined): LodashFill1x11<U>;
+        <T, U>(end: lodash.__, value: T, array: U[] | null | undefined): LodashFill1x13<T, U>;
+        <T, U>(end: number, value: T, array: U[] | null | undefined): Array<T | U>;
+        <U>(end: lodash.__, value: lodash.__, array: lodash.List<U> | null | undefined): LodashFill2x9<U>;
+        <U>(end: number, value: lodash.__, array: lodash.List<U> | null | undefined): LodashFill2x11<U>;
+        <T, U>(end: lodash.__, value: T, array: lodash.List<U> | null | undefined): LodashFill2x13<T, U>;
+        <T, U>(end: number, value: T, array: lodash.List<U> | null | undefined): lodash.List<T | U>;
+    }
+    interface LodashFill1x2 {
+        (start: number): LodashFill1x3;
+        <T>(start: lodash.__, value: T): LodashFill1x6<T>;
+        <T>(start: number, value: T): LodashFill1x7<T>;
+        <U>(start: lodash.__, value: lodash.__, array: U[] | null | undefined): LodashFill1x10<U>;
+        <U>(start: number, value: lodash.__, array: U[] | null | undefined): LodashFill1x11<U>;
+        <T, U>(start: lodash.__, value: T, array: U[] | null | undefined): LodashFill1x14<T, U>;
+        <T, U>(start: number, value: T, array: U[] | null | undefined): Array<T | U>;
+        <U>(start: lodash.__, value: lodash.__, array: lodash.List<U> | null | undefined): LodashFill2x10<U>;
+        <U>(start: number, value: lodash.__, array: lodash.List<U> | null | undefined): LodashFill2x11<U>;
+        <T, U>(start: lodash.__, value: T, array: lodash.List<U> | null | undefined): LodashFill2x14<T, U>;
+        <T, U>(start: number, value: T, array: lodash.List<U> | null | undefined): lodash.List<T | U>;
+    }
+    interface LodashFill1x3 {
+        <T>(value: T): LodashFill1x7<T>;
+        <U>(value: lodash.__, array: U[] | null | undefined): LodashFill1x11<U>;
+        <T, U>(value: T, array: U[] | null | undefined): Array<T | U>;
+        <U>(value: lodash.__, array: lodash.List<U> | null | undefined): LodashFill2x11<U>;
+        <T, U>(value: T, array: lodash.List<U> | null | undefined): lodash.List<T | U>;
+    }
+    interface LodashFill1x4<T> {
+        (start: number): LodashFill1x5<T>;
+        (start: lodash.__, end: number): LodashFill1x6<T>;
+        (start: number, end: number): LodashFill1x7<T>;
+        <U>(start: lodash.__, end: lodash.__, array: U[] | null | undefined): LodashFill1x12<T, U>;
+        <U>(start: number, end: lodash.__, array: U[] | null | undefined): LodashFill1x13<T, U>;
+        <U>(start: lodash.__, end: number, array: U[] | null | undefined): LodashFill1x14<T, U>;
+        <U>(start: number, end: number, array: U[] | null | undefined): Array<T | U>;
+        <U>(start: lodash.__, end: lodash.__, array: lodash.List<U> | null | undefined): LodashFill2x12<T, U>;
+        <U>(start: number, end: lodash.__, array: lodash.List<U> | null | undefined): LodashFill2x13<T, U>;
+        <U>(start: lodash.__, end: number, array: lodash.List<U> | null | undefined): LodashFill2x14<T, U>;
+        <U>(start: number, end: number, array: lodash.List<U> | null | undefined): lodash.List<T | U>;
+    }
+    interface LodashFill1x5<T> {
+        (end: number): LodashFill1x7<T>;
+        <U>(end: lodash.__, array: U[] | null | undefined): LodashFill1x13<T, U>;
+        <U>(end: number, array: U[] | null | undefined): Array<T | U>;
+        <U>(end: lodash.__, array: lodash.List<U> | null | undefined): LodashFill2x13<T, U>;
+        <U>(end: number, array: lodash.List<U> | null | undefined): lodash.List<T | U>;
+    }
+    interface LodashFill1x6<T> {
+        (start: number): LodashFill1x7<T>;
+        <U>(start: lodash.__, array: U[] | null | undefined): LodashFill1x14<T, U>;
+        <U>(start: number, array: U[] | null | undefined): Array<T | U>;
+        <U>(start: lodash.__, array: lodash.List<U> | null | undefined): LodashFill2x14<T, U>;
+        <U>(start: number, array: lodash.List<U> | null | undefined): lodash.List<T | U>;
+    }
+    interface LodashFill1x7<T> {
+        <U>(array: U[] | null | undefined): Array<T | U>;
+        <U>(array: lodash.List<U> | null | undefined): lodash.List<T | U>;
+    }
+    interface LodashFill1x8<U> {
+        (start: number): LodashFill1x9<U>;
+        (start: lodash.__, end: number): LodashFill1x10<U>;
+        (start: number, end: number): LodashFill1x11<U>;
+        <T>(start: lodash.__, end: lodash.__, value: T): LodashFill1x12<T, U>;
+        <T>(start: number, end: lodash.__, value: T): LodashFill1x13<T, U>;
+        <T>(start: lodash.__, end: number, value: T): LodashFill1x14<T, U>;
+        <T>(start: number, end: number, value: T): Array<T | U>;
+    }
+    interface LodashFill1x9<U> {
+        (end: number): LodashFill1x11<U>;
+        <T>(end: lodash.__, value: T): LodashFill1x13<T, U>;
+        <T>(end: number, value: T): Array<T | U>;
+    }
+    interface LodashFill1x10<U> {
+        (start: number): LodashFill1x11<U>;
+        <T>(start: lodash.__, value: T): LodashFill1x14<T, U>;
+        <T>(start: number, value: T): Array<T | U>;
+    }
+    type LodashFill1x11<U> = <T>(value: T) => Array<T | U>;
+    interface LodashFill1x12<T, U> {
+        (start: number): LodashFill1x13<T, U>;
+        (start: lodash.__, end: number): LodashFill1x14<T, U>;
+        (start: number, end: number): Array<T | U>;
+    }
+    type LodashFill1x13<T, U> = (end: number) => Array<T | U>;
+    type LodashFill1x14<T, U> = (start: number) => Array<T | U>;
+    interface LodashFill2x8<U> {
+        (start: number): LodashFill2x9<U>;
+        (start: lodash.__, end: number): LodashFill2x10<U>;
+        (start: number, end: number): LodashFill2x11<U>;
+        <T>(start: lodash.__, end: lodash.__, value: T): LodashFill2x12<T, U>;
+        <T>(start: number, end: lodash.__, value: T): LodashFill2x13<T, U>;
+        <T>(start: lodash.__, end: number, value: T): LodashFill2x14<T, U>;
+        <T>(start: number, end: number, value: T): lodash.List<T | U>;
+    }
+    interface LodashFill2x9<U> {
+        (end: number): LodashFill2x11<U>;
+        <T>(end: lodash.__, value: T): LodashFill2x13<T, U>;
+        <T>(end: number, value: T): lodash.List<T | U>;
+    }
+    interface LodashFill2x10<U> {
+        (start: number): LodashFill2x11<U>;
+        <T>(start: lodash.__, value: T): LodashFill2x14<T, U>;
+        <T>(start: number, value: T): lodash.List<T | U>;
+    }
+    type LodashFill2x11<U> = <T>(value: T) => lodash.List<T | U>;
+    interface LodashFill2x12<T, U> {
+        (start: number): LodashFill2x13<T, U>;
+        (start: lodash.__, end: number): LodashFill2x14<T, U>;
+        (start: number, end: number): lodash.List<T | U>;
+    }
+    type LodashFill2x13<T, U> = (end: number) => lodash.List<T | U>;
+    type LodashFill2x14<T, U> = (start: number) => lodash.List<T | U>;
+    interface LodashFilter {
+        (predicate: (value: string) => boolean): LodashFilter1x1;
+        (predicate: lodash.__, collection: string | null | undefined): LodashFilter1x2;
+        (predicate: (value: string) => boolean, collection: string | null | undefined): string[];
+        <T, S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>): LodashFilter2x1<T, S>;
+        <T>(predicate: lodash.__, collection: lodash.List<T> | null | undefined): LodashFilter2x2<T>;
+        <T, S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>, collection: lodash.List<T> | null | undefined): S[];
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>): LodashFilter3x1<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, collection: lodash.List<T> | null | undefined): T[];
+        <T extends object, S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>): LodashFilter4x1<T, S>;
+        <T extends object>(predicate: lodash.__, collection: T | null | undefined): LodashFilter4x2<T>;
+        <T extends object, S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>, collection: T | null | undefined): S[];
+        <T extends object>(predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>, collection: T | null | undefined): Array<T[keyof T]>;
+    }
+    type LodashFilter1x1 = (collection: string | null | undefined) => string[];
+    type LodashFilter1x2 = (predicate: (value: string) => boolean) => string[];
+    type LodashFilter2x1<T, S> = (collection: lodash.List<T> | null | undefined) => S[];
+    interface LodashFilter2x2<T> {
+        <S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>): S[];
+        (predicate: lodash.ValueIterateeCustom<T, boolean>): T[];
+    }
+    type LodashFilter3x1<T> = (collection: lodash.List<T> | object | null | undefined) => T[];
+    type LodashFilter4x1<T, S> = (collection: T | null | undefined) => S[];
+    interface LodashFilter4x2<T> {
+        <S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>): S[];
+        (predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>): Array<T[keyof T]>;
+    }
+    interface LodashFind {
+        <T, S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>): LodashFind1x1<T, S>;
+        <T>(predicate: lodash.__, collection: lodash.List<T> | null | undefined): LodashFind1x2<T>;
+        <T, S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>, collection: lodash.List<T> | null | undefined): S|undefined;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>): LodashFind2x1<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, collection: lodash.List<T> | null | undefined): T|undefined;
+        <T extends object, S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>): LodashFind3x1<T, S>;
+        <T extends object>(predicate: lodash.__, collection: T | null | undefined): LodashFind3x2<T>;
+        <T extends object, S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>, collection: T | null | undefined): S|undefined;
+        <T extends object>(predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>, collection: T | null | undefined): T[keyof T]|undefined;
+    }
+    type LodashFind1x1<T, S> = (collection: lodash.List<T> | null | undefined) => S|undefined;
+    interface LodashFind1x2<T> {
+        <S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>): S|undefined;
+        (predicate: lodash.ValueIterateeCustom<T, boolean>): T|undefined;
+    }
+    type LodashFind2x1<T> = (collection: lodash.List<T> | object | null | undefined) => T|undefined;
+    type LodashFind3x1<T, S> = (collection: T | null | undefined) => S|undefined;
+    interface LodashFind3x2<T> {
+        <S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>): S|undefined;
+        (predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>): T[keyof T]|undefined;
+    }
+    interface LodashFindFrom {
+        <T, S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>): LodashFindFrom1x1<T, S>;
+        (predicate: lodash.__, fromIndex: number): LodashFindFrom1x2;
+        <T, S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>, fromIndex: number): LodashFindFrom1x3<T, S>;
+        <T>(predicate: lodash.__, fromIndex: lodash.__, collection: lodash.List<T> | null | undefined): LodashFindFrom1x4<T>;
+        <T, S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>, fromIndex: lodash.__, collection: lodash.List<T> | null | undefined): LodashFindFrom1x5<S>;
+        <T>(predicate: lodash.__, fromIndex: number, collection: lodash.List<T> | null | undefined): LodashFindFrom1x6<T>;
+        <T, S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>, fromIndex: number, collection: lodash.List<T> | null | undefined): S|undefined;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>): LodashFindFrom2x1<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, fromIndex: number): LodashFindFrom2x3<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, fromIndex: lodash.__, collection: lodash.List<T> | null | undefined): LodashFindFrom2x5<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, fromIndex: number, collection: lodash.List<T> | null | undefined): T|undefined;
+        <T extends object, S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>): LodashFindFrom3x1<T, S>;
+        <T extends object, S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>, fromIndex: number): LodashFindFrom3x3<T, S>;
+        <T extends object>(predicate: lodash.__, fromIndex: lodash.__, collection: T | null | undefined): LodashFindFrom3x4<T>;
+        <T extends object, S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>, fromIndex: lodash.__, collection: T | null | undefined): LodashFindFrom3x5<S>;
+        <T extends object>(predicate: lodash.__, fromIndex: number, collection: T | null | undefined): LodashFindFrom3x6<T>;
+        <T extends object, S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>, fromIndex: number, collection: T | null | undefined): S|undefined;
+        <T extends object>(predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>, fromIndex: lodash.__, collection: T | null | undefined): LodashFindFrom4x5<T>;
+        <T extends object>(predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>, fromIndex: number, collection: T | null | undefined): T[keyof T]|undefined;
+    }
+    interface LodashFindFrom1x1<T, S> {
+        (fromIndex: number): LodashFindFrom1x3<T, S>;
+        (fromIndex: lodash.__, collection: lodash.List<T> | null | undefined): LodashFindFrom1x5<S>;
+        (fromIndex: number, collection: lodash.List<T> | null | undefined): S|undefined;
+    }
+    interface LodashFindFrom1x2 {
+        <T, S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>): LodashFindFrom1x3<T, S>;
+        <T>(predicate: lodash.__, collection: lodash.List<T> | null | undefined): LodashFindFrom1x6<T>;
+        <T, S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>, collection: lodash.List<T> | null | undefined): S|undefined;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>): LodashFindFrom2x3<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, collection: lodash.List<T> | null | undefined): T|undefined;
+        <T extends object, S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>): LodashFindFrom3x3<T, S>;
+        <T extends object>(predicate: lodash.__, collection: T | null | undefined): LodashFindFrom3x6<T>;
+        <T extends object, S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>, collection: T | null | undefined): S|undefined;
+        <T extends object>(predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>, collection: T | null | undefined): T[keyof T]|undefined;
+    }
+    type LodashFindFrom1x3<T, S> = (collection: lodash.List<T> | null | undefined) => S|undefined;
+    interface LodashFindFrom1x4<T> {
+        <S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>): LodashFindFrom1x5<S>;
+        (predicate: lodash.__, fromIndex: number): LodashFindFrom1x6<T>;
+        <S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>, fromIndex: number): S|undefined;
+        (predicate: lodash.ValueIterateeCustom<T, boolean>): LodashFindFrom2x5<T>;
+        (predicate: lodash.ValueIterateeCustom<T, boolean>, fromIndex: number): T|undefined;
+    }
+    type LodashFindFrom1x5<S> = (fromIndex: number) => S|undefined;
+    interface LodashFindFrom1x6<T> {
+        <S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>): S|undefined;
+        (predicate: lodash.ValueIterateeCustom<T, boolean>): T|undefined;
+    }
+    interface LodashFindFrom2x1<T> {
+        (fromIndex: number): LodashFindFrom2x3<T>;
+        (fromIndex: lodash.__, collection: lodash.List<T> | null | undefined): LodashFindFrom2x5<T>;
+        (fromIndex: number, collection: lodash.List<T> | object | null | undefined): T|undefined;
+        <T1 extends object>(fromIndex: lodash.__, collection: T1 | null | undefined): LodashFindFrom4x5<T>;
+    }
+    interface LodashFindFrom2x3<T> {
+        (collection: lodash.List<T> | null | undefined): T|undefined;
+        (collection: object | null | undefined): object|undefined;
+    }
+    type LodashFindFrom2x5<T> = (fromIndex: number) => T|undefined;
+    interface LodashFindFrom3x1<T, S> {
+        (fromIndex: number): LodashFindFrom3x3<T, S>;
+        (fromIndex: lodash.__, collection: T | null | undefined): LodashFindFrom3x5<S>;
+        (fromIndex: number, collection: T | null | undefined): S|undefined;
+    }
+    type LodashFindFrom3x3<T, S> = (collection: T | null | undefined) => S|undefined;
+    interface LodashFindFrom3x4<T> {
+        <S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>): LodashFindFrom3x5<S>;
+        (predicate: lodash.__, fromIndex: number): LodashFindFrom3x6<T>;
+        <S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>, fromIndex: number): S|undefined;
+        (predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>): LodashFindFrom4x5<T>;
+        (predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>, fromIndex: number): T[keyof T]|undefined;
+    }
+    type LodashFindFrom3x5<S> = (fromIndex: number) => S|undefined;
+    interface LodashFindFrom3x6<T> {
+        <S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>): S|undefined;
+        (predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>): T[keyof T]|undefined;
+    }
+    type LodashFindFrom4x5<T> = (fromIndex: number) => T[keyof T]|undefined;
+    interface LodashFindIndex {
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>): LodashFindIndex1x1<T>;
+        <T>(predicate: lodash.__, array: lodash.List<T> | null | undefined): LodashFindIndex1x2<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, array: lodash.List<T> | null | undefined): number;
+    }
+    type LodashFindIndex1x1<T> = (array: lodash.List<T> | null | undefined) => number;
+    type LodashFindIndex1x2<T> = (predicate: lodash.ValueIterateeCustom<T, boolean>) => number;
+    interface LodashFindIndexFrom {
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>): LodashFindIndexFrom1x1<T>;
+        (predicate: lodash.__, fromIndex: number): LodashFindIndexFrom1x2;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, fromIndex: number): LodashFindIndexFrom1x3<T>;
+        <T>(predicate: lodash.__, fromIndex: lodash.__, array: lodash.List<T> | null | undefined): LodashFindIndexFrom1x4<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, fromIndex: lodash.__, array: lodash.List<T> | null | undefined): LodashFindIndexFrom1x5;
+        <T>(predicate: lodash.__, fromIndex: number, array: lodash.List<T> | null | undefined): LodashFindIndexFrom1x6<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, fromIndex: number, array: lodash.List<T> | null | undefined): number;
+    }
+    interface LodashFindIndexFrom1x1<T> {
+        (fromIndex: number): LodashFindIndexFrom1x3<T>;
+        (fromIndex: lodash.__, array: lodash.List<T> | null | undefined): LodashFindIndexFrom1x5;
+        (fromIndex: number, array: lodash.List<T> | null | undefined): number;
+    }
+    interface LodashFindIndexFrom1x2 {
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>): LodashFindIndexFrom1x3<T>;
+        <T>(predicate: lodash.__, array: lodash.List<T> | null | undefined): LodashFindIndexFrom1x6<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, array: lodash.List<T> | null | undefined): number;
+    }
+    type LodashFindIndexFrom1x3<T> = (array: lodash.List<T> | null | undefined) => number;
+    interface LodashFindIndexFrom1x4<T> {
+        (predicate: lodash.ValueIterateeCustom<T, boolean>): LodashFindIndexFrom1x5;
+        (predicate: lodash.__, fromIndex: number): LodashFindIndexFrom1x6<T>;
+        (predicate: lodash.ValueIterateeCustom<T, boolean>, fromIndex: number): number;
+    }
+    type LodashFindIndexFrom1x5 = (fromIndex: number) => number;
+    type LodashFindIndexFrom1x6<T> = (predicate: lodash.ValueIterateeCustom<T, boolean>) => number;
+    interface LodashFindKey {
+        <T>(predicate: lodash.ValueIteratee<T>): LodashFindKey1x1<T>;
+        <T>(predicate: lodash.__, object: T | null | undefined): LodashFindKey1x2<T>;
+        <T>(predicate: lodash.ValueIteratee<T[keyof T]>, object: T | null | undefined): string | undefined;
+    }
+    type LodashFindKey1x1<T> = (object: object | null | undefined) => string | undefined;
+    type LodashFindKey1x2<T> = (predicate: lodash.ValueIteratee<T[keyof T]>) => string | undefined;
+    interface LodashFindLast {
+        <T, S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>): LodashFindLast1x1<T, S>;
+        <T>(predicate: lodash.__, collection: lodash.List<T> | null | undefined): LodashFindLast1x2<T>;
+        <T, S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>, collection: lodash.List<T> | null | undefined): S|undefined;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>): LodashFindLast2x1<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, collection: lodash.List<T> | null | undefined): T|undefined;
+        <T extends object, S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>): LodashFindLast3x1<T, S>;
+        <T extends object>(predicate: lodash.__, collection: T | null | undefined): LodashFindLast3x2<T>;
+        <T extends object, S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>, collection: T | null | undefined): S|undefined;
+        <T extends object>(predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>, collection: T | null | undefined): T[keyof T]|undefined;
+    }
+    type LodashFindLast1x1<T, S> = (collection: lodash.List<T> | null | undefined) => S|undefined;
+    interface LodashFindLast1x2<T> {
+        <S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>): S|undefined;
+        (predicate: lodash.ValueIterateeCustom<T, boolean>): T|undefined;
+    }
+    type LodashFindLast2x1<T> = (collection: lodash.List<T> | object | null | undefined) => T|undefined;
+    type LodashFindLast3x1<T, S> = (collection: T | null | undefined) => S|undefined;
+    interface LodashFindLast3x2<T> {
+        <S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>): S|undefined;
+        (predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>): T[keyof T]|undefined;
+    }
+    interface LodashFindLastFrom {
+        <T, S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>): LodashFindLastFrom1x1<T, S>;
+        (predicate: lodash.__, fromIndex: number): LodashFindLastFrom1x2;
+        <T, S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>, fromIndex: number): LodashFindLastFrom1x3<T, S>;
+        <T>(predicate: lodash.__, fromIndex: lodash.__, collection: lodash.List<T> | null | undefined): LodashFindLastFrom1x4<T>;
+        <T, S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>, fromIndex: lodash.__, collection: lodash.List<T> | null | undefined): LodashFindLastFrom1x5<S>;
+        <T>(predicate: lodash.__, fromIndex: number, collection: lodash.List<T> | null | undefined): LodashFindLastFrom1x6<T>;
+        <T, S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>, fromIndex: number, collection: lodash.List<T> | null | undefined): S|undefined;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>): LodashFindLastFrom2x1<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, fromIndex: number): LodashFindLastFrom2x3<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, fromIndex: lodash.__, collection: lodash.List<T> | null | undefined): LodashFindLastFrom2x5<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, fromIndex: number, collection: lodash.List<T> | null | undefined): T|undefined;
+        <T extends object, S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>): LodashFindLastFrom3x1<T, S>;
+        <T extends object, S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>, fromIndex: number): LodashFindLastFrom3x3<T, S>;
+        <T extends object>(predicate: lodash.__, fromIndex: lodash.__, collection: T | null | undefined): LodashFindLastFrom3x4<T>;
+        <T extends object, S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>, fromIndex: lodash.__, collection: T | null | undefined): LodashFindLastFrom3x5<S>;
+        <T extends object>(predicate: lodash.__, fromIndex: number, collection: T | null | undefined): LodashFindLastFrom3x6<T>;
+        <T extends object, S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>, fromIndex: number, collection: T | null | undefined): S|undefined;
+        <T extends object>(predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>, fromIndex: lodash.__, collection: T | null | undefined): LodashFindLastFrom4x5<T>;
+        <T extends object>(predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>, fromIndex: number, collection: T | null | undefined): T[keyof T]|undefined;
+    }
+    interface LodashFindLastFrom1x1<T, S> {
+        (fromIndex: number): LodashFindLastFrom1x3<T, S>;
+        (fromIndex: lodash.__, collection: lodash.List<T> | null | undefined): LodashFindLastFrom1x5<S>;
+        (fromIndex: number, collection: lodash.List<T> | null | undefined): S|undefined;
+    }
+    interface LodashFindLastFrom1x2 {
+        <T, S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>): LodashFindLastFrom1x3<T, S>;
+        <T>(predicate: lodash.__, collection: lodash.List<T> | null | undefined): LodashFindLastFrom1x6<T>;
+        <T, S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>, collection: lodash.List<T> | null | undefined): S|undefined;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>): LodashFindLastFrom2x3<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, collection: lodash.List<T> | null | undefined): T|undefined;
+        <T extends object, S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>): LodashFindLastFrom3x3<T, S>;
+        <T extends object>(predicate: lodash.__, collection: T | null | undefined): LodashFindLastFrom3x6<T>;
+        <T extends object, S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>, collection: T | null | undefined): S|undefined;
+        <T extends object>(predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>, collection: T | null | undefined): T[keyof T]|undefined;
+    }
+    type LodashFindLastFrom1x3<T, S> = (collection: lodash.List<T> | null | undefined) => S|undefined;
+    interface LodashFindLastFrom1x4<T> {
+        <S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>): LodashFindLastFrom1x5<S>;
+        (predicate: lodash.__, fromIndex: number): LodashFindLastFrom1x6<T>;
+        <S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>, fromIndex: number): S|undefined;
+        (predicate: lodash.ValueIterateeCustom<T, boolean>): LodashFindLastFrom2x5<T>;
+        (predicate: lodash.ValueIterateeCustom<T, boolean>, fromIndex: number): T|undefined;
+    }
+    type LodashFindLastFrom1x5<S> = (fromIndex: number) => S|undefined;
+    interface LodashFindLastFrom1x6<T> {
+        <S extends T>(predicate: lodash.ValueIteratorTypeGuard<T, S>): S|undefined;
+        (predicate: lodash.ValueIterateeCustom<T, boolean>): T|undefined;
+    }
+    interface LodashFindLastFrom2x1<T> {
+        (fromIndex: number): LodashFindLastFrom2x3<T>;
+        (fromIndex: lodash.__, collection: lodash.List<T> | null | undefined): LodashFindLastFrom2x5<T>;
+        (fromIndex: number, collection: lodash.List<T> | object | null | undefined): T|undefined;
+        <T1 extends object>(fromIndex: lodash.__, collection: T1 | null | undefined): LodashFindLastFrom4x5<T>;
+    }
+    interface LodashFindLastFrom2x3<T> {
+        (collection: lodash.List<T> | null | undefined): T|undefined;
+        (collection: object | null | undefined): object|undefined;
+    }
+    type LodashFindLastFrom2x5<T> = (fromIndex: number) => T|undefined;
+    interface LodashFindLastFrom3x1<T, S> {
+        (fromIndex: number): LodashFindLastFrom3x3<T, S>;
+        (fromIndex: lodash.__, collection: T | null | undefined): LodashFindLastFrom3x5<S>;
+        (fromIndex: number, collection: T | null | undefined): S|undefined;
+    }
+    type LodashFindLastFrom3x3<T, S> = (collection: T | null | undefined) => S|undefined;
+    interface LodashFindLastFrom3x4<T> {
+        <S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>): LodashFindLastFrom3x5<S>;
+        (predicate: lodash.__, fromIndex: number): LodashFindLastFrom3x6<T>;
+        <S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>, fromIndex: number): S|undefined;
+        (predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>): LodashFindLastFrom4x5<T>;
+        (predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>, fromIndex: number): T[keyof T]|undefined;
+    }
+    type LodashFindLastFrom3x5<S> = (fromIndex: number) => S|undefined;
+    interface LodashFindLastFrom3x6<T> {
+        <S extends T[keyof T]>(predicate: lodash.ValueIteratorTypeGuard<T[keyof T], S>): S|undefined;
+        (predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>): T[keyof T]|undefined;
+    }
+    type LodashFindLastFrom4x5<T> = (fromIndex: number) => T[keyof T]|undefined;
+    interface LodashFindLastIndex {
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>): LodashFindLastIndex1x1<T>;
+        <T>(predicate: lodash.__, array: lodash.List<T> | null | undefined): LodashFindLastIndex1x2<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, array: lodash.List<T> | null | undefined): number;
+    }
+    type LodashFindLastIndex1x1<T> = (array: lodash.List<T> | null | undefined) => number;
+    type LodashFindLastIndex1x2<T> = (predicate: lodash.ValueIterateeCustom<T, boolean>) => number;
+    interface LodashFindLastIndexFrom {
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>): LodashFindLastIndexFrom1x1<T>;
+        (predicate: lodash.__, fromIndex: number): LodashFindLastIndexFrom1x2;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, fromIndex: number): LodashFindLastIndexFrom1x3<T>;
+        <T>(predicate: lodash.__, fromIndex: lodash.__, array: lodash.List<T> | null | undefined): LodashFindLastIndexFrom1x4<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, fromIndex: lodash.__, array: lodash.List<T> | null | undefined): LodashFindLastIndexFrom1x5;
+        <T>(predicate: lodash.__, fromIndex: number, array: lodash.List<T> | null | undefined): LodashFindLastIndexFrom1x6<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, fromIndex: number, array: lodash.List<T> | null | undefined): number;
+    }
+    interface LodashFindLastIndexFrom1x1<T> {
+        (fromIndex: number): LodashFindLastIndexFrom1x3<T>;
+        (fromIndex: lodash.__, array: lodash.List<T> | null | undefined): LodashFindLastIndexFrom1x5;
+        (fromIndex: number, array: lodash.List<T> | null | undefined): number;
+    }
+    interface LodashFindLastIndexFrom1x2 {
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>): LodashFindLastIndexFrom1x3<T>;
+        <T>(predicate: lodash.__, array: lodash.List<T> | null | undefined): LodashFindLastIndexFrom1x6<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, array: lodash.List<T> | null | undefined): number;
+    }
+    type LodashFindLastIndexFrom1x3<T> = (array: lodash.List<T> | null | undefined) => number;
+    interface LodashFindLastIndexFrom1x4<T> {
+        (predicate: lodash.ValueIterateeCustom<T, boolean>): LodashFindLastIndexFrom1x5;
+        (predicate: lodash.__, fromIndex: number): LodashFindLastIndexFrom1x6<T>;
+        (predicate: lodash.ValueIterateeCustom<T, boolean>, fromIndex: number): number;
+    }
+    type LodashFindLastIndexFrom1x5 = (fromIndex: number) => number;
+    type LodashFindLastIndexFrom1x6<T> = (predicate: lodash.ValueIterateeCustom<T, boolean>) => number;
+    interface LodashFindLastKey {
+        <T>(predicate: lodash.ValueIteratee<T>): LodashFindLastKey1x1<T>;
+        <T>(predicate: lodash.__, object: T | null | undefined): LodashFindLastKey1x2<T>;
+        <T>(predicate: lodash.ValueIteratee<T[keyof T]>, object: T | null | undefined): string | undefined;
+    }
+    type LodashFindLastKey1x1<T> = (object: object | null | undefined) => string | undefined;
+    type LodashFindLastKey1x2<T> = (predicate: lodash.ValueIteratee<T[keyof T]>) => string | undefined;
+    type LodashHead = <T>(array: lodash.List<T> | null | undefined) => T | undefined;
+    interface LodashFlatMap {
+        <T, TResult>(iteratee: (value: T) => lodash.Many<TResult>): LodashFlatMap1x1<T, TResult>;
+        <T>(iteratee: lodash.__, collection: lodash.List<T> | null | undefined): LodashFlatMap1x2<T>;
+        <T, TResult>(iteratee: (value: T) => lodash.Many<TResult>, collection: lodash.List<T> | null | undefined): TResult[];
+        <T extends object, TResult>(iteratee: (value: T[keyof T]) => lodash.Many<TResult>): LodashFlatMap2x1<T, TResult>;
+        <T extends object>(iteratee: lodash.__, collection: T | null | undefined): LodashFlatMap2x2<T>;
+        <T extends object, TResult>(iteratee: (value: T[keyof T]) => lodash.Many<TResult>, collection: T | null | undefined): TResult[];
+        (iteratee: string): LodashFlatMap3x1;
+        (iteratee: lodash.__, collection: object | null | undefined): LodashFlatMap3x2;
+        (iteratee: string, collection: object | null | undefined): any[];
+        (iteratee: object): LodashFlatMap4x1;
+        (iteratee: object, collection: object | null | undefined): boolean[];
+    }
+    type LodashFlatMap1x1<T, TResult> = (collection: lodash.List<T> | null | undefined) => TResult[];
+    type LodashFlatMap1x2<T> = <TResult>(iteratee: (value: T) => lodash.Many<TResult>) => TResult[];
+    type LodashFlatMap2x1<T, TResult> = (collection: T | null | undefined) => TResult[];
+    type LodashFlatMap2x2<T> = <TResult>(iteratee: (value: T[keyof T]) => lodash.Many<TResult>) => TResult[];
+    type LodashFlatMap3x1 = (collection: object | null | undefined) => any[];
+    interface LodashFlatMap3x2 {
+        (iteratee: string): any[];
+        (iteratee: object): boolean[];
+    }
+    type LodashFlatMap4x1 = (collection: object | null | undefined) => boolean[];
+    interface LodashFlatMapDeep {
+        <T, TResult>(iteratee: (value: T) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult): LodashFlatMapDeep1x1<T, TResult>;
+        <T>(iteratee: lodash.__, collection: lodash.List<T> | null | undefined): LodashFlatMapDeep1x2<T>;
+        <T, TResult>(iteratee: (value: T) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult, collection: lodash.List<T> | null | undefined): TResult[];
+        <T extends object, TResult>(iteratee: (value: T[keyof T]) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult): LodashFlatMapDeep2x1<T, TResult>;
+        <T extends object>(iteratee: lodash.__, collection: T | null | undefined): LodashFlatMapDeep2x2<T>;
+        <T extends object, TResult>(iteratee: (value: T[keyof T]) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult, collection: T | null | undefined): TResult[];
+        (iteratee: string): LodashFlatMapDeep3x1;
+        (iteratee: lodash.__, collection: object | null | undefined): LodashFlatMapDeep3x2;
+        (iteratee: string, collection: object | null | undefined): any[];
+        (iteratee: object): LodashFlatMapDeep4x1;
+        (iteratee: object, collection: object | null | undefined): boolean[];
+    }
+    type LodashFlatMapDeep1x1<T, TResult> = (collection: lodash.List<T> | null | undefined) => TResult[];
+    type LodashFlatMapDeep1x2<T> = <TResult>(iteratee: (value: T) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult) => TResult[];
+    type LodashFlatMapDeep2x1<T, TResult> = (collection: T | null | undefined) => TResult[];
+    type LodashFlatMapDeep2x2<T> = <TResult>(iteratee: (value: T[keyof T]) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult) => TResult[];
+    type LodashFlatMapDeep3x1 = (collection: object | null | undefined) => any[];
+    interface LodashFlatMapDeep3x2 {
+        (iteratee: string): any[];
+        (iteratee: object): boolean[];
+    }
+    type LodashFlatMapDeep4x1 = (collection: object | null | undefined) => boolean[];
+    interface LodashFlatMapDepth {
+        <T, TResult>(iteratee: (value: T) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult): LodashFlatMapDepth1x1<T, TResult>;
+        (iteratee: lodash.__, depth: number): LodashFlatMapDepth1x2;
+        <T, TResult>(iteratee: (value: T) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult, depth: number): LodashFlatMapDepth1x3<T, TResult>;
+        <T>(iteratee: lodash.__, depth: lodash.__, collection: lodash.List<T> | null | undefined): LodashFlatMapDepth1x4<T>;
+        <T, TResult>(iteratee: (value: T) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult, depth: lodash.__, collection: lodash.List<T> | null | undefined): LodashFlatMapDepth1x5<TResult>;
+        <T>(iteratee: lodash.__, depth: number, collection: lodash.List<T> | null | undefined): LodashFlatMapDepth1x6<T>;
+        <T, TResult>(iteratee: (value: T) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult, depth: number, collection: lodash.List<T> | null | undefined): TResult[];
+        <T extends object, TResult>(iteratee: (value: T[keyof T]) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult): LodashFlatMapDepth2x1<T, TResult>;
+        <T extends object, TResult>(iteratee: (value: T[keyof T]) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult, depth: number): LodashFlatMapDepth2x3<T, TResult>;
+        <T extends object>(iteratee: lodash.__, depth: lodash.__, collection: T | null | undefined): LodashFlatMapDepth2x4<T>;
+        <T extends object, TResult>(iteratee: (value: T[keyof T]) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult, depth: lodash.__, collection: T | null | undefined): LodashFlatMapDepth2x5<TResult>;
+        <T extends object>(iteratee: lodash.__, depth: number, collection: T | null | undefined): LodashFlatMapDepth2x6<T>;
+        <T extends object, TResult>(iteratee: (value: T[keyof T]) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult, depth: number, collection: T | null | undefined): TResult[];
+        (iteratee: string): LodashFlatMapDepth3x1;
+        (iteratee: string, depth: number): LodashFlatMapDepth3x3;
+        (iteratee: lodash.__, depth: lodash.__, collection: object | null | undefined): LodashFlatMapDepth3x4;
+        (iteratee: string, depth: lodash.__, collection: object | null | undefined): LodashFlatMapDepth3x5;
+        (iteratee: lodash.__, depth: number, collection: object | null | undefined): LodashFlatMapDepth3x6;
+        (iteratee: string, depth: number, collection: object | null | undefined): any[];
+        (iteratee: object): LodashFlatMapDepth4x1;
+        (iteratee: object, depth: number): LodashFlatMapDepth4x3;
+        (iteratee: object, depth: lodash.__, collection: object | null | undefined): LodashFlatMapDepth4x5;
+        (iteratee: object, depth: number, collection: object | null | undefined): boolean[];
+    }
+    interface LodashFlatMapDepth1x1<T, TResult> {
+        (depth: number): LodashFlatMapDepth1x3<T, TResult>;
+        (depth: lodash.__, collection: lodash.List<T> | null | undefined): LodashFlatMapDepth1x5<TResult>;
+        (depth: number, collection: lodash.List<T> | null | undefined): TResult[];
+    }
+    interface LodashFlatMapDepth1x2 {
+        <T, TResult>(iteratee: (value: T) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult): LodashFlatMapDepth1x3<T, TResult>;
+        <T>(iteratee: lodash.__, collection: lodash.List<T> | null | undefined): LodashFlatMapDepth1x6<T>;
+        <T, TResult>(iteratee: (value: T) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult, collection: lodash.List<T> | null | undefined): TResult[];
+        <T extends object, TResult>(iteratee: (value: T[keyof T]) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult): LodashFlatMapDepth2x3<T, TResult>;
+        <T extends object>(iteratee: lodash.__, collection: T | null | undefined): LodashFlatMapDepth2x6<T>;
+        <T extends object, TResult>(iteratee: (value: T[keyof T]) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult, collection: T | null | undefined): TResult[];
+        (iteratee: string): LodashFlatMapDepth3x3;
+        (iteratee: lodash.__, collection: object | null | undefined): LodashFlatMapDepth3x6;
+        (iteratee: string, collection: object | null | undefined): any[];
+        (iteratee: object): LodashFlatMapDepth4x3;
+        (iteratee: object, collection: object | null | undefined): boolean[];
+    }
+    type LodashFlatMapDepth1x3<T, TResult> = (collection: lodash.List<T> | null | undefined) => TResult[];
+    interface LodashFlatMapDepth1x4<T> {
+        <TResult>(iteratee: (value: T) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult): LodashFlatMapDepth1x5<TResult>;
+        (iteratee: lodash.__, depth: number): LodashFlatMapDepth1x6<T>;
+        <TResult>(iteratee: (value: T) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult, depth: number): TResult[];
+    }
+    type LodashFlatMapDepth1x5<TResult> = (depth: number) => TResult[];
+    type LodashFlatMapDepth1x6<T> = <TResult>(iteratee: (value: T) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult) => TResult[];
+    interface LodashFlatMapDepth2x1<T, TResult> {
+        (depth: number): LodashFlatMapDepth2x3<T, TResult>;
+        (depth: lodash.__, collection: T | null | undefined): LodashFlatMapDepth2x5<TResult>;
+        (depth: number, collection: T | null | undefined): TResult[];
+    }
+    type LodashFlatMapDepth2x3<T, TResult> = (collection: T | null | undefined) => TResult[];
+    interface LodashFlatMapDepth2x4<T> {
+        <TResult>(iteratee: (value: T[keyof T]) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult): LodashFlatMapDepth2x5<TResult>;
+        (iteratee: lodash.__, depth: number): LodashFlatMapDepth2x6<T>;
+        <TResult>(iteratee: (value: T[keyof T]) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult, depth: number): TResult[];
+    }
+    type LodashFlatMapDepth2x5<TResult> = (depth: number) => TResult[];
+    type LodashFlatMapDepth2x6<T> = <TResult>(iteratee: (value: T[keyof T]) => lodash.ListOfRecursiveArraysOrValues<TResult> | TResult) => TResult[];
+    interface LodashFlatMapDepth3x1 {
+        (depth: number): LodashFlatMapDepth3x3;
+        (depth: lodash.__, collection: object | null | undefined): LodashFlatMapDepth3x5;
+        (depth: number, collection: object | null | undefined): any[];
+    }
+    type LodashFlatMapDepth3x3 = (collection: object | null | undefined) => any[];
+    interface LodashFlatMapDepth3x4 {
+        (iteratee: string): LodashFlatMapDepth3x5;
+        (iteratee: lodash.__, depth: number): LodashFlatMapDepth3x6;
+        (iteratee: string, depth: number): any[];
+        (iteratee: object): LodashFlatMapDepth4x5;
+        (iteratee: object, depth: number): boolean[];
+    }
+    type LodashFlatMapDepth3x5 = (depth: number) => any[];
+    interface LodashFlatMapDepth3x6 {
+        (iteratee: string): any[];
+        (iteratee: object): boolean[];
+    }
+    interface LodashFlatMapDepth4x1 {
+        (depth: number): LodashFlatMapDepth4x3;
+        (depth: lodash.__, collection: object | null | undefined): LodashFlatMapDepth4x5;
+        (depth: number, collection: object | null | undefined): boolean[];
+    }
+    type LodashFlatMapDepth4x3 = (collection: object | null | undefined) => boolean[];
+    type LodashFlatMapDepth4x5 = (depth: number) => boolean[];
+    type LodashFlatten = <T>(array: lodash.List<lodash.Many<T>> | null | undefined) => T[];
+    type LodashFlattenDeep = <T>(array: lodash.ListOfRecursiveArraysOrValues<T> | null | undefined) => T[];
+    interface LodashFlattenDepth {
+        (depth: number): LodashFlattenDepth1x1;
+        <T>(depth: lodash.__, array: lodash.ListOfRecursiveArraysOrValues<T> | null | undefined): LodashFlattenDepth1x2<T>;
+        <T>(depth: number, array: lodash.ListOfRecursiveArraysOrValues<T> | null | undefined): T[];
+    }
+    type LodashFlattenDepth1x1 = <T>(array: lodash.ListOfRecursiveArraysOrValues<T> | null | undefined) => T[];
+    type LodashFlattenDepth1x2<T> = (depth: number) => T[];
+    type LodashFlip = <T extends (...args: any[]) => any>(func: T) => T;
+    type LodashFloor = (n: number) => number;
+    interface LodashFlow {
+        <R1, R2>(f1: () => R1, f2: (a: R1) => R2): () => R2;
+        <R1, R2, R3>(f1: () => R1, f2: (a: R1) => R2, f3: (a: R2) => R3): () => R3;
+        <R1, R2, R3, R4>(f1: () => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): () => R4;
+        <R1, R2, R3, R4, R5>(f1: () => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): () => R5;
+        <R1, R2, R3, R4, R5, R6>(f1: () => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): () => R6;
+        <R1, R2, R3, R4, R5, R6, R7>(f1: () => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): () => R7;
+        <R1, R2, R3, R4, R5, R6, R7>(f1: () => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<lodash.Many<(a: any) => any>>): () => any;
+        <A1, R1, R2>(f1: (a1: A1) => R1, f2: (a: R1) => R2): (a1: A1) => R2;
+        <A1, R1, R2, R3>(f1: (a1: A1) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3): (a1: A1) => R3;
+        <A1, R1, R2, R3, R4>(f1: (a1: A1) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): (a1: A1) => R4;
+        <A1, R1, R2, R3, R4, R5>(f1: (a1: A1) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): (a1: A1) => R5;
+        <A1, R1, R2, R3, R4, R5, R6>(f1: (a1: A1) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): (a1: A1) => R6;
+        <A1, R1, R2, R3, R4, R5, R6, R7>(f1: (a1: A1) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): (a1: A1) => R7;
+        <A1, R1, R2, R3, R4, R5, R6, R7>(f1: (a1: A1) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<lodash.Many<(a: any) => any>>): (a1: A1) => any;
+        <A1, A2, R1, R2>(f1: (a1: A1, a2: A2) => R1, f2: (a: R1) => R2): (a1: A1, a2: A2) => R2;
+        <A1, A2, R1, R2, R3>(f1: (a1: A1, a2: A2) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3): (a1: A1, a2: A2) => R3;
+        <A1, A2, R1, R2, R3, R4>(f1: (a1: A1, a2: A2) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): (a1: A1, a2: A2) => R4;
+        <A1, A2, R1, R2, R3, R4, R5>(f1: (a1: A1, a2: A2) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): (a1: A1, a2: A2) => R5;
+        <A1, A2, R1, R2, R3, R4, R5, R6>(f1: (a1: A1, a2: A2) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): (a1: A1, a2: A2) => R6;
+        <A1, A2, R1, R2, R3, R4, R5, R6, R7>(f1: (a1: A1, a2: A2) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): (a1: A1, a2: A2) => R7;
+        <A1, A2, R1, R2, R3, R4, R5, R6, R7>(f1: (a1: A1, a2: A2) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<lodash.Many<(a: any) => any>>): (a1: A1, a2: A2) => any;
+        <A1, A2, A3, R1, R2>(f1: (a1: A1, a2: A2, a3: A3) => R1, f2: (a: R1) => R2): (a1: A1, a2: A2, a3: A3) => R2;
+        <A1, A2, A3, R1, R2, R3>(f1: (a1: A1, a2: A2, a3: A3) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3): (a1: A1, a2: A2, a3: A3) => R3;
+        <A1, A2, A3, R1, R2, R3, R4>(f1: (a1: A1, a2: A2, a3: A3) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): (a1: A1, a2: A2, a3: A3) => R4;
+        <A1, A2, A3, R1, R2, R3, R4, R5>(f1: (a1: A1, a2: A2, a3: A3) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): (a1: A1, a2: A2, a3: A3) => R5;
+        <A1, A2, A3, R1, R2, R3, R4, R5, R6>(f1: (a1: A1, a2: A2, a3: A3) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): (a1: A1, a2: A2, a3: A3) => R6;
+        <A1, A2, A3, R1, R2, R3, R4, R5, R6, R7>(f1: (a1: A1, a2: A2, a3: A3) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): (a1: A1, a2: A2, a3: A3) => R7;
+        <A1, A2, A3, R1, R2, R3, R4, R5, R6, R7>(f1: (a1: A1, a2: A2, a3: A3) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<lodash.Many<(a: any) => any>>): (a1: A1, a2: A2, a3: A3) => any;
+        <A1, A2, A3, A4, R1, R2>(f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1, f2: (a: R1) => R2): (a1: A1, a2: A2, a3: A3, a4: A4) => R2;
+        <A1, A2, A3, A4, R1, R2, R3>(f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3): (a1: A1, a2: A2, a3: A3, a4: A4) => R3;
+        <A1, A2, A3, A4, R1, R2, R3, R4>(f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): (a1: A1, a2: A2, a3: A3, a4: A4) => R4;
+        <A1, A2, A3, A4, R1, R2, R3, R4, R5>(f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): (a1: A1, a2: A2, a3: A3, a4: A4) => R5;
+        <A1, A2, A3, A4, R1, R2, R3, R4, R5, R6>(f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): (a1: A1, a2: A2, a3: A3, a4: A4) => R6;
+        <A1, A2, A3, A4, R1, R2, R3, R4, R5, R6, R7>(f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): (a1: A1, a2: A2, a3: A3, a4: A4) => R7;
+        <A1, A2, A3, A4, R1, R2, R3, R4, R5, R6, R7>(f1: (a1: A1, a2: A2, a3: A3, a4: A4) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<lodash.Many<(a: any) => any>>): (a1: A1, a2: A2, a3: A3, a4: A4) => any;
+        <A1, A2, A3, A4, R1, R2>(f1: (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1, f2: (a: R1) => R2): (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R2;
+        <A1, A2, A3, A4, R1, R2, R3>(f1: (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3): (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R3;
+        <A1, A2, A3, A4, R1, R2, R3, R4>(f1: (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R4;
+        <A1, A2, A3, A4, R1, R2, R3, R4, R5>(f1: (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R5;
+        <A1, A2, A3, A4, R1, R2, R3, R4, R5, R6>(f1: (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R6;
+        <A1, A2, A3, A4, R1, R2, R3, R4, R5, R6, R7>(f1: (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R7;
+        <A1, A2, A3, A4, R1, R2, R3, R4, R5, R6, R7>(f1: (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7, ...funcs: Array<lodash.Many<(a: any) => any>>): (a1: A1, a2: A2, a3: A3, a4: A4, ...args: any[]) => any;
+        (funcs: Array<lodash.Many<(...args: any[]) => any>>): (...args: any[]) => any;
+    }
+    interface LodashForIn {
+        <T>(iteratee: (value: T) => any): LodashForIn1x1<T>;
+        <T>(iteratee: lodash.__, object: T): LodashForIn1x2<T>;
+        <T>(iteratee: (value: T[keyof T]) => any, object: T): T;
+        <T>(iteratee: lodash.__, object: T | null | undefined): LodashForIn2x2<T>;
+        <T>(iteratee: (value: T[keyof T]) => any, object: T | null | undefined): T | null | undefined;
+    }
+    interface LodashForIn1x1<T> {
+        <T1 extends object>(object: T1): T1;
+        <T1 extends object>(object: T1 | null | undefined): T1 | null | undefined;
+    }
+    type LodashForIn1x2<T> = (iteratee: (value: T[keyof T]) => any) => T;
+    type LodashForIn2x2<T> = (iteratee: (value: T[keyof T]) => any) => T | null | undefined;
+    interface LodashForInRight {
+        <T>(iteratee: (value: T) => any): LodashForInRight1x1<T>;
+        <T>(iteratee: lodash.__, object: T): LodashForInRight1x2<T>;
+        <T>(iteratee: (value: T[keyof T]) => any, object: T): T;
+        <T>(iteratee: lodash.__, object: T | null | undefined): LodashForInRight2x2<T>;
+        <T>(iteratee: (value: T[keyof T]) => any, object: T | null | undefined): T | null | undefined;
+    }
+    interface LodashForInRight1x1<T> {
+        <T1 extends object>(object: T1): T1;
+        <T1 extends object>(object: T1 | null | undefined): T1 | null | undefined;
+    }
+    type LodashForInRight1x2<T> = (iteratee: (value: T[keyof T]) => any) => T;
+    type LodashForInRight2x2<T> = (iteratee: (value: T[keyof T]) => any) => T | null | undefined;
+    interface LodashForOwn {
+        <T>(iteratee: (value: T) => any): LodashForOwn1x1<T>;
+        <T>(iteratee: lodash.__, object: T): LodashForOwn1x2<T>;
+        <T>(iteratee: (value: T[keyof T]) => any, object: T): T;
+        <T>(iteratee: lodash.__, object: T | null | undefined): LodashForOwn2x2<T>;
+        <T>(iteratee: (value: T[keyof T]) => any, object: T | null | undefined): T | null | undefined;
+    }
+    interface LodashForOwn1x1<T> {
+        <T1 extends object>(object: T1): T1;
+        <T1 extends object>(object: T1 | null | undefined): T1 | null | undefined;
+    }
+    type LodashForOwn1x2<T> = (iteratee: (value: T[keyof T]) => any) => T;
+    type LodashForOwn2x2<T> = (iteratee: (value: T[keyof T]) => any) => T | null | undefined;
+    interface LodashForOwnRight {
+        <T>(iteratee: (value: T) => any): LodashForOwnRight1x1<T>;
+        <T>(iteratee: lodash.__, object: T): LodashForOwnRight1x2<T>;
+        <T>(iteratee: (value: T[keyof T]) => any, object: T): T;
+        <T>(iteratee: lodash.__, object: T | null | undefined): LodashForOwnRight2x2<T>;
+        <T>(iteratee: (value: T[keyof T]) => any, object: T | null | undefined): T | null | undefined;
+    }
+    interface LodashForOwnRight1x1<T> {
+        <T1 extends object>(object: T1): T1;
+        <T1 extends object>(object: T1 | null | undefined): T1 | null | undefined;
+    }
+    type LodashForOwnRight1x2<T> = (iteratee: (value: T[keyof T]) => any) => T;
+    type LodashForOwnRight2x2<T> = (iteratee: (value: T[keyof T]) => any) => T | null | undefined;
+    interface LodashFromPairs {
+        <T>(pairs: lodash.List<[lodash.PropertyName, T]> | null | undefined): lodash.Dictionary<T>;
+        (pairs: lodash.List<any[]> | null | undefined): lodash.Dictionary<any>;
+    }
+    type LodashFunctions = (object: any) => string[];
+    type LodashFunctionsIn = (object: any) => string[];
+    interface LodashGet {
+        <TObject extends object, TKey extends keyof TObject>(path: TKey | [TKey]): LodashGet1x1<TObject, TKey>;
+        <TObject extends object>(path: lodash.__, object: TObject): LodashGet1x2<TObject>;
+        <TObject extends object, TKey extends keyof TObject>(path: TKey | [TKey], object: TObject): TObject[TKey];
+        <TObject extends object>(path: lodash.__, object: TObject | null | undefined): LodashGet2x2<TObject>;
+        <TObject extends object, TKey extends keyof TObject>(path: TKey | [TKey], object: TObject | null | undefined): TObject[TKey] | undefined;
+        (path: number): LodashGet3x1;
+        <T>(path: lodash.__, object: lodash.NumericDictionary<T>): LodashGet3x2<T>;
+        <T>(path: number, object: lodash.NumericDictionary<T>): T;
+        <T>(path: lodash.__, object: lodash.NumericDictionary<T> | null | undefined): LodashGet4x2<T>;
+        <T>(path: number, object: lodash.NumericDictionary<T> | null | undefined): T | undefined;
+        (path: lodash.PropertyPath): LodashGet5x1;
+        (path: lodash.__, object: null | undefined): LodashGet5x2;
+        (path: lodash.PropertyPath, object: null | undefined): undefined;
+        (path: lodash.__, object: any): LodashGet6x2;
+        (path: lodash.PropertyPath, object: any): any;
+    }
+    interface LodashGet1x1<TObject, TKey extends keyof TObject> {
+        (object: TObject): TObject[TKey];
+        (object: TObject | null | undefined): TObject[TKey] | undefined;
+    }
+    type LodashGet1x2<TObject> = <TKey extends keyof TObject>(path: TKey | [TKey]) => TObject[TKey];
+    type LodashGet2x2<TObject> = <TKey extends keyof TObject>(path: TKey | [TKey]) => TObject[TKey] | undefined;
+    interface LodashGet3x1 {
+        <T>(object: lodash.NumericDictionary<T>): T;
+        <T>(object: lodash.NumericDictionary<T> | null | undefined): T | undefined;
+    }
+    type LodashGet3x2<T> = (path: number) => T;
+    type LodashGet4x2<T> = (path: number) => T | undefined;
+    interface LodashGet5x1 {
+        (object: null | undefined): undefined;
+        (object: any): any;
+    }
+    type LodashGet5x2 = (path: lodash.PropertyPath) => undefined;
+    type LodashGet6x2 = (path: lodash.PropertyPath) => any;
+    interface LodashGetOr {
+        <TDefault>(defaultValue: TDefault): LodashGetOr1x1<TDefault>;
+        <TObject extends object, TKey extends keyof TObject>(defaultValue: lodash.__, path: TKey | [TKey]): LodashGetOr1x2<TObject, TKey>;
+        <TObject extends object, TKey extends keyof TObject, TDefault>(defaultValue: TDefault, path: TKey | [TKey]): LodashGetOr1x3<TObject, TKey, TDefault>;
+        <TObject extends object>(defaultValue: lodash.__, path: lodash.__, object: TObject | null | undefined): LodashGetOr1x4<TObject>;
+        <TObject extends object, TDefault>(defaultValue: TDefault, path: lodash.__, object: TObject | null | undefined): LodashGetOr1x5<TObject, TDefault>;
+        <TObject extends object, TKey extends keyof TObject>(defaultValue: lodash.__, path: TKey | [TKey], object: TObject | null | undefined): LodashGetOr1x6<TObject, TKey>;
+        <TObject extends object, TKey extends keyof TObject, TDefault>(defaultValue: TDefault, path: TKey | [TKey], object: TObject | null | undefined): TObject[TKey] | TDefault;
+        (defaultValue: lodash.__, path: number): LodashGetOr2x2;
+        <TDefault>(defaultValue: TDefault, path: number): LodashGetOr2x3<TDefault>;
+        <T>(defaultValue: lodash.__, path: lodash.__, object: lodash.NumericDictionary<T> | null | undefined): LodashGetOr2x4<T>;
+        <T, TDefault>(defaultValue: TDefault, path: lodash.__, object: lodash.NumericDictionary<T> | null | undefined): LodashGetOr2x5<T, TDefault>;
+        <T>(defaultValue: lodash.__, path: number, object: lodash.NumericDictionary<T> | null | undefined): LodashGetOr2x6<T>;
+        <T, TDefault>(defaultValue: TDefault, path: number, object: lodash.NumericDictionary<T> | null | undefined): T | TDefault;
+        (defaultValue: lodash.__, path: lodash.PropertyPath): LodashGetOr3x2;
+        <TDefault>(defaultValue: TDefault, path: lodash.PropertyPath): LodashGetOr3x3<TDefault>;
+        (defaultValue: lodash.__, path: lodash.__, object: null | undefined): LodashGetOr3x4;
+        <TDefault>(defaultValue: TDefault, path: lodash.__, object: null | undefined): LodashGetOr3x5<TDefault>;
+        (defaultValue: lodash.__, path: lodash.PropertyPath, object: null | undefined): LodashGetOr3x6;
+        <TDefault>(defaultValue: TDefault, path: lodash.PropertyPath, object: null | undefined): TDefault;
+        (defaultValue: any): LodashGetOr4x1;
+        (defaultValue: any, path: lodash.PropertyPath): LodashGetOr4x3;
+        (defaultValue: lodash.__, path: lodash.__, object: any): LodashGetOr4x4;
+        (defaultValue: any, path: lodash.__, object: any): LodashGetOr4x5;
+        (defaultValue: lodash.__, path: lodash.PropertyPath, object: any): LodashGetOr4x6;
+        (defaultValue: any, path: lodash.PropertyPath, object: any): any;
+    }
+    interface LodashGetOr1x1<TDefault> {
+        <TObject extends object, TKey extends keyof TObject>(path: TKey | [TKey]): LodashGetOr1x3<TObject, TKey, TDefault>;
+        <TObject extends object>(path: lodash.__, object: TObject | null | undefined): LodashGetOr1x5<TObject, TDefault>;
+        <TObject extends object, TKey extends keyof TObject>(path: TKey | [TKey], object: TObject | null | undefined): TObject[TKey] | TDefault;
+        (path: number): LodashGetOr2x3<TDefault>;
+        <T>(path: lodash.__, object: lodash.NumericDictionary<T> | null | undefined): LodashGetOr2x5<T, TDefault>;
+        <T>(path: number, object: lodash.NumericDictionary<T> | null | undefined): T | TDefault;
+        (path: lodash.PropertyPath): LodashGetOr3x3<TDefault>;
+        (path: lodash.__, object: null | undefined): LodashGetOr3x5<TDefault>;
+        (path: lodash.PropertyPath, object: null | undefined): TDefault;
+    }
+    interface LodashGetOr1x2<TObject, TKey extends keyof TObject> {
+        <TDefault>(defaultValue: TDefault): LodashGetOr1x3<TObject, TKey, TDefault>;
+        (defaultValue: lodash.__, object: TObject | null | undefined): LodashGetOr1x6<TObject, TKey>;
+        <TDefault>(defaultValue: TDefault, object: TObject | null | undefined): TObject[TKey] | TDefault;
+    }
+    type LodashGetOr1x3<TObject, TKey extends keyof TObject, TDefault> = (object: TObject | null | undefined) => TObject[TKey] | TDefault;
+    interface LodashGetOr1x4<TObject> {
+        <TDefault>(defaultValue: TDefault): LodashGetOr1x5<TObject, TDefault>;
+        <TKey extends keyof TObject>(defaultValue: lodash.__, path: TKey | [TKey]): LodashGetOr1x6<TObject, TKey>;
+        <TKey extends keyof TObject, TDefault>(defaultValue: TDefault, path: TKey | [TKey]): TObject[TKey] | TDefault;
+    }
+    type LodashGetOr1x5<TObject, TDefault> = <TKey extends keyof TObject>(path: TKey | [TKey]) => TObject[TKey] | TDefault;
+    type LodashGetOr1x6<TObject, TKey extends keyof TObject> = <TDefault>(defaultValue: TDefault) => TObject[TKey] | TDefault;
+    interface LodashGetOr2x2 {
+        <TDefault>(defaultValue: TDefault): LodashGetOr2x3<TDefault>;
+        <T>(defaultValue: lodash.__, object: lodash.NumericDictionary<T> | null | undefined): LodashGetOr2x6<T>;
+        <T, TDefault>(defaultValue: TDefault, object: lodash.NumericDictionary<T> | null | undefined): T | TDefault;
+    }
+    type LodashGetOr2x3<TDefault> = <T>(object: lodash.NumericDictionary<T> | null | undefined) => T | TDefault;
+    interface LodashGetOr2x4<T> {
+        <TDefault>(defaultValue: TDefault): LodashGetOr2x5<T, TDefault>;
+        (defaultValue: lodash.__, path: number): LodashGetOr2x6<T>;
+        <TDefault>(defaultValue: TDefault, path: number): T | TDefault;
+    }
+    type LodashGetOr2x5<T, TDefault> = (path: number) => T | TDefault;
+    type LodashGetOr2x6<T> = <TDefault>(defaultValue: TDefault) => T | TDefault;
+    interface LodashGetOr3x2 {
+        <TDefault>(defaultValue: TDefault): LodashGetOr3x3<TDefault>;
+        (defaultValue: lodash.__, object: null | undefined): LodashGetOr3x6;
+        <TDefault>(defaultValue: TDefault, object: null | undefined): TDefault;
+        (defaultValue: any): LodashGetOr4x3;
+        (defaultValue: lodash.__, object: any): LodashGetOr4x6;
+        (defaultValue: any, object: any): any;
+    }
+    type LodashGetOr3x3<TDefault> = (object: null | undefined) => TDefault;
+    interface LodashGetOr3x4 {
+        <TDefault>(defaultValue: TDefault): LodashGetOr3x5<TDefault>;
+        (defaultValue: lodash.__, path: lodash.PropertyPath): LodashGetOr3x6;
+        <TDefault>(defaultValue: TDefault, path: lodash.PropertyPath): TDefault;
+    }
+    type LodashGetOr3x5<TDefault> = (path: lodash.PropertyPath) => TDefault;
+    type LodashGetOr3x6 = <TDefault>(defaultValue: TDefault) => TDefault;
+    interface LodashGetOr4x1 {
+        (path: lodash.PropertyPath): LodashGetOr4x3;
+        (path: lodash.__, object: any): LodashGetOr4x5;
+        (path: lodash.PropertyPath, object: any): any;
+    }
+    type LodashGetOr4x3 = (object: any) => any;
+    interface LodashGetOr4x4 {
+        (defaultValue: any): LodashGetOr4x5;
+        (defaultValue: lodash.__, path: lodash.PropertyPath): LodashGetOr4x6;
+        (defaultValue: any, path: lodash.PropertyPath): any;
+    }
+    type LodashGetOr4x5 = (path: lodash.PropertyPath) => any;
+    type LodashGetOr4x6 = (defaultValue: any) => any;
+    interface LodashGroupBy {
+        <T>(iteratee: lodash.ValueIteratee<T>): LodashGroupBy1x1<T>;
+        <T>(iteratee: lodash.__, collection: lodash.List<T> | null | undefined): LodashGroupBy1x2<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, collection: lodash.List<T> | null | undefined): lodash.Dictionary<T[]>;
+        <T extends object>(iteratee: lodash.__, collection: T | null | undefined): LodashGroupBy2x2<T>;
+        <T extends object>(iteratee: lodash.ValueIteratee<T[keyof T]>, collection: T | null | undefined): lodash.Dictionary<Array<T[keyof T]>>;
+    }
+    type LodashGroupBy1x1<T> = (collection: lodash.List<T> | object | null | undefined) => lodash.Dictionary<T[]>;
+    type LodashGroupBy1x2<T> = (iteratee: lodash.ValueIteratee<T>) => lodash.Dictionary<T[]>;
+    type LodashGroupBy2x2<T> = (iteratee: lodash.ValueIteratee<T[keyof T]>) => lodash.Dictionary<Array<T[keyof T]>>;
+    interface LodashGt {
+        (value: any): LodashGt1x1;
+        (value: lodash.__, other: any): LodashGt1x2;
+        (value: any, other: any): boolean;
+    }
+    type LodashGt1x1 = (other: any) => boolean;
+    type LodashGt1x2 = (value: any) => boolean;
+    interface LodashGte {
+        (value: any): LodashGte1x1;
+        (value: lodash.__, other: any): LodashGte1x2;
+        (value: any, other: any): boolean;
+    }
+    type LodashGte1x1 = (other: any) => boolean;
+    type LodashGte1x2 = (value: any) => boolean;
+    interface LodashHas {
+        (path: lodash.PropertyPath): LodashHas1x1;
+        <T>(path: lodash.__, object: T): LodashHas1x2;
+        <T>(path: lodash.PropertyPath, object: T): boolean;
+    }
+    type LodashHas1x1 = <T>(object: T) => boolean;
+    type LodashHas1x2 = (path: lodash.PropertyPath) => boolean;
+    interface LodashHasIn {
+        (path: lodash.PropertyPath): LodashHasIn1x1;
+        <T>(path: lodash.__, object: T): LodashHasIn1x2;
+        <T>(path: lodash.PropertyPath, object: T): boolean;
+    }
+    type LodashHasIn1x1 = <T>(object: T) => boolean;
+    type LodashHasIn1x2 = (path: lodash.PropertyPath) => boolean;
+    interface LodashIdentity {
+        <T>(value: T): T;
+        (): undefined;
+    }
+    interface LodashIncludes {
+        <T>(target: T): LodashIncludes1x1<T>;
+        <T>(target: lodash.__, collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): LodashIncludes1x2<T>;
+        <T>(target: T, collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): boolean;
+    }
+    type LodashIncludes1x1<T> = (collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined) => boolean;
+    type LodashIncludes1x2<T> = (target: T) => boolean;
+    interface LodashIncludesFrom {
+        <T>(target: T): LodashIncludesFrom1x1<T>;
+        (target: lodash.__, fromIndex: number): LodashIncludesFrom1x2;
+        <T>(target: T, fromIndex: number): LodashIncludesFrom1x3<T>;
+        <T>(target: lodash.__, fromIndex: lodash.__, collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): LodashIncludesFrom1x4<T>;
+        <T>(target: T, fromIndex: lodash.__, collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): LodashIncludesFrom1x5;
+        <T>(target: lodash.__, fromIndex: number, collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): LodashIncludesFrom1x6<T>;
+        <T>(target: T, fromIndex: number, collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): boolean;
+    }
+    interface LodashIncludesFrom1x1<T> {
+        (fromIndex: number): LodashIncludesFrom1x3<T>;
+        (fromIndex: lodash.__, collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): LodashIncludesFrom1x5;
+        (fromIndex: number, collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): boolean;
+    }
+    interface LodashIncludesFrom1x2 {
+        <T>(target: T): LodashIncludesFrom1x3<T>;
+        <T>(target: lodash.__, collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): LodashIncludesFrom1x6<T>;
+        <T>(target: T, collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): boolean;
+    }
+    type LodashIncludesFrom1x3<T> = (collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined) => boolean;
+    interface LodashIncludesFrom1x4<T> {
+        (target: T): LodashIncludesFrom1x5;
+        (target: lodash.__, fromIndex: number): LodashIncludesFrom1x6<T>;
+        (target: T, fromIndex: number): boolean;
+    }
+    type LodashIncludesFrom1x5 = (fromIndex: number) => boolean;
+    type LodashIncludesFrom1x6<T> = (target: T) => boolean;
+    interface LodashKeyBy {
+        <T>(iteratee: lodash.ValueIterateeCustom<T, lodash.PropertyName>): LodashKeyBy1x1<T>;
+        <T>(iteratee: lodash.__, collection: lodash.List<T> | null | undefined): LodashKeyBy1x2<T>;
+        <T>(iteratee: lodash.ValueIterateeCustom<T, lodash.PropertyName>, collection: lodash.List<T> | null | undefined): lodash.Dictionary<T>;
+        <T extends object>(iteratee: lodash.__, collection: T | null | undefined): LodashKeyBy2x2<T>;
+        <T extends object>(iteratee: lodash.ValueIterateeCustom<T[keyof T], lodash.PropertyName>, collection: T | null | undefined): lodash.Dictionary<T[keyof T]>;
+    }
+    type LodashKeyBy1x1<T> = (collection: lodash.List<T> | object | null | undefined) => lodash.Dictionary<T>;
+    type LodashKeyBy1x2<T> = (iteratee: lodash.ValueIterateeCustom<T, lodash.PropertyName>) => lodash.Dictionary<T>;
+    type LodashKeyBy2x2<T> = (iteratee: lodash.ValueIterateeCustom<T[keyof T], lodash.PropertyName>) => lodash.Dictionary<T[keyof T]>;
+    interface LodashIndexOf {
+        <T>(value: T): LodashIndexOf1x1<T>;
+        <T>(value: lodash.__, array: lodash.List<T> | null | undefined): LodashIndexOf1x2<T>;
+        <T>(value: T, array: lodash.List<T> | null | undefined): number;
+    }
+    type LodashIndexOf1x1<T> = (array: lodash.List<T> | null | undefined) => number;
+    type LodashIndexOf1x2<T> = (value: T) => number;
+    interface LodashIndexOfFrom {
+        <T>(value: T): LodashIndexOfFrom1x1<T>;
+        (value: lodash.__, fromIndex: number): LodashIndexOfFrom1x2;
+        <T>(value: T, fromIndex: number): LodashIndexOfFrom1x3<T>;
+        <T>(value: lodash.__, fromIndex: lodash.__, array: lodash.List<T> | null | undefined): LodashIndexOfFrom1x4<T>;
+        <T>(value: T, fromIndex: lodash.__, array: lodash.List<T> | null | undefined): LodashIndexOfFrom1x5;
+        <T>(value: lodash.__, fromIndex: number, array: lodash.List<T> | null | undefined): LodashIndexOfFrom1x6<T>;
+        <T>(value: T, fromIndex: number, array: lodash.List<T> | null | undefined): number;
+    }
+    interface LodashIndexOfFrom1x1<T> {
+        (fromIndex: number): LodashIndexOfFrom1x3<T>;
+        (fromIndex: lodash.__, array: lodash.List<T> | null | undefined): LodashIndexOfFrom1x5;
+        (fromIndex: number, array: lodash.List<T> | null | undefined): number;
+    }
+    interface LodashIndexOfFrom1x2 {
+        <T>(value: T): LodashIndexOfFrom1x3<T>;
+        <T>(value: lodash.__, array: lodash.List<T> | null | undefined): LodashIndexOfFrom1x6<T>;
+        <T>(value: T, array: lodash.List<T> | null | undefined): number;
+    }
+    type LodashIndexOfFrom1x3<T> = (array: lodash.List<T> | null | undefined) => number;
+    interface LodashIndexOfFrom1x4<T> {
+        (value: T): LodashIndexOfFrom1x5;
+        (value: lodash.__, fromIndex: number): LodashIndexOfFrom1x6<T>;
+        (value: T, fromIndex: number): number;
+    }
+    type LodashIndexOfFrom1x5 = (fromIndex: number) => number;
+    type LodashIndexOfFrom1x6<T> = (value: T) => number;
+    type LodashInitial = <T>(array: lodash.List<T> | null | undefined) => T[];
+    interface LodashInRange {
+        (start: number): LodashInRange1x1;
+        (start: lodash.__, end: number): LodashInRange1x2;
+        (start: number, end: number): LodashInRange1x3;
+        (start: lodash.__, end: lodash.__, n: number): LodashInRange1x4;
+        (start: number, end: lodash.__, n: number): LodashInRange1x5;
+        (start: lodash.__, end: number, n: number): LodashInRange1x6;
+        (start: number, end: number, n: number): boolean;
+    }
+    interface LodashInRange1x1 {
+        (end: number): LodashInRange1x3;
+        (end: lodash.__, n: number): LodashInRange1x5;
+        (end: number, n: number): boolean;
+    }
+    interface LodashInRange1x2 {
+        (start: number): LodashInRange1x3;
+        (start: lodash.__, n: number): LodashInRange1x6;
+        (start: number, n: number): boolean;
+    }
+    type LodashInRange1x3 = (n: number) => boolean;
+    interface LodashInRange1x4 {
+        (start: number): LodashInRange1x5;
+        (start: lodash.__, end: number): LodashInRange1x6;
+        (start: number, end: number): boolean;
+    }
+    type LodashInRange1x5 = (end: number) => boolean;
+    type LodashInRange1x6 = (start: number) => boolean;
+    interface LodashIntersection {
+        <T>(arrays2: lodash.List<T>): LodashIntersection1x1<T>;
+        <T>(arrays2: lodash.__, arrays: lodash.List<T>): LodashIntersection1x2<T>;
+        <T>(arrays2: lodash.List<T>, arrays: lodash.List<T>): T[];
+    }
+    type LodashIntersection1x1<T> = (arrays: lodash.List<T>) => T[];
+    type LodashIntersection1x2<T> = (arrays2: lodash.List<T>) => T[];
+    interface LodashIntersectionBy {
+        <T1, T2>(iteratee: lodash.ValueIteratee<T1 | T2>): LodashIntersectionBy1x1<T1, T2>;
+        <T1>(iteratee: lodash.__, array: lodash.List<T1> | null): LodashIntersectionBy1x2<T1>;
+        <T1, T2>(iteratee: lodash.ValueIteratee<T1 | T2>, array: lodash.List<T1> | null): LodashIntersectionBy1x3<T1, T2>;
+        <T2>(iteratee: lodash.__, array: lodash.__, values: lodash.List<T2>): LodashIntersectionBy1x4<T2>;
+        <T1, T2>(iteratee: lodash.ValueIteratee<T1 | T2>, array: lodash.__, values: lodash.List<T2>): LodashIntersectionBy1x5<T1>;
+        <T1, T2>(iteratee: lodash.__, array: lodash.List<T1> | null, values: lodash.List<T2>): LodashIntersectionBy1x6<T1, T2>;
+        <T1, T2>(iteratee: lodash.ValueIteratee<T1 | T2>, array: lodash.List<T1> | null, values: lodash.List<T2>): T1[];
+    }
+    interface LodashIntersectionBy1x1<T1, T2> {
+        (array: lodash.List<T1> | null): LodashIntersectionBy1x3<T1, T2>;
+        (array: lodash.__, values: lodash.List<T2>): LodashIntersectionBy1x5<T1>;
+        (array: lodash.List<T1> | null, values: lodash.List<T2>): T1[];
+    }
+    interface LodashIntersectionBy1x2<T1> {
+        <T2>(iteratee: lodash.ValueIteratee<T1 | T2>): LodashIntersectionBy1x3<T1, T2>;
+        <T2>(iteratee: lodash.__, values: lodash.List<T2>): LodashIntersectionBy1x6<T1, T2>;
+        <T2>(iteratee: lodash.ValueIteratee<T1 | T2>, values: lodash.List<T2>): T1[];
+    }
+    type LodashIntersectionBy1x3<T1, T2> = (values: lodash.List<T2>) => T1[];
+    interface LodashIntersectionBy1x4<T2> {
+        <T1>(iteratee: lodash.ValueIteratee<T1 | T2>): LodashIntersectionBy1x5<T1>;
+        <T1>(iteratee: lodash.__, array: lodash.List<T1> | null): LodashIntersectionBy1x6<T1, T2>;
+        <T1>(iteratee: lodash.ValueIteratee<T1 | T2>, array: lodash.List<T1> | null): T1[];
+    }
+    type LodashIntersectionBy1x5<T1> = (array: lodash.List<T1> | null) => T1[];
+    type LodashIntersectionBy1x6<T1, T2> = (iteratee: lodash.ValueIteratee<T1 | T2>) => T1[];
+    interface LodashIntersectionWith {
+        <T1, T2>(comparator: lodash.Comparator2<T1, T2>): LodashIntersectionWith1x1<T1, T2>;
+        <T1>(comparator: lodash.__, array: lodash.List<T1> | null | undefined): LodashIntersectionWith1x2<T1>;
+        <T1, T2>(comparator: lodash.Comparator2<T1, T2>, array: lodash.List<T1> | null | undefined): LodashIntersectionWith1x3<T1, T2>;
+        <T2>(comparator: lodash.__, array: lodash.__, values: lodash.List<T2>): LodashIntersectionWith1x4<T2>;
+        <T1, T2>(comparator: lodash.Comparator2<T1, T2>, array: lodash.__, values: lodash.List<T2>): LodashIntersectionWith1x5<T1>;
+        <T1, T2>(comparator: lodash.__, array: lodash.List<T1> | null | undefined, values: lodash.List<T2>): LodashIntersectionWith1x6<T1, T2>;
+        <T1, T2>(comparator: lodash.Comparator2<T1, T2>, array: lodash.List<T1> | null | undefined, values: lodash.List<T2>): T1[];
+    }
+    interface LodashIntersectionWith1x1<T1, T2> {
+        (array: lodash.List<T1> | null | undefined): LodashIntersectionWith1x3<T1, T2>;
+        (array: lodash.__, values: lodash.List<T2>): LodashIntersectionWith1x5<T1>;
+        (array: lodash.List<T1> | null | undefined, values: lodash.List<T2>): T1[];
+    }
+    interface LodashIntersectionWith1x2<T1> {
+        <T2>(comparator: lodash.Comparator2<T1, T2>): LodashIntersectionWith1x3<T1, T2>;
+        <T2>(comparator: lodash.__, values: lodash.List<T2>): LodashIntersectionWith1x6<T1, T2>;
+        <T2>(comparator: lodash.Comparator2<T1, T2>, values: lodash.List<T2>): T1[];
+    }
+    type LodashIntersectionWith1x3<T1, T2> = (values: lodash.List<T2>) => T1[];
+    interface LodashIntersectionWith1x4<T2> {
+        <T1>(comparator: lodash.Comparator2<T1, T2>): LodashIntersectionWith1x5<T1>;
+        <T1>(comparator: lodash.__, array: lodash.List<T1> | null | undefined): LodashIntersectionWith1x6<T1, T2>;
+        <T1>(comparator: lodash.Comparator2<T1, T2>, array: lodash.List<T1> | null | undefined): T1[];
+    }
+    type LodashIntersectionWith1x5<T1> = (array: lodash.List<T1> | null | undefined) => T1[];
+    type LodashIntersectionWith1x6<T1, T2> = (comparator: lodash.Comparator2<T1, T2>) => T1[];
+    type LodashInvert = (object: object) => lodash.Dictionary<string>;
+    interface LodashInvertBy {
+        <T>(interatee: lodash.ValueIteratee<T>): LodashInvertBy1x1<T>;
+        <T>(interatee: lodash.__, object: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): LodashInvertBy1x2<T>;
+        <T>(interatee: lodash.ValueIteratee<T>, object: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): lodash.Dictionary<string[]>;
+        <T extends object>(interatee: lodash.__, object: T | null | undefined): LodashInvertBy2x2<T>;
+        <T extends object>(interatee: lodash.ValueIteratee<T[keyof T]>, object: T | null | undefined): lodash.Dictionary<string[]>;
+    }
+    type LodashInvertBy1x1<T> = (object: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | object | null | undefined) => lodash.Dictionary<string[]>;
+    type LodashInvertBy1x2<T> = (interatee: lodash.ValueIteratee<T>) => lodash.Dictionary<string[]>;
+    type LodashInvertBy2x2<T> = (interatee: lodash.ValueIteratee<T[keyof T]>) => lodash.Dictionary<string[]>;
+    interface LodashInvoke {
+        (path: lodash.PropertyPath): LodashInvoke1x1;
+        (path: lodash.__, object: any): LodashInvoke1x2;
+        (path: lodash.PropertyPath, object: any): any;
+    }
+    type LodashInvoke1x1 = (object: any) => any;
+    type LodashInvoke1x2 = (path: lodash.PropertyPath) => any;
+    interface LodashInvokeArgs {
+        (path: lodash.PropertyPath): LodashInvokeArgs1x1;
+        (path: lodash.__, args: ReadonlyArray<any>): LodashInvokeArgs1x2;
+        (path: lodash.PropertyPath, args: ReadonlyArray<any>): LodashInvokeArgs1x3;
+        (path: lodash.__, args: lodash.__, object: any): LodashInvokeArgs1x4;
+        (path: lodash.PropertyPath, args: lodash.__, object: any): LodashInvokeArgs1x5;
+        (path: lodash.__, args: ReadonlyArray<any>, object: any): LodashInvokeArgs1x6;
+        (path: lodash.PropertyPath, args: ReadonlyArray<any>, object: any): any;
+    }
+    interface LodashInvokeArgs1x1 {
+        (args: ReadonlyArray<any>): LodashInvokeArgs1x3;
+        (args: lodash.__, object: any): LodashInvokeArgs1x5;
+        (args: ReadonlyArray<any>, object: any): any;
+    }
+    interface LodashInvokeArgs1x2 {
+        (path: lodash.PropertyPath): LodashInvokeArgs1x3;
+        (path: lodash.__, object: any): LodashInvokeArgs1x6;
+        (path: lodash.PropertyPath, object: any): any;
+    }
+    type LodashInvokeArgs1x3 = (object: any) => any;
+    interface LodashInvokeArgs1x4 {
+        (path: lodash.PropertyPath): LodashInvokeArgs1x5;
+        (path: lodash.__, args: ReadonlyArray<any>): LodashInvokeArgs1x6;
+        (path: lodash.PropertyPath, args: ReadonlyArray<any>): any;
+    }
+    type LodashInvokeArgs1x5 = (args: ReadonlyArray<any>) => any;
+    type LodashInvokeArgs1x6 = (path: lodash.PropertyPath) => any;
+    interface LodashInvokeArgsMap {
+        (methodName: string): LodashInvokeArgsMap1x1;
+        (methodNameOrMethod: lodash.__, args: ReadonlyArray<any>): LodashInvokeArgsMap1x2;
+        (methodName: string, args: ReadonlyArray<any>): LodashInvokeArgsMap1x3;
+        (methodNameOrMethod: lodash.__, args: lodash.__, collection: object | null | undefined): LodashInvokeArgsMap1x4;
+        (methodName: string, args: lodash.__, collection: object | null | undefined): LodashInvokeArgsMap1x5;
+        (methodNameOrMethod: lodash.__, args: ReadonlyArray<any>, collection: object | null | undefined): LodashInvokeArgsMap1x6;
+        (methodName: string, args: ReadonlyArray<any>, collection: object | null | undefined): any[];
+        <TResult>(method: (...args: any[]) => TResult): LodashInvokeArgsMap2x1<TResult>;
+        <TResult>(method: (...args: any[]) => TResult, args: ReadonlyArray<any>): LodashInvokeArgsMap2x3<TResult>;
+        <TResult>(method: (...args: any[]) => TResult, args: lodash.__, collection: object | null | undefined): LodashInvokeArgsMap2x5<TResult>;
+        <TResult>(method: (...args: any[]) => TResult, args: ReadonlyArray<any>, collection: object | null | undefined): TResult[];
+    }
+    interface LodashInvokeArgsMap1x1 {
+        (args: ReadonlyArray<any>): LodashInvokeArgsMap1x3;
+        (args: lodash.__, collection: object | null | undefined): LodashInvokeArgsMap1x5;
+        (args: ReadonlyArray<any>, collection: object | null | undefined): any[];
+    }
+    interface LodashInvokeArgsMap1x2 {
+        (methodName: string): LodashInvokeArgsMap1x3;
+        (methodNameOrMethod: lodash.__, collection: object | null | undefined): LodashInvokeArgsMap1x6;
+        (methodName: string, collection: object | null | undefined): any[];
+        <TResult>(method: (...args: any[]) => TResult): LodashInvokeArgsMap2x3<TResult>;
+        <TResult>(method: (...args: any[]) => TResult, collection: object | null | undefined): TResult[];
+    }
+    type LodashInvokeArgsMap1x3 = (collection: object | null | undefined) => any[];
+    interface LodashInvokeArgsMap1x4 {
+        (methodName: string): LodashInvokeArgsMap1x5;
+        (methodNameOrMethod: lodash.__, args: ReadonlyArray<any>): LodashInvokeArgsMap1x6;
+        (methodName: string, args: ReadonlyArray<any>): any[];
+        <TResult>(method: (...args: any[]) => TResult): LodashInvokeArgsMap2x5<TResult>;
+        <TResult>(method: (...args: any[]) => TResult, args: ReadonlyArray<any>): TResult[];
+    }
+    type LodashInvokeArgsMap1x5 = (args: ReadonlyArray<any>) => any[];
+    interface LodashInvokeArgsMap1x6 {
+        (methodName: string): any[];
+        <TResult>(method: (...args: any[]) => TResult): TResult[];
+    }
+    interface LodashInvokeArgsMap2x1<TResult> {
+        (args: ReadonlyArray<any>): LodashInvokeArgsMap2x3<TResult>;
+        (args: lodash.__, collection: object | null | undefined): LodashInvokeArgsMap2x5<TResult>;
+        (args: ReadonlyArray<any>, collection: object | null | undefined): TResult[];
+    }
+    type LodashInvokeArgsMap2x3<TResult> = (collection: object | null | undefined) => TResult[];
+    type LodashInvokeArgsMap2x5<TResult> = (args: ReadonlyArray<any>) => TResult[];
+    interface LodashInvokeMap {
+        (methodName: string): LodashInvokeMap1x1;
+        (methodNameOrMethod: lodash.__, collection: object | null | undefined): LodashInvokeMap1x2;
+        (methodName: string, collection: object | null | undefined): any[];
+        <TResult>(method: (...args: any[]) => TResult): LodashInvokeMap2x1<TResult>;
+        <TResult>(method: (...args: any[]) => TResult, collection: object | null | undefined): TResult[];
+    }
+    type LodashInvokeMap1x1 = (collection: object | null | undefined) => any[];
+    interface LodashInvokeMap1x2 {
+        (methodName: string): any[];
+        <TResult>(method: (...args: any[]) => TResult): TResult[];
+    }
+    type LodashInvokeMap2x1<TResult> = (collection: object | null | undefined) => TResult[];
+    type LodashIsArguments = (value: any) => value is IArguments;
+    type LodashIsArray = (value: any) => value is any[];
+    type LodashIsArrayBuffer = (value: any) => value is ArrayBuffer;
+    interface LodashIsArrayLike {
+        <T>(value: T & string & number): boolean;
+        (value: ((...args: any[]) => any) | null | undefined): value is never;
+        (value: any): value is { length: number };
+    }
+    interface LodashIsArrayLikeObject {
+        <T>(value: T & string & number): boolean;
+        // tslint:disable-next-line:ban-types (type guard doesn't seem to work correctly without the Function type)
+        (value: ((...args: any[]) => any) | Function | string | boolean | number | null | undefined): value is never;
+        // tslint:disable-next-line:ban-types (type guard doesn't seem to work correctly without the Function type)
+        <T extends object>(value: T | ((...args: any[]) => any) | Function | string | boolean | number | null | undefined): value is T & { length: number };
+    }
+    type LodashIsBoolean = (value: any) => value is boolean;
+    type LodashIsBuffer = (value: any) => boolean;
+    type LodashIsDate = (value: any) => value is Date;
+    type LodashIsElement = (value: any) => boolean;
+    type LodashIsEmpty = (value: any) => boolean;
+    interface LodashIsEqualWith {
+        (customizer: lodash.IsEqualCustomizer): LodashIsEqualWith1x1;
+        (customizer: lodash.__, value: any): LodashIsEqualWith1x2;
+        (customizer: lodash.IsEqualCustomizer, value: any): LodashIsEqualWith1x3;
+        (customizer: lodash.__, value: lodash.__, other: any): LodashIsEqualWith1x4;
+        (customizer: lodash.IsEqualCustomizer, value: lodash.__, other: any): LodashIsEqualWith1x5;
+        (customizer: lodash.__, value: any, other: any): LodashIsEqualWith1x6;
+        (customizer: lodash.IsEqualCustomizer, value: any, other: any): boolean;
+    }
+    interface LodashIsEqualWith1x1 {
+        (value: any): LodashIsEqualWith1x3;
+        (value: lodash.__, other: any): LodashIsEqualWith1x5;
+        (value: any, other: any): boolean;
+    }
+    interface LodashIsEqualWith1x2 {
+        (customizer: lodash.IsEqualCustomizer): LodashIsEqualWith1x3;
+        (customizer: lodash.__, other: any): LodashIsEqualWith1x6;
+        (customizer: lodash.IsEqualCustomizer, other: any): boolean;
+    }
+    type LodashIsEqualWith1x3 = (other: any) => boolean;
+    interface LodashIsEqualWith1x4 {
+        (customizer: lodash.IsEqualCustomizer): LodashIsEqualWith1x5;
+        (customizer: lodash.__, value: any): LodashIsEqualWith1x6;
+        (customizer: lodash.IsEqualCustomizer, value: any): boolean;
+    }
+    type LodashIsEqualWith1x5 = (value: any) => boolean;
+    type LodashIsEqualWith1x6 = (customizer: lodash.IsEqualCustomizer) => boolean;
+    type LodashIsError = (value: any) => value is Error;
+    type LodashIsFinite = (value: any) => boolean;
+    type LodashIsFunction = (value: any) => value is (...args: any[]) => any;
+    type LodashIsInteger = (value: any) => boolean;
+    type LodashIsLength = (value: any) => boolean;
+    type LodashIsMap = (value: any) => value is Map<any, any>;
+    interface LodashIsMatch {
+        (source: object): LodashIsMatch1x1;
+        (source: lodash.__, object: object): LodashIsMatch1x2;
+        (source: object, object: object): boolean;
+    }
+    type LodashIsMatch1x1 = (object: object) => boolean;
+    type LodashIsMatch1x2 = (source: object) => boolean;
+    interface LodashIsMatchWith {
+        (customizer: lodash.isMatchWithCustomizer): LodashIsMatchWith1x1;
+        (customizer: lodash.__, source: object): LodashIsMatchWith1x2;
+        (customizer: lodash.isMatchWithCustomizer, source: object): LodashIsMatchWith1x3;
+        (customizer: lodash.__, source: lodash.__, object: object): LodashIsMatchWith1x4;
+        (customizer: lodash.isMatchWithCustomizer, source: lodash.__, object: object): LodashIsMatchWith1x5;
+        (customizer: lodash.__, source: object, object: object): LodashIsMatchWith1x6;
+        (customizer: lodash.isMatchWithCustomizer, source: object, object: object): boolean;
+    }
+    interface LodashIsMatchWith1x1 {
+        (source: object): LodashIsMatchWith1x3;
+        (source: lodash.__, object: object): LodashIsMatchWith1x5;
+        (source: object, object: object): boolean;
+    }
+    interface LodashIsMatchWith1x2 {
+        (customizer: lodash.isMatchWithCustomizer): LodashIsMatchWith1x3;
+        (customizer: lodash.__, object: object): LodashIsMatchWith1x6;
+        (customizer: lodash.isMatchWithCustomizer, object: object): boolean;
+    }
+    type LodashIsMatchWith1x3 = (object: object) => boolean;
+    interface LodashIsMatchWith1x4 {
+        (customizer: lodash.isMatchWithCustomizer): LodashIsMatchWith1x5;
+        (customizer: lodash.__, source: object): LodashIsMatchWith1x6;
+        (customizer: lodash.isMatchWithCustomizer, source: object): boolean;
+    }
+    type LodashIsMatchWith1x5 = (source: object) => boolean;
+    type LodashIsMatchWith1x6 = (customizer: lodash.isMatchWithCustomizer) => boolean;
+    type LodashIsNaN = (value: any) => boolean;
+    type LodashIsNative = (value: any) => value is (...args: any[]) => any;
+    type LodashIsNil = (value: any) => value is null | undefined;
+    type LodashIsNull = (value: any) => value is null;
+    type LodashIsNumber = (value: any) => value is number;
+    type LodashIsObject = (value: any) => boolean;
+    type LodashIsObjectLike = (value: any) => boolean;
+    type LodashIsPlainObject = (value: any) => boolean;
+    type LodashIsRegExp = (value: any) => value is RegExp;
+    type LodashIsSafeInteger = (value: any) => boolean;
+    type LodashIsSet = (value: any) => value is Set<any>;
+    type LodashIsString = (value: any) => value is string;
+    type LodashIsSymbol = (value: any) => boolean;
+    type LodashIsTypedArray = (value: any) => boolean;
+    type LodashIsUndefined = (value: any) => value is undefined;
+    type LodashIsWeakMap = (value: any) => value is WeakMap<object, any>;
+    type LodashIsWeakSet = (value: any) => value is WeakSet<object>;
+    interface LodashIteratee {
+        <TFunction extends (...args: any[]) => any>(func: TFunction): TFunction;
+        (func: string | object): (...args: any[]) => any;
+    }
+    interface LodashJoin {
+        (separator: string): LodashJoin1x1;
+        (separator: lodash.__, array: lodash.List<any> | null | undefined): LodashJoin1x2;
+        (separator: string, array: lodash.List<any> | null | undefined): string;
+    }
+    type LodashJoin1x1 = (array: lodash.List<any> | null | undefined) => string;
+    type LodashJoin1x2 = (separator: string) => string;
+    type LodashOver = <TResult>(iteratees: lodash.Many<(...args: any[]) => TResult>) => (...args: any[]) => TResult[];
+    type LodashKebabCase = (string: string) => string;
+    type LodashKeys = (object: any) => string[];
+    type LodashKeysIn = (object: any) => string[];
+    type LodashLast = <T>(array: lodash.List<T> | null | undefined) => T | undefined;
+    interface LodashLastIndexOf {
+        <T>(value: T): LodashLastIndexOf1x1<T>;
+        <T>(value: lodash.__, array: lodash.List<T> | null | undefined): LodashLastIndexOf1x2<T>;
+        <T>(value: T, array: lodash.List<T> | null | undefined): number;
+    }
+    type LodashLastIndexOf1x1<T> = (array: lodash.List<T> | null | undefined) => number;
+    type LodashLastIndexOf1x2<T> = (value: T) => number;
+    interface LodashLastIndexOfFrom {
+        <T>(value: T): LodashLastIndexOfFrom1x1<T>;
+        (value: lodash.__, fromIndex: true|number): LodashLastIndexOfFrom1x2;
+        <T>(value: T, fromIndex: true|number): LodashLastIndexOfFrom1x3<T>;
+        <T>(value: lodash.__, fromIndex: lodash.__, array: lodash.List<T> | null | undefined): LodashLastIndexOfFrom1x4<T>;
+        <T>(value: T, fromIndex: lodash.__, array: lodash.List<T> | null | undefined): LodashLastIndexOfFrom1x5;
+        <T>(value: lodash.__, fromIndex: true|number, array: lodash.List<T> | null | undefined): LodashLastIndexOfFrom1x6<T>;
+        <T>(value: T, fromIndex: true|number, array: lodash.List<T> | null | undefined): number;
+    }
+    interface LodashLastIndexOfFrom1x1<T> {
+        (fromIndex: true|number): LodashLastIndexOfFrom1x3<T>;
+        (fromIndex: lodash.__, array: lodash.List<T> | null | undefined): LodashLastIndexOfFrom1x5;
+        (fromIndex: true|number, array: lodash.List<T> | null | undefined): number;
+    }
+    interface LodashLastIndexOfFrom1x2 {
+        <T>(value: T): LodashLastIndexOfFrom1x3<T>;
+        <T>(value: lodash.__, array: lodash.List<T> | null | undefined): LodashLastIndexOfFrom1x6<T>;
+        <T>(value: T, array: lodash.List<T> | null | undefined): number;
+    }
+    type LodashLastIndexOfFrom1x3<T> = (array: lodash.List<T> | null | undefined) => number;
+    interface LodashLastIndexOfFrom1x4<T> {
+        (value: T): LodashLastIndexOfFrom1x5;
+        (value: lodash.__, fromIndex: true|number): LodashLastIndexOfFrom1x6<T>;
+        (value: T, fromIndex: true|number): number;
+    }
+    type LodashLastIndexOfFrom1x5 = (fromIndex: true|number) => number;
+    type LodashLastIndexOfFrom1x6<T> = (value: T) => number;
+    type LodashLowerCase = (string: string) => string;
+    type LodashLowerFirst = (string: string) => string;
+    interface LodashLt {
+        (value: any): LodashLt1x1;
+        (value: lodash.__, other: any): LodashLt1x2;
+        (value: any, other: any): boolean;
+    }
+    type LodashLt1x1 = (other: any) => boolean;
+    type LodashLt1x2 = (value: any) => boolean;
+    interface LodashLte {
+        (value: any): LodashLte1x1;
+        (value: lodash.__, other: any): LodashLte1x2;
+        (value: any, other: any): boolean;
+    }
+    type LodashLte1x1 = (other: any) => boolean;
+    type LodashLte1x2 = (value: any) => boolean;
+    interface LodashMap {
+        <T, TResult>(iteratee: (value: T) => TResult): LodashMap1x1<T, TResult>;
+        <T>(iteratee: lodash.__, collection: T[] | null | undefined): LodashMap1x2<T>;
+        <T, TResult>(iteratee: (value: T) => TResult, collection: T[] | lodash.List<T> | null | undefined): TResult[];
+        <T>(iteratee: lodash.__, collection: lodash.List<T> | null | undefined): LodashMap2x2<T>;
+        <T extends object, TResult>(iteratee: (value: T[keyof T]) => TResult): LodashMap3x1<T, TResult>;
+        <T extends object>(iteratee: lodash.__, collection: T | null | undefined): LodashMap3x2<T>;
+        <T extends object, TResult>(iteratee: (value: T[keyof T]) => TResult, collection: T | null | undefined): TResult[];
+        <T, K extends keyof T>(iteratee: K): LodashMap4x1<T, K>;
+        <T>(iteratee: lodash.__, collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): LodashMap4x2<T>;
+        <T, K extends keyof T>(iteratee: K, collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): Array<T[K]>;
+        (iteratee: string): LodashMap5x1;
+        <T>(iteratee: string, collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): any[];
+        (iteratee: object): LodashMap6x1;
+        <T>(iteratee: object, collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): boolean[];
+    }
+    type LodashMap1x1<T, TResult> = (collection: T[] | lodash.List<T> | null | undefined) => TResult[];
+    type LodashMap1x2<T> = <TResult>(iteratee: (value: T) => TResult) => TResult[];
+    type LodashMap2x2<T> = <TResult>(iteratee: (value: T) => TResult) => TResult[];
+    type LodashMap3x1<T, TResult> = (collection: T | null | undefined) => TResult[];
+    type LodashMap3x2<T> = <TResult>(iteratee: (value: T[keyof T]) => TResult) => TResult[];
+    type LodashMap4x1<T, K extends keyof T> = (collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined) => Array<T[K]>;
+    interface LodashMap4x2<T> {
+        <K extends keyof T>(iteratee: K): Array<T[K]>;
+        (iteratee: string): any[];
+        (iteratee: object): boolean[];
+    }
+    type LodashMap5x1 = <T>(collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined) => any[];
+    type LodashMap6x1 = <T>(collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined) => boolean[];
+    interface LodashMapKeys {
+        (iteratee: lodash.ValueIteratee<number>): LodashMapKeys1x1;
+        <T>(iteratee: lodash.__, object: lodash.List<T> | null | undefined): LodashMapKeys1x2<T>;
+        <T>(iteratee: lodash.ValueIteratee<number>, object: lodash.List<T> | null | undefined): lodash.Dictionary<T>;
+        (iteratee: lodash.ValueIteratee<string>): LodashMapKeys2x1;
+        <T extends object>(iteratee: lodash.__, object: T | null | undefined): LodashMapKeys2x2<T>;
+        <T extends object>(iteratee: lodash.ValueIteratee<string>, object: T | null | undefined): lodash.Dictionary<T[keyof T]>;
+    }
+    type LodashMapKeys1x1 = <T>(object: lodash.List<T> | null | undefined) => lodash.Dictionary<T>;
+    type LodashMapKeys1x2<T> = (iteratee: lodash.ValueIteratee<number>) => lodash.Dictionary<T>;
+    type LodashMapKeys2x1 = <T extends object>(object: T | null | undefined) => lodash.Dictionary<T[keyof T]>;
+    type LodashMapKeys2x2<T> = (iteratee: lodash.ValueIteratee<string>) => lodash.Dictionary<T[keyof T]>;
+    interface LodashMapValues {
+        <TResult>(callback: (value: string) => TResult): LodashMapValues1x1<TResult>;
+        (callback: lodash.__, obj: string | null | undefined): LodashMapValues1x2;
+        <TResult>(callback: (value: string) => TResult, obj: string | null | undefined): lodash.NumericDictionary<TResult>;
+        <T, TResult>(callback: (value: T) => TResult): LodashMapValues2x1<T, TResult>;
+        <T>(callbackOrIterateeOrIterateeOrIteratee: lodash.__, obj: lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): LodashMapValues2x2<T>;
+        <T, TResult>(callback: (value: T) => TResult, obj: lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): lodash.Dictionary<TResult>;
+        <T extends object, TResult>(callback: (value: T[keyof T]) => TResult): LodashMapValues3x1<T, TResult>;
+        <T extends object>(callbackOrIterateeOrIteratee: lodash.__, obj: T | null | undefined): LodashMapValues3x2<T>;
+        <T extends object, TResult>(callback: (value: T[keyof T]) => TResult, obj: T | null | undefined): { [P in keyof T]: TResult };
+        (iteratee: object): LodashMapValues4x1;
+        <T>(iteratee: object, obj: lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): lodash.Dictionary<boolean>;
+        <T extends object>(iteratee: object, obj: T | null | undefined): { [P in keyof T]: boolean };
+        <T, TKey extends keyof T>(iteratee: TKey): LodashMapValues6x1<T, TKey>;
+        <T, TKey extends keyof T>(iteratee: TKey, obj: lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): lodash.Dictionary<T[TKey]>;
+        (iteratee: string): LodashMapValues7x1;
+        <T>(iteratee: string, obj: lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): lodash.Dictionary<any>;
+        <T extends object>(iteratee: string, obj: T | null | undefined): { [P in keyof T]: any };
+    }
+    type LodashMapValues1x1<TResult> = (obj: string | null | undefined) => lodash.NumericDictionary<TResult>;
+    type LodashMapValues1x2 = <TResult>(callback: (value: string) => TResult) => lodash.NumericDictionary<TResult>;
+    type LodashMapValues2x1<T, TResult> = (obj: lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined) => lodash.Dictionary<TResult>;
+    interface LodashMapValues2x2<T> {
+        <TResult>(callback: (value: T) => TResult): lodash.Dictionary<TResult>;
+        (iteratee: object): lodash.Dictionary<boolean>;
+        <TKey extends keyof T>(iteratee: TKey): lodash.Dictionary<T[TKey]>;
+        (iteratee: string): lodash.Dictionary<any>;
+    }
+    type LodashMapValues3x1<T, TResult> = (obj: T | null | undefined) => { [P in keyof T]: TResult };
+    interface LodashMapValues3x2<T> {
+        <TResult>(callback: (value: T[keyof T]) => TResult): { [P in keyof T]: TResult };
+        (iteratee: object): { [P in keyof T]: boolean };
+        (iteratee: string): { [P in keyof T]: any };
+    }
+    interface LodashMapValues4x1 {
+        <T>(obj: lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): lodash.Dictionary<boolean>;
+        <T extends object>(obj: T | null | undefined): { [P in keyof T]: boolean };
+    }
+    type LodashMapValues6x1<T, TKey extends keyof T> = (obj: lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined) => lodash.Dictionary<T[TKey]>;
+    interface LodashMapValues7x1 {
+        <T>(obj: lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): lodash.Dictionary<any>;
+        <T extends object>(obj: T | null | undefined): { [P in keyof T]: any };
+    }
+    interface LodashMatchesProperty {
+        (path: lodash.PropertyPath): LodashMatchesProperty1x1;
+        <T>(path: lodash.__, srcValue: T): LodashMatchesProperty1x2;
+        <T>(path: lodash.PropertyPath, srcValue: T): (value: any) => boolean;
+    }
+    type LodashMatchesProperty1x1 = <T>(srcValue: T) => (value: any) => boolean;
+    type LodashMatchesProperty1x2 = (path: lodash.PropertyPath) => (value: any) => boolean;
+    type LodashMax = <T>(collection: lodash.List<T> | null | undefined) => T | undefined;
+    interface LodashMaxBy {
+        <T>(iteratee: lodash.ValueIteratee<T>): LodashMaxBy1x1<T>;
+        <T>(iteratee: lodash.__, collection: lodash.List<T> | null | undefined): LodashMaxBy1x2<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, collection: lodash.List<T> | null | undefined): T | undefined;
+    }
+    type LodashMaxBy1x1<T> = (collection: lodash.List<T> | null | undefined) => T | undefined;
+    type LodashMaxBy1x2<T> = (iteratee: lodash.ValueIteratee<T>) => T | undefined;
+    type LodashMean = (collection: lodash.List<any> | null | undefined) => number;
+    interface LodashMeanBy {
+        <T>(iteratee: lodash.ValueIteratee<T>): LodashMeanBy1x1<T>;
+        <T>(iteratee: lodash.__, collection: lodash.List<T> | null | undefined): LodashMeanBy1x2<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, collection: lodash.List<T> | null | undefined): number;
+    }
+    type LodashMeanBy1x1<T> = (collection: lodash.List<T> | null | undefined) => number;
+    type LodashMeanBy1x2<T> = (iteratee: lodash.ValueIteratee<T>) => number;
+    type LodashMemoize = <T extends (...args: any[]) => any>(func: T) => T & lodash.MemoizedFunction;
+    interface LodashMerge {
+        <TObject>(object: TObject): LodashMerge1x1<TObject>;
+        <TSource>(object: lodash.__, source: TSource): LodashMerge1x2<TSource>;
+        <TObject, TSource>(object: TObject, source: TSource): TObject & TSource;
+    }
+    type LodashMerge1x1<TObject> = <TSource>(source: TSource) => TObject & TSource;
+    type LodashMerge1x2<TSource> = <TObject>(object: TObject) => TObject & TSource;
+    interface LodashMergeAll {
+        <TObject, TSource>(object: [TObject, TSource]): TObject & TSource;
+        <TObject, TSource1, TSource2>(object: [TObject, TSource1, TSource2]): TObject & TSource1 & TSource2;
+        <TObject, TSource1, TSource2, TSource3>(object: [TObject, TSource1, TSource2, TSource3]): TObject & TSource1 & TSource2 & TSource3;
+        <TObject, TSource1, TSource2, TSource3, TSource4>(object: [TObject, TSource1, TSource2, TSource3, TSource4]): TObject & TSource1 & TSource2 & TSource3 & TSource4;
+        (object: ReadonlyArray<any>): any;
+    }
+    interface LodashMergeAllWith {
+        (customizer: lodash.MergeWithCustomizer): LodashMergeAllWith1x1;
+        (customizer: lodash.__, args: ReadonlyArray<any>): LodashMergeAllWith1x2;
+        (customizer: lodash.MergeWithCustomizer, args: ReadonlyArray<any>): any;
+    }
+    type LodashMergeAllWith1x1 = (args: ReadonlyArray<any>) => any;
+    type LodashMergeAllWith1x2 = (customizer: lodash.MergeWithCustomizer) => any;
+    interface LodashMergeWith {
+        (customizer: lodash.MergeWithCustomizer): LodashMergeWith1x1;
+        <TObject>(customizer: lodash.__, object: TObject): LodashMergeWith1x2<TObject>;
+        <TObject>(customizer: lodash.MergeWithCustomizer, object: TObject): LodashMergeWith1x3<TObject>;
+        <TSource>(customizer: lodash.__, object: lodash.__, source: TSource): LodashMergeWith1x4<TSource>;
+        <TSource>(customizer: lodash.MergeWithCustomizer, object: lodash.__, source: TSource): LodashMergeWith1x5<TSource>;
+        <TObject, TSource>(customizer: lodash.__, object: TObject, source: TSource): LodashMergeWith1x6<TObject, TSource>;
+        <TObject, TSource>(customizer: lodash.MergeWithCustomizer, object: TObject, source: TSource): TObject & TSource;
+    }
+    interface LodashMergeWith1x1 {
+        <TObject>(object: TObject): LodashMergeWith1x3<TObject>;
+        <TSource>(object: lodash.__, source: TSource): LodashMergeWith1x5<TSource>;
+        <TObject, TSource>(object: TObject, source: TSource): TObject & TSource;
+    }
+    interface LodashMergeWith1x2<TObject> {
+        (customizer: lodash.MergeWithCustomizer): LodashMergeWith1x3<TObject>;
+        <TSource>(customizer: lodash.__, source: TSource): LodashMergeWith1x6<TObject, TSource>;
+        <TSource>(customizer: lodash.MergeWithCustomizer, source: TSource): TObject & TSource;
+    }
+    type LodashMergeWith1x3<TObject> = <TSource>(source: TSource) => TObject & TSource;
+    interface LodashMergeWith1x4<TSource> {
+        (customizer: lodash.MergeWithCustomizer): LodashMergeWith1x5<TSource>;
+        <TObject>(customizer: lodash.__, object: TObject): LodashMergeWith1x6<TObject, TSource>;
+        <TObject>(customizer: lodash.MergeWithCustomizer, object: TObject): TObject & TSource;
+    }
+    type LodashMergeWith1x5<TSource> = <TObject>(object: TObject) => TObject & TSource;
+    type LodashMergeWith1x6<TObject, TSource> = (customizer: lodash.MergeWithCustomizer) => TObject & TSource;
+    type LodashMethod = (path: lodash.PropertyPath) => (object: any) => any;
+    type LodashMethodOf = (object: object) => (path: lodash.PropertyPath) => any;
+    type LodashMin = <T>(collection: lodash.List<T> | null | undefined) => T | undefined;
+    interface LodashMinBy {
+        <T>(iteratee: lodash.ValueIteratee<T>): LodashMinBy1x1<T>;
+        <T>(iteratee: lodash.__, collection: lodash.List<T> | null | undefined): LodashMinBy1x2<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, collection: lodash.List<T> | null | undefined): T | undefined;
+    }
+    type LodashMinBy1x1<T> = (collection: lodash.List<T> | null | undefined) => T | undefined;
+    type LodashMinBy1x2<T> = (iteratee: lodash.ValueIteratee<T>) => T | undefined;
+    interface LodashMultiply {
+        (multiplier: number): LodashMultiply1x1;
+        (multiplier: lodash.__, multiplicand: number): LodashMultiply1x2;
+        (multiplier: number, multiplicand: number): number;
+    }
+    type LodashMultiply1x1 = (multiplicand: number) => number;
+    type LodashMultiply1x2 = (multiplier: number) => number;
+    type LodashNoConflict = () => typeof _;
+    type LodashNoop = (...args: any[]) => void;
+    type LodashNow = () => number;
+    interface LodashNth {
+        (n: number): LodashNth1x1;
+        <T>(n: lodash.__, array: lodash.List<T> | null | undefined): LodashNth1x2<T>;
+        <T>(n: number, array: lodash.List<T> | null | undefined): T | undefined;
+    }
+    type LodashNth1x1 = <T>(array: lodash.List<T> | null | undefined) => T | undefined;
+    type LodashNth1x2<T> = (n: number) => T | undefined;
+    type LodashNthArg = (n: number) => (...args: any[]) => any;
+    interface LodashOmit {
+        (paths: lodash.Many<lodash.PropertyName>): LodashOmit1x1;
+        <T extends lodash.AnyKindOfDictionary>(paths: lodash.__, object: T | null | undefined): LodashOmit1x2<T>;
+        <T extends lodash.AnyKindOfDictionary>(paths: lodash.Many<lodash.PropertyName>, object: T | null | undefined): T;
+        <T extends object, K extends keyof T>(paths: lodash.Many<K>): LodashOmit2x1<T, K>;
+        <T extends object>(paths: lodash.__, object: T | null | undefined): LodashOmit2x2<T>;
+        <T extends object, K extends keyof T>(paths: lodash.Many<K>, object: T | null | undefined): lodash.Omit<T, K>;
+        <T extends object>(paths: lodash.Many<lodash.PropertyName>, object: T | null | undefined): lodash.PartialObject<T>;
+    }
+    interface LodashOmit1x1 {
+        <T extends lodash.AnyKindOfDictionary>(object: T | null | undefined): T;
+        <T extends object>(object: T | null | undefined): lodash.PartialObject<T>;
+    }
+    type LodashOmit1x2<T> = (paths: lodash.Many<lodash.PropertyName>) => T;
+    type LodashOmit2x1<T, K extends keyof T> = (object: T | null | undefined) => lodash.Omit<T, K>;
+    interface LodashOmit2x2<T> {
+        <K extends keyof T>(paths: lodash.Many<K>): lodash.Omit<T, K>;
+        (paths: lodash.Many<lodash.PropertyName>): lodash.PartialObject<T>;
+    }
+    interface LodashOmitBy {
+        <T>(predicate: lodash.ValueKeyIteratee<T>): LodashOmitBy1x1<T>;
+        <T extends object>(predicate: lodash.__, object: T | null | undefined): LodashOmitBy1x2<T>;
+        <T extends object>(predicate: lodash.ValueKeyIteratee<T[keyof T]>, object: T | null | undefined): lodash.PartialObject<T>;
+    }
+    type LodashOmitBy1x1<T> = <T1 extends object>(object: T1 | null | undefined) => lodash.PartialObject<T1>;
+    type LodashOmitBy1x2<T> = (predicate: lodash.ValueKeyIteratee<T[keyof T]>) => lodash.PartialObject<T>;
+    type LodashOnce = <T extends (...args: any[]) => any>(func: T) => T;
+    interface LodashOrderBy {
+        <T>(iteratees: lodash.Many<(value: T) => lodash.NotVoid>): LodashOrderBy1x1<T>;
+        (iteratees: lodash.__, orders: lodash.Many<boolean|string>): LodashOrderBy1x2;
+        <T>(iteratees: lodash.Many<(value: T) => lodash.NotVoid>, orders: lodash.Many<boolean|string>): LodashOrderBy1x3<T>;
+        <T>(iteratees: lodash.__, orders: lodash.__, collection: lodash.List<T> | null | undefined): LodashOrderBy1x4<T>;
+        <T>(iteratees: lodash.Many<(value: T) => lodash.NotVoid>, orders: lodash.__, collection: lodash.List<T> | null | undefined): LodashOrderBy1x5<T>;
+        <T>(iteratees: lodash.__, orders: lodash.Many<boolean|string>, collection: lodash.List<T> | null | undefined): LodashOrderBy1x6<T>;
+        <T>(iteratees: lodash.Many<(value: T) => lodash.NotVoid> | lodash.Many<lodash.ValueIteratee<T>>, orders: lodash.Many<boolean | string>, collection: lodash.List<T> | null | undefined): T[];
+        <T>(iteratees: lodash.Many<lodash.ValueIteratee<T>>): LodashOrderBy2x1<T>;
+        <T>(iteratees: lodash.Many<lodash.ValueIteratee<T>>, orders: lodash.Many<boolean|string>): LodashOrderBy2x3<T>;
+        <T>(iteratees: lodash.Many<lodash.ValueIteratee<T>>, orders: lodash.__, collection: lodash.List<T> | null | undefined): LodashOrderBy2x5<T>;
+        <T extends object>(iteratees: lodash.__, orders: lodash.__, collection: T | null | undefined): LodashOrderBy3x4<T>;
+        <T extends object>(iteratees: lodash.Many<(value: T[keyof T]) => lodash.NotVoid>, orders: lodash.__, collection: T | null | undefined): LodashOrderBy3x5<T>;
+        <T extends object>(iteratees: lodash.__, orders: lodash.Many<boolean|string>, collection: T | null | undefined): LodashOrderBy3x6<T>;
+        <T extends object>(iteratees: lodash.Many<(value: T[keyof T]) => lodash.NotVoid> | lodash.Many<lodash.ValueIteratee<T[keyof T]>>, orders: lodash.Many<boolean | string>, collection: T | null | undefined): Array<T[keyof T]>;
+        <T extends object>(iteratees: lodash.Many<lodash.ValueIteratee<T[keyof T]>>, orders: lodash.__, collection: T | null | undefined): LodashOrderBy4x5<T>;
+    }
+    interface LodashOrderBy1x1<T> {
+        (orders: lodash.Many<boolean | string>): LodashOrderBy1x3<T>;
+        (orders: lodash.__, collection: lodash.List<T> | null | undefined): LodashOrderBy1x5<T>;
+        (orders: lodash.Many<boolean | string>, collection: lodash.List<T> | object | null | undefined): T[];
+        <T1 extends object>(orders: lodash.__, collection: T1 | null | undefined): LodashOrderBy3x5<T>;
+    }
+    interface LodashOrderBy1x2 {
+        <T>(iteratees: lodash.Many<(value: T) => lodash.NotVoid>): LodashOrderBy1x3<T>;
+        <T>(iteratees: lodash.__, collection: lodash.List<T> | null | undefined): LodashOrderBy1x6<T>;
+        <T>(iteratees: lodash.Many<(value: T) => lodash.NotVoid> | lodash.Many<lodash.ValueIteratee<T>>, collection: lodash.List<T> | null | undefined): T[];
+        <T>(iteratees: lodash.Many<lodash.ValueIteratee<T>>): LodashOrderBy2x3<T>;
+        <T extends object>(iteratees: lodash.__, collection: T | null | undefined): LodashOrderBy3x6<T>;
+        <T extends object>(iteratees: lodash.Many<(value: T[keyof T]) => lodash.NotVoid> | lodash.Many<lodash.ValueIteratee<T[keyof T]>>, collection: T | null | undefined): Array<T[keyof T]>;
+    }
+    interface LodashOrderBy1x3<T> {
+        (collection: lodash.List<T> | null | undefined): T[];
+        (collection: object | null | undefined): object[];
+    }
+    interface LodashOrderBy1x4<T> {
+        (iteratees: lodash.Many<(value: T) => lodash.NotVoid>): LodashOrderBy1x5<T>;
+        (iteratees: lodash.__, orders: lodash.Many<boolean | string>): LodashOrderBy1x6<T>;
+        (iteratees: lodash.Many<(value: T) => lodash.NotVoid> | lodash.Many<lodash.ValueIteratee<T>>, orders: lodash.Many<boolean | string>): T[];
+        (iteratees: lodash.Many<lodash.ValueIteratee<T>>): LodashOrderBy2x5<T>;
+    }
+    type LodashOrderBy1x5<T> = (orders: lodash.Many<boolean|string>) => T[];
+    type LodashOrderBy1x6<T> = (iteratees: lodash.Many<(value: T) => lodash.NotVoid> | lodash.Many<lodash.ValueIteratee<T>>) => T[];
+    interface LodashOrderBy2x1<T> {
+        (orders: lodash.Many<boolean | string>): LodashOrderBy2x3<T>;
+        (orders: lodash.__, collection: lodash.List<T> | null | undefined): LodashOrderBy2x5<T>;
+        (orders: lodash.Many<boolean | string>, collection: lodash.List<T> | object | null | undefined): T[];
+        <T1 extends object>(orders: lodash.__, collection: T1 | null | undefined): LodashOrderBy4x5<T>;
+    }
+    interface LodashOrderBy2x3<T> {
+        (collection: lodash.List<T> | null | undefined): T[];
+        (collection: object | null | undefined): object[];
+    }
+    type LodashOrderBy2x5<T> = (orders: lodash.Many<boolean|string>) => T[];
+    interface LodashOrderBy3x4<T> {
+        (iteratees: lodash.Many<(value: T[keyof T]) => lodash.NotVoid>): LodashOrderBy3x5<T>;
+        (iteratees: lodash.__, orders: lodash.Many<boolean | string>): LodashOrderBy3x6<T>;
+        (iteratees: lodash.Many<(value: T[keyof T]) => lodash.NotVoid> | lodash.Many<lodash.ValueIteratee<T[keyof T]>>, orders: lodash.Many<boolean | string>): Array<T[keyof T]>;
+        (iteratees: lodash.Many<lodash.ValueIteratee<T[keyof T]>>): LodashOrderBy4x5<T>;
+    }
+    type LodashOrderBy3x5<T> = (orders: lodash.Many<boolean|string>) => Array<T[keyof T]>;
+    type LodashOrderBy3x6<T> = (iteratees: lodash.Many<(value: T[keyof T]) => lodash.NotVoid> | lodash.Many<lodash.ValueIteratee<T[keyof T]>>) => Array<T[keyof T]>;
+    type LodashOrderBy4x5<T> = (orders: lodash.Many<boolean|string>) => Array<T[keyof T]>;
+    interface LodashOverArgs {
+        (func: (...args: any[]) => any): LodashOverArgs1x1;
+        (func: lodash.__, transforms: lodash.Many<(...args: any[]) => any>): LodashOverArgs1x2;
+        (func: (...args: any[]) => any, transforms: lodash.Many<(...args: any[]) => any>): (...args: any[]) => any;
+    }
+    type LodashOverArgs1x1 = (transforms: lodash.Many<(...args: any[]) => any>) => (...args: any[]) => any;
+    type LodashOverArgs1x2 = (func: (...args: any[]) => any) => (...args: any[]) => any;
+    interface LodashPad {
+        (length: number): LodashPad1x1;
+        (length: lodash.__, string: string): LodashPad1x2;
+        (length: number, string: string): string;
+    }
+    type LodashPad1x1 = (string: string) => string;
+    type LodashPad1x2 = (length: number) => string;
+    interface LodashPadChars {
+        (chars: string): LodashPadChars1x1;
+        (chars: lodash.__, length: number): LodashPadChars1x2;
+        (chars: string, length: number): LodashPadChars1x3;
+        (chars: lodash.__, length: lodash.__, string: string): LodashPadChars1x4;
+        (chars: string, length: lodash.__, string: string): LodashPadChars1x5;
+        (chars: lodash.__, length: number, string: string): LodashPadChars1x6;
+        (chars: string, length: number, string: string): string;
+    }
+    interface LodashPadChars1x1 {
+        (length: number): LodashPadChars1x3;
+        (length: lodash.__, string: string): LodashPadChars1x5;
+        (length: number, string: string): string;
+    }
+    interface LodashPadChars1x2 {
+        (chars: string): LodashPadChars1x3;
+        (chars: lodash.__, string: string): LodashPadChars1x6;
+        (chars: string, string: string): string;
+    }
+    type LodashPadChars1x3 = (string: string) => string;
+    interface LodashPadChars1x4 {
+        (chars: string): LodashPadChars1x5;
+        (chars: lodash.__, length: number): LodashPadChars1x6;
+        (chars: string, length: number): string;
+    }
+    type LodashPadChars1x5 = (length: number) => string;
+    type LodashPadChars1x6 = (chars: string) => string;
+    interface LodashPadCharsEnd {
+        (chars: string): LodashPadCharsEnd1x1;
+        (chars: lodash.__, length: number): LodashPadCharsEnd1x2;
+        (chars: string, length: number): LodashPadCharsEnd1x3;
+        (chars: lodash.__, length: lodash.__, string: string): LodashPadCharsEnd1x4;
+        (chars: string, length: lodash.__, string: string): LodashPadCharsEnd1x5;
+        (chars: lodash.__, length: number, string: string): LodashPadCharsEnd1x6;
+        (chars: string, length: number, string: string): string;
+    }
+    interface LodashPadCharsEnd1x1 {
+        (length: number): LodashPadCharsEnd1x3;
+        (length: lodash.__, string: string): LodashPadCharsEnd1x5;
+        (length: number, string: string): string;
+    }
+    interface LodashPadCharsEnd1x2 {
+        (chars: string): LodashPadCharsEnd1x3;
+        (chars: lodash.__, string: string): LodashPadCharsEnd1x6;
+        (chars: string, string: string): string;
+    }
+    type LodashPadCharsEnd1x3 = (string: string) => string;
+    interface LodashPadCharsEnd1x4 {
+        (chars: string): LodashPadCharsEnd1x5;
+        (chars: lodash.__, length: number): LodashPadCharsEnd1x6;
+        (chars: string, length: number): string;
+    }
+    type LodashPadCharsEnd1x5 = (length: number) => string;
+    type LodashPadCharsEnd1x6 = (chars: string) => string;
+    interface LodashPadCharsStart {
+        (chars: string): LodashPadCharsStart1x1;
+        (chars: lodash.__, length: number): LodashPadCharsStart1x2;
+        (chars: string, length: number): LodashPadCharsStart1x3;
+        (chars: lodash.__, length: lodash.__, string: string): LodashPadCharsStart1x4;
+        (chars: string, length: lodash.__, string: string): LodashPadCharsStart1x5;
+        (chars: lodash.__, length: number, string: string): LodashPadCharsStart1x6;
+        (chars: string, length: number, string: string): string;
+    }
+    interface LodashPadCharsStart1x1 {
+        (length: number): LodashPadCharsStart1x3;
+        (length: lodash.__, string: string): LodashPadCharsStart1x5;
+        (length: number, string: string): string;
+    }
+    interface LodashPadCharsStart1x2 {
+        (chars: string): LodashPadCharsStart1x3;
+        (chars: lodash.__, string: string): LodashPadCharsStart1x6;
+        (chars: string, string: string): string;
+    }
+    type LodashPadCharsStart1x3 = (string: string) => string;
+    interface LodashPadCharsStart1x4 {
+        (chars: string): LodashPadCharsStart1x5;
+        (chars: lodash.__, length: number): LodashPadCharsStart1x6;
+        (chars: string, length: number): string;
+    }
+    type LodashPadCharsStart1x5 = (length: number) => string;
+    type LodashPadCharsStart1x6 = (chars: string) => string;
+    interface LodashPadEnd {
+        (length: number): LodashPadEnd1x1;
+        (length: lodash.__, string: string): LodashPadEnd1x2;
+        (length: number, string: string): string;
+    }
+    type LodashPadEnd1x1 = (string: string) => string;
+    type LodashPadEnd1x2 = (length: number) => string;
+    interface LodashPadStart {
+        (length: number): LodashPadStart1x1;
+        (length: lodash.__, string: string): LodashPadStart1x2;
+        (length: number, string: string): string;
+    }
+    type LodashPadStart1x1 = (string: string) => string;
+    type LodashPadStart1x2 = (length: number) => string;
+    interface LodashParseInt {
+        (radix: number): LodashParseInt1x1;
+        (radix: lodash.__, string: string): LodashParseInt1x2;
+        (radix: number, string: string): number;
+    }
+    type LodashParseInt1x1 = (string: string) => number;
+    type LodashParseInt1x2 = (radix: number) => number;
+    interface LodashPartial {
+        <T1, R>(func: lodash.Function1<T1, R>): LodashPartial1x1<T1, R>;
+        <T1>(func: lodash.__, arg1: [T1]): LodashPartial1x2<T1>;
+        <T1, R>(func: lodash.Function1<T1, R>, arg1: [T1]): lodash.Function0<R>;
+        <T1, T2, R>(func: lodash.Function2<T1, T2, R>): LodashPartial2x1<T1, T2, R>;
+        <T1, T2, R>(func: lodash.Function2<T1, T2, R>, arg1: [T1]): lodash.Function1<    T2, R>;
+        <T2>(func: lodash.__, plc1: [lodash.__, T2]): LodashPartial3x2<T2>;
+        <T1, T2, R>(func: lodash.Function2<T1, T2, R>, plc1: [lodash.__, T2]): lodash.Function1<T1,     R>;
+        <T1, T2>(func: lodash.__, arg1: [T1, T2]): LodashPartial4x2<T1, T2>;
+        <T1, T2, R>(func: lodash.Function2<T1, T2, R>, arg1: [T1, T2]): lodash.Function0<        R>;
+        <T1, T2, T3, R>(func: lodash.Function3<T1, T2, T3, R>): LodashPartial5x1<T1, T2, T3, R>;
+        <T1, T2, T3, R>(func: lodash.Function3<T1, T2, T3, R>, arg1: [T1]): lodash.Function2<    T2, T3, R>;
+        <T1, T2, T3, R>(func: lodash.Function3<T1, T2, T3, R>, plc1: [lodash.__, T2]): lodash.Function2<T1,     T3, R>;
+        <T1, T2, T3, R>(func: lodash.Function3<T1, T2, T3, R>, arg1: [T1, T2]): lodash.Function1<        T3, R>;
+        <T3>(func: lodash.__, plc1: [lodash.__, lodash.__, T3]): LodashPartial8x2<T3>;
+        <T1, T2, T3, R>(func: lodash.Function3<T1, T2, T3, R>, plc1: [lodash.__, lodash.__, T3]): lodash.Function2<T1, T2,     R>;
+        <T1, T3>(func: lodash.__, arg1: [T1, lodash.__, T3]): LodashPartial9x2<T1, T3>;
+        <T1, T2, T3, R>(func: lodash.Function3<T1, T2, T3, R>, arg1: [T1, lodash.__, T3]): lodash.Function1<    T2,     R>;
+        <T2, T3>(func: lodash.__, plc1: [lodash.__, T2, T3]): LodashPartial10x2<T2, T3>;
+        <T1, T2, T3, R>(func: lodash.Function3<T1, T2, T3, R>, plc1: [lodash.__, T2, T3]): lodash.Function1<T1,         R>;
+        <T1, T2, T3>(func: lodash.__, arg1: [T1, T2, T3]): LodashPartial11x2<T1, T2, T3>;
+        <T1, T2, T3, R>(func: lodash.Function3<T1, T2, T3, R>, arg1: [T1, T2, T3]): lodash.Function0<            R>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>): LodashPartial12x1<T1, T2, T3, T4, R>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg1: [T1]): lodash.Function3<    T2, T3, T4, R>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, plc1: [lodash.__, T2]): lodash.Function3<T1,     T3, T4, R>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg1: [T1, T2]): lodash.Function2<        T3, T4, R>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, plc1: [lodash.__, lodash.__, T3]): lodash.Function3<T1, T2,     T4, R>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg1: [T1, lodash.__, T3]): lodash.Function2<    T2,     T4, R>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, plc1: [lodash.__, T2, T3]): lodash.Function2<T1,         T4, R>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg1: [T1, T2, T3]): lodash.Function1<            T4, R>;
+        <T4>(func: lodash.__, plc1: [lodash.__, lodash.__, lodash.__, T4]): LodashPartial19x2<T4>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, plc1: [lodash.__, lodash.__, lodash.__, T4]): lodash.Function3<T1, T2, T3,     R>;
+        <T1, T4>(func: lodash.__, arg1: [T1, lodash.__, lodash.__, T4]): LodashPartial20x2<T1, T4>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg1: [T1, lodash.__, lodash.__, T4]): lodash.Function2<    T2, T3,     R>;
+        <T2, T4>(func: lodash.__, plc1: [lodash.__, T2, lodash.__, T4]): LodashPartial21x2<T2, T4>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, plc1: [lodash.__, T2, lodash.__, T4]): lodash.Function2<T1,     T3,     R>;
+        <T1, T2, T4>(func: lodash.__, arg1: [T1, T2, lodash.__, T4]): LodashPartial22x2<T1, T2, T4>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg1: [T1, T2, lodash.__, T4]): lodash.Function1<        T3,     R>;
+        <T3, T4>(func: lodash.__, plc1: [lodash.__, lodash.__, T3, T4]): LodashPartial23x2<T3, T4>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, plc1: [lodash.__, lodash.__, T3, T4]): lodash.Function2<T1, T2,         R>;
+        <T1, T3, T4>(func: lodash.__, arg1: [T1, lodash.__, T3, T4]): LodashPartial24x2<T1, T3, T4>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg1: [T1, lodash.__, T3, T4]): lodash.Function1<    T2,         R>;
+        <T2, T3, T4>(func: lodash.__, plc1: [lodash.__, T2, T3, T4]): LodashPartial25x2<T2, T3, T4>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, plc1: [lodash.__, T2, T3, T4]): lodash.Function1<T1,             R>;
+        <T1, T2, T3, T4>(func: lodash.__, arg1: [T1, T2, T3, T4]): LodashPartial26x2<T1, T2, T3, T4>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg1: [T1, T2, T3, T4]): lodash.Function0<                R>;
+        (func: (...args: any[]) => any): LodashPartial27x1;
+        (func: lodash.__, args: ReadonlyArray<any>): LodashPartial27x2;
+        (func: (...args: any[]) => any, args: ReadonlyArray<any>): (...args: any[]) => any;
+        placeholder: lodash.__;
+    }
+    type LodashPartial1x1<T1, R> = (arg1: [T1]) => lodash.Function0<R>;
+    interface LodashPartial1x2<T1> {
+        <R>(func: lodash.Function1<T1, R>): lodash.Function0<R>;
+        <T2, R>(func: lodash.Function2<T1, T2, R>): lodash.Function1<    T2, R>;
+        <T2, T3, R>(func: lodash.Function3<T1, T2, T3, R>): lodash.Function2<    T2, T3, R>;
+        <T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>): lodash.Function3<    T2, T3, T4, R>;
+    }
+    interface LodashPartial2x1<T1, T2, R> {
+        (arg1: [T1]): lodash.Function1<    T2, R>;
+        (plc1: [lodash.__, T2]): lodash.Function1<T1,     R>;
+        (arg1: [T1, T2]): lodash.Function0<        R>;
+    }
+    interface LodashPartial3x2<T2> {
+        <T1, R>(func: lodash.Function2<T1, T2, R>): lodash.Function1<T1,     R>;
+        <T1, T3, R>(func: lodash.Function3<T1, T2, T3, R>): lodash.Function2<T1,     T3, R>;
+        <T1, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>): lodash.Function3<T1,     T3, T4, R>;
+    }
+    interface LodashPartial4x2<T1, T2> {
+        <R>(func: lodash.Function2<T1, T2, R>): lodash.Function0<        R>;
+        <T3, R>(func: lodash.Function3<T1, T2, T3, R>): lodash.Function1<        T3, R>;
+        <T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>): lodash.Function2<        T3, T4, R>;
+    }
+    interface LodashPartial5x1<T1, T2, T3, R> {
+        (arg1: [T1]): lodash.Function2<    T2, T3, R>;
+        (plc1: [lodash.__, T2]): lodash.Function2<T1,     T3, R>;
+        (arg1: [T1, T2]): lodash.Function1<        T3, R>;
+        (plc1: [lodash.__, lodash.__, T3]): lodash.Function2<T1, T2,     R>;
+        (arg1: [T1, lodash.__, T3]): lodash.Function1<    T2,     R>;
+        (plc1: [lodash.__, T2, T3]): lodash.Function1<T1,         R>;
+        (arg1: [T1, T2, T3]): lodash.Function0<            R>;
+    }
+    interface LodashPartial8x2<T3> {
+        <T1, T2, R>(func: lodash.Function3<T1, T2, T3, R>): lodash.Function2<T1, T2,     R>;
+        <T1, T2, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>): lodash.Function3<T1, T2,     T4, R>;
+    }
+    interface LodashPartial9x2<T1, T3> {
+        <T2, R>(func: lodash.Function3<T1, T2, T3, R>): lodash.Function1<    T2,     R>;
+        <T2, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>): lodash.Function2<    T2,     T4, R>;
+    }
+    interface LodashPartial10x2<T2, T3> {
+        <T1, R>(func: lodash.Function3<T1, T2, T3, R>): lodash.Function1<T1,         R>;
+        <T1, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>): lodash.Function2<T1,         T4, R>;
+    }
+    interface LodashPartial11x2<T1, T2, T3> {
+        <R>(func: lodash.Function3<T1, T2, T3, R>): lodash.Function0<            R>;
+        <T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>): lodash.Function1<            T4, R>;
+    }
+    interface LodashPartial12x1<T1, T2, T3, T4, R> {
+        (arg1: [T1]): lodash.Function3<    T2, T3, T4, R>;
+        (plc1: [lodash.__, T2]): lodash.Function3<T1,     T3, T4, R>;
+        (arg1: [T1, T2]): lodash.Function2<        T3, T4, R>;
+        (plc1: [lodash.__, lodash.__, T3]): lodash.Function3<T1, T2,     T4, R>;
+        (arg1: [T1, lodash.__, T3]): lodash.Function2<    T2,     T4, R>;
+        (plc1: [lodash.__, T2, T3]): lodash.Function2<T1,         T4, R>;
+        (arg1: [T1, T2, T3]): lodash.Function1<            T4, R>;
+        (plc1: [lodash.__, lodash.__, lodash.__, T4]): lodash.Function3<T1, T2, T3,     R>;
+        (arg1: [T1, lodash.__, lodash.__, T4]): lodash.Function2<    T2, T3,     R>;
+        (plc1: [lodash.__, T2, lodash.__, T4]): lodash.Function2<T1,     T3,     R>;
+        (arg1: [T1, T2, lodash.__, T4]): lodash.Function1<        T3,     R>;
+        (plc1: [lodash.__, lodash.__, T3, T4]): lodash.Function2<T1, T2,         R>;
+        (arg1: [T1, lodash.__, T3, T4]): lodash.Function1<    T2,         R>;
+        (plc1: [lodash.__, T2, T3, T4]): lodash.Function1<T1,             R>;
+        (arg1: [T1, T2, T3, T4]): lodash.Function0<                R>;
+    }
+    type LodashPartial19x2<T4> = <T1, T2, T3, R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function3<T1, T2, T3,     R>;
+    type LodashPartial20x2<T1, T4> = <T2, T3, R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function2<    T2, T3,     R>;
+    type LodashPartial21x2<T2, T4> = <T1, T3, R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function2<T1,     T3,     R>;
+    type LodashPartial22x2<T1, T2, T4> = <T3, R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function1<        T3,     R>;
+    type LodashPartial23x2<T3, T4> = <T1, T2, R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function2<T1, T2,         R>;
+    type LodashPartial24x2<T1, T3, T4> = <T2, R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function1<    T2,         R>;
+    type LodashPartial25x2<T2, T3, T4> = <T1, R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function1<T1,             R>;
+    type LodashPartial26x2<T1, T2, T3, T4> = <R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function0<                R>;
+    type LodashPartial27x1 = (args: ReadonlyArray<any>) => (...args: any[]) => any;
+    type LodashPartial27x2 = (func: (...args: any[]) => any) => (...args: any[]) => any;
+    interface LodashPartialRight {
+        <T1, R>(func: lodash.Function1<T1, R>): LodashPartialRight1x1<T1, R>;
+        <T1>(func: lodash.__, arg1: [T1]): LodashPartialRight1x2<T1>;
+        <T1, R>(func: lodash.Function1<T1, R>, arg1: [T1]): lodash.Function0<R>;
+        <T1, T2, R>(func: lodash.Function2<T1, T2, R>): LodashPartialRight2x1<T1, T2, R>;
+        <T1>(func: lodash.__, arg1: [T1, lodash.__]): LodashPartialRight2x2<T1>;
+        <T1, T2, R>(func: lodash.Function2<T1, T2, R>, arg1: [T1, lodash.__]): lodash.Function1<    T2, R>;
+        <T2>(func: lodash.__, arg2: [T2]): LodashPartialRight3x2<T2>;
+        <T1, T2, R>(func: lodash.Function2<T1, T2, R>, arg2: [T2]): lodash.Function1<T1,     R>;
+        <T1, T2>(func: lodash.__, arg1: [T1, T2]): LodashPartialRight4x2<T1, T2>;
+        <T1, T2, R>(func: lodash.Function2<T1, T2, R>, arg1: [T1, T2]): lodash.Function0<        R>;
+        <T1, T2, T3, R>(func: lodash.Function3<T1, T2, T3, R>): LodashPartialRight5x1<T1, T2, T3, R>;
+        <T1>(func: lodash.__, arg1: [T1, lodash.__, lodash.__]): LodashPartialRight5x2<T1>;
+        <T1, T2, T3, R>(func: lodash.Function3<T1, T2, T3, R>, arg1: [T1, lodash.__, lodash.__]): lodash.Function2<    T2, T3, R>;
+        <T2>(func: lodash.__, arg2: [T2, lodash.__]): LodashPartialRight6x2<T2>;
+        <T1, T2, T3, R>(func: lodash.Function3<T1, T2, T3, R>, arg2: [T2, lodash.__]): lodash.Function2<T1,     T3, R>;
+        <T1, T2>(func: lodash.__, arg1: [T1, T2, lodash.__]): LodashPartialRight7x2<T1, T2>;
+        <T1, T2, T3, R>(func: lodash.Function3<T1, T2, T3, R>, arg1: [T1, T2, lodash.__]): lodash.Function1<        T3, R>;
+        <T3>(func: lodash.__, arg3: [T3]): LodashPartialRight8x2<T3>;
+        <T1, T2, T3, R>(func: lodash.Function3<T1, T2, T3, R>, arg3: [T3]): lodash.Function2<T1, T2,     R>;
+        <T1, T3>(func: lodash.__, arg1: [T1, lodash.__, T3]): LodashPartialRight9x2<T1, T3>;
+        <T1, T2, T3, R>(func: lodash.Function3<T1, T2, T3, R>, arg1: [T1, lodash.__, T3]): lodash.Function1<    T2,     R>;
+        <T2, T3>(func: lodash.__, arg2: [T2, T3]): LodashPartialRight10x2<T2, T3>;
+        <T1, T2, T3, R>(func: lodash.Function3<T1, T2, T3, R>, arg2: [T2, T3]): lodash.Function1<T1,         R>;
+        <T1, T2, T3>(func: lodash.__, arg1: [T1, T2, T3]): LodashPartialRight11x2<T1, T2, T3>;
+        <T1, T2, T3, R>(func: lodash.Function3<T1, T2, T3, R>, arg1: [T1, T2, T3]): lodash.Function0<            R>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>): LodashPartialRight12x1<T1, T2, T3, T4, R>;
+        <T1>(func: lodash.__, arg1: [T1, lodash.__, lodash.__, lodash.__]): LodashPartialRight12x2<T1>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg1: [T1, lodash.__, lodash.__, lodash.__]): lodash.Function3<    T2, T3, T4, R>;
+        <T2>(func: lodash.__, arg2: [T2, lodash.__, lodash.__]): LodashPartialRight13x2<T2>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg2: [T2, lodash.__, lodash.__]): lodash.Function3<T1,     T3, T4, R>;
+        <T1, T2>(func: lodash.__, arg1: [T1, T2, lodash.__, lodash.__]): LodashPartialRight14x2<T1, T2>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg1: [T1, T2, lodash.__, lodash.__]): lodash.Function2<        T3, T4, R>;
+        <T3>(func: lodash.__, arg3: [T3, lodash.__]): LodashPartialRight15x2<T3>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg3: [T3, lodash.__]): lodash.Function3<T1, T2,     T4, R>;
+        <T1, T3>(func: lodash.__, arg1: [T1, lodash.__, T3, lodash.__]): LodashPartialRight16x2<T1, T3>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg1: [T1, lodash.__, T3, lodash.__]): lodash.Function2<    T2,     T4, R>;
+        <T2, T3>(func: lodash.__, arg2: [T2, T3, lodash.__]): LodashPartialRight17x2<T2, T3>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg2: [T2, T3, lodash.__]): lodash.Function2<T1,         T4, R>;
+        <T1, T2, T3>(func: lodash.__, arg1: [T1, T2, T3, lodash.__]): LodashPartialRight18x2<T1, T2, T3>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg1: [T1, T2, T3, lodash.__]): lodash.Function1<            T4, R>;
+        <T4>(func: lodash.__, arg4: [T4]): LodashPartialRight19x2<T4>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg4: [T4]): lodash.Function3<T1, T2, T3,     R>;
+        <T1, T4>(func: lodash.__, arg1: [T1, lodash.__, lodash.__, T4]): LodashPartialRight20x2<T1, T4>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg1: [T1, lodash.__, lodash.__, T4]): lodash.Function2<    T2, T3,     R>;
+        <T2, T4>(func: lodash.__, arg2: [T2, lodash.__, T4]): LodashPartialRight21x2<T2, T4>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg2: [T2, lodash.__, T4]): lodash.Function2<T1,     T3,     R>;
+        <T1, T2, T4>(func: lodash.__, arg1: [T1, T2, lodash.__, T4]): LodashPartialRight22x2<T1, T2, T4>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg1: [T1, T2, lodash.__, T4]): lodash.Function1<        T3,     R>;
+        <T3, T4>(func: lodash.__, arg3: [T3, T4]): LodashPartialRight23x2<T3, T4>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg3: [T3, T4]): lodash.Function2<T1, T2,         R>;
+        <T1, T3, T4>(func: lodash.__, arg1: [T1, lodash.__, T3, T4]): LodashPartialRight24x2<T1, T3, T4>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg1: [T1, lodash.__, T3, T4]): lodash.Function1<    T2,         R>;
+        <T2, T3, T4>(func: lodash.__, arg2: [T2, T3, T4]): LodashPartialRight25x2<T2, T3, T4>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg2: [T2, T3, T4]): lodash.Function1<T1,             R>;
+        <T1, T2, T3, T4>(func: lodash.__, arg1: [T1, T2, T3, T4]): LodashPartialRight26x2<T1, T2, T3, T4>;
+        <T1, T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>, arg1: [T1, T2, T3, T4]): lodash.Function0<                R>;
+        (func: (...args: any[]) => any): LodashPartialRight27x1;
+        (func: lodash.__, args: ReadonlyArray<any>): LodashPartialRight27x2;
+        (func: (...args: any[]) => any, args: ReadonlyArray<any>): (...args: any[]) => any;
+        placeholder: lodash.__;
+    }
+    type LodashPartialRight1x1<T1, R> = (arg1: [T1]) => lodash.Function0<R>;
+    type LodashPartialRight1x2<T1> = <R>(func: lodash.Function1<T1, R>) => lodash.Function0<R>;
+    interface LodashPartialRight2x1<T1, T2, R> {
+        (arg1: [T1, lodash.__]): lodash.Function1<    T2, R>;
+        (arg2: [T2]): lodash.Function1<T1,     R>;
+        (arg1: [T1, T2]): lodash.Function0<        R>;
+    }
+    type LodashPartialRight2x2<T1> = <T2, R>(func: lodash.Function2<T1, T2, R>) => lodash.Function1<    T2, R>;
+    type LodashPartialRight3x2<T2> = <T1, R>(func: lodash.Function2<T1, T2, R>) => lodash.Function1<T1,     R>;
+    type LodashPartialRight4x2<T1, T2> = <R>(func: lodash.Function2<T1, T2, R>) => lodash.Function0<        R>;
+    interface LodashPartialRight5x1<T1, T2, T3, R> {
+        (arg1: [T1, lodash.__, lodash.__]): lodash.Function2<    T2, T3, R>;
+        (arg2: [T2, lodash.__]): lodash.Function2<T1,     T3, R>;
+        (arg1: [T1, T2, lodash.__]): lodash.Function1<        T3, R>;
+        (arg3: [T3]): lodash.Function2<T1, T2,     R>;
+        (arg1: [T1, lodash.__, T3]): lodash.Function1<    T2,     R>;
+        (arg2: [T2, T3]): lodash.Function1<T1,         R>;
+        (arg1: [T1, T2, T3]): lodash.Function0<            R>;
+    }
+    type LodashPartialRight5x2<T1> = <T2, T3, R>(func: lodash.Function3<T1, T2, T3, R>) => lodash.Function2<    T2, T3, R>;
+    type LodashPartialRight6x2<T2> = <T1, T3, R>(func: lodash.Function3<T1, T2, T3, R>) => lodash.Function2<T1,     T3, R>;
+    type LodashPartialRight7x2<T1, T2> = <T3, R>(func: lodash.Function3<T1, T2, T3, R>) => lodash.Function1<        T3, R>;
+    type LodashPartialRight8x2<T3> = <T1, T2, R>(func: lodash.Function3<T1, T2, T3, R>) => lodash.Function2<T1, T2,     R>;
+    type LodashPartialRight9x2<T1, T3> = <T2, R>(func: lodash.Function3<T1, T2, T3, R>) => lodash.Function1<    T2,     R>;
+    type LodashPartialRight10x2<T2, T3> = <T1, R>(func: lodash.Function3<T1, T2, T3, R>) => lodash.Function1<T1,         R>;
+    type LodashPartialRight11x2<T1, T2, T3> = <R>(func: lodash.Function3<T1, T2, T3, R>) => lodash.Function0<            R>;
+    interface LodashPartialRight12x1<T1, T2, T3, T4, R> {
+        (arg1: [T1, lodash.__, lodash.__, lodash.__]): lodash.Function3<    T2, T3, T4, R>;
+        (arg2: [T2, lodash.__, lodash.__]): lodash.Function3<T1,     T3, T4, R>;
+        (arg1: [T1, T2, lodash.__, lodash.__]): lodash.Function2<        T3, T4, R>;
+        (arg3: [T3, lodash.__]): lodash.Function3<T1, T2,     T4, R>;
+        (arg1: [T1, lodash.__, T3, lodash.__]): lodash.Function2<    T2,     T4, R>;
+        (arg2: [T2, T3, lodash.__]): lodash.Function2<T1,         T4, R>;
+        (arg1: [T1, T2, T3, lodash.__]): lodash.Function1<            T4, R>;
+        (arg4: [T4]): lodash.Function3<T1, T2, T3,     R>;
+        (arg1: [T1, lodash.__, lodash.__, T4]): lodash.Function2<    T2, T3,     R>;
+        (arg2: [T2, lodash.__, T4]): lodash.Function2<T1,     T3,     R>;
+        (arg1: [T1, T2, lodash.__, T4]): lodash.Function1<        T3,     R>;
+        (arg3: [T3, T4]): lodash.Function2<T1, T2,         R>;
+        (arg1: [T1, lodash.__, T3, T4]): lodash.Function1<    T2,         R>;
+        (arg2: [T2, T3, T4]): lodash.Function1<T1,             R>;
+        (arg1: [T1, T2, T3, T4]): lodash.Function0<                R>;
+    }
+    type LodashPartialRight12x2<T1> = <T2, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function3<    T2, T3, T4, R>;
+    type LodashPartialRight13x2<T2> = <T1, T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function3<T1,     T3, T4, R>;
+    type LodashPartialRight14x2<T1, T2> = <T3, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function2<        T3, T4, R>;
+    type LodashPartialRight15x2<T3> = <T1, T2, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function3<T1, T2,     T4, R>;
+    type LodashPartialRight16x2<T1, T3> = <T2, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function2<    T2,     T4, R>;
+    type LodashPartialRight17x2<T2, T3> = <T1, T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function2<T1,         T4, R>;
+    type LodashPartialRight18x2<T1, T2, T3> = <T4, R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function1<            T4, R>;
+    type LodashPartialRight19x2<T4> = <T1, T2, T3, R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function3<T1, T2, T3,     R>;
+    type LodashPartialRight20x2<T1, T4> = <T2, T3, R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function2<    T2, T3,     R>;
+    type LodashPartialRight21x2<T2, T4> = <T1, T3, R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function2<T1,     T3,     R>;
+    type LodashPartialRight22x2<T1, T2, T4> = <T3, R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function1<        T3,     R>;
+    type LodashPartialRight23x2<T3, T4> = <T1, T2, R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function2<T1, T2,         R>;
+    type LodashPartialRight24x2<T1, T3, T4> = <T2, R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function1<    T2,         R>;
+    type LodashPartialRight25x2<T2, T3, T4> = <T1, R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function1<T1,             R>;
+    type LodashPartialRight26x2<T1, T2, T3, T4> = <R>(func: lodash.Function4<T1, T2, T3, T4, R>) => lodash.Function0<                R>;
+    type LodashPartialRight27x1 = (args: ReadonlyArray<any>) => (...args: any[]) => any;
+    type LodashPartialRight27x2 = (func: (...args: any[]) => any) => (...args: any[]) => any;
+    interface LodashPartition {
+        <T>(callback: lodash.ValueIteratee<T>): LodashPartition1x1<T>;
+        <T>(callback: lodash.__, collection: lodash.List<T> | null | undefined): LodashPartition1x2<T>;
+        <T>(callback: lodash.ValueIteratee<T>, collection: lodash.List<T> | null | undefined): [T[], T[]];
+        <T extends object>(callback: lodash.__, collection: T | null | undefined): LodashPartition2x2<T>;
+        <T extends object>(callback: lodash.ValueIteratee<T[keyof T]>, collection: T | null | undefined): [Array<T[keyof T]>, Array<T[keyof T]>];
+    }
+    type LodashPartition1x1<T> = (collection: lodash.List<T> | object | null | undefined) => [T[], T[]];
+    type LodashPartition1x2<T> = (callback: lodash.ValueIteratee<T>) => [T[], T[]];
+    type LodashPartition2x2<T> = (callback: lodash.ValueIteratee<T[keyof T]>) => [Array<T[keyof T]>, Array<T[keyof T]>];
+    interface LodashPath {
+        <TObject extends object, TKey extends keyof TObject>(path: TKey | [TKey]): LodashPath1x1<TObject, TKey>;
+        <TObject extends object>(path: lodash.__, object: TObject): LodashPath1x2<TObject>;
+        <TObject extends object, TKey extends keyof TObject>(path: TKey | [TKey], object: TObject): TObject[TKey];
+        <TObject extends object>(path: lodash.__, object: TObject | null | undefined): LodashPath2x2<TObject>;
+        <TObject extends object, TKey extends keyof TObject>(path: TKey | [TKey], object: TObject | null | undefined): TObject[TKey] | undefined;
+        (path: number): LodashPath3x1;
+        <T>(path: lodash.__, object: lodash.NumericDictionary<T>): LodashPath3x2<T>;
+        <T>(path: number, object: lodash.NumericDictionary<T>): T;
+        <T>(path: lodash.__, object: lodash.NumericDictionary<T> | null | undefined): LodashPath4x2<T>;
+        <T>(path: number, object: lodash.NumericDictionary<T> | null | undefined): T | undefined;
+        (path: lodash.PropertyPath): LodashPath5x1;
+        (path: lodash.__, object: null | undefined): LodashPath5x2;
+        (path: lodash.PropertyPath, object: null | undefined): undefined;
+        (path: lodash.__, object: any): LodashPath6x2;
+        (path: lodash.PropertyPath, object: any): any;
+    }
+    interface LodashPath1x1<TObject, TKey extends keyof TObject> {
+        (object: TObject): TObject[TKey];
+        (object: TObject | null | undefined): TObject[TKey] | undefined;
+    }
+    type LodashPath1x2<TObject> = <TKey extends keyof TObject>(path: TKey | [TKey]) => TObject[TKey];
+    type LodashPath2x2<TObject> = <TKey extends keyof TObject>(path: TKey | [TKey]) => TObject[TKey] | undefined;
+    interface LodashPath3x1 {
+        <T>(object: lodash.NumericDictionary<T>): T;
+        <T>(object: lodash.NumericDictionary<T> | null | undefined): T | undefined;
+    }
+    type LodashPath3x2<T> = (path: number) => T;
+    type LodashPath4x2<T> = (path: number) => T | undefined;
+    interface LodashPath5x1 {
+        (object: null | undefined): undefined;
+        (object: any): any;
+    }
+    type LodashPath5x2 = (path: lodash.PropertyPath) => undefined;
+    type LodashPath6x2 = (path: lodash.PropertyPath) => any;
+    interface LodashPathOr {
+        <TDefault>(defaultValue: TDefault): LodashPathOr1x1<TDefault>;
+        <TObject extends object, TKey extends keyof TObject>(defaultValue: lodash.__, path: TKey | [TKey]): LodashPathOr1x2<TObject, TKey>;
+        <TObject extends object, TKey extends keyof TObject, TDefault>(defaultValue: TDefault, path: TKey | [TKey]): LodashPathOr1x3<TObject, TKey, TDefault>;
+        <TObject extends object>(defaultValue: lodash.__, path: lodash.__, object: TObject | null | undefined): LodashPathOr1x4<TObject>;
+        <TObject extends object, TDefault>(defaultValue: TDefault, path: lodash.__, object: TObject | null | undefined): LodashPathOr1x5<TObject, TDefault>;
+        <TObject extends object, TKey extends keyof TObject>(defaultValue: lodash.__, path: TKey | [TKey], object: TObject | null | undefined): LodashPathOr1x6<TObject, TKey>;
+        <TObject extends object, TKey extends keyof TObject, TDefault>(defaultValue: TDefault, path: TKey | [TKey], object: TObject | null | undefined): TObject[TKey] | TDefault;
+        (defaultValue: lodash.__, path: number): LodashPathOr2x2;
+        <TDefault>(defaultValue: TDefault, path: number): LodashPathOr2x3<TDefault>;
+        <T>(defaultValue: lodash.__, path: lodash.__, object: lodash.NumericDictionary<T> | null | undefined): LodashPathOr2x4<T>;
+        <T, TDefault>(defaultValue: TDefault, path: lodash.__, object: lodash.NumericDictionary<T> | null | undefined): LodashPathOr2x5<T, TDefault>;
+        <T>(defaultValue: lodash.__, path: number, object: lodash.NumericDictionary<T> | null | undefined): LodashPathOr2x6<T>;
+        <T, TDefault>(defaultValue: TDefault, path: number, object: lodash.NumericDictionary<T> | null | undefined): T | TDefault;
+        (defaultValue: lodash.__, path: lodash.PropertyPath): LodashPathOr3x2;
+        <TDefault>(defaultValue: TDefault, path: lodash.PropertyPath): LodashPathOr3x3<TDefault>;
+        (defaultValue: lodash.__, path: lodash.__, object: null | undefined): LodashPathOr3x4;
+        <TDefault>(defaultValue: TDefault, path: lodash.__, object: null | undefined): LodashPathOr3x5<TDefault>;
+        (defaultValue: lodash.__, path: lodash.PropertyPath, object: null | undefined): LodashPathOr3x6;
+        <TDefault>(defaultValue: TDefault, path: lodash.PropertyPath, object: null | undefined): TDefault;
+        (defaultValue: any): LodashPathOr4x1;
+        (defaultValue: any, path: lodash.PropertyPath): LodashPathOr4x3;
+        (defaultValue: lodash.__, path: lodash.__, object: any): LodashPathOr4x4;
+        (defaultValue: any, path: lodash.__, object: any): LodashPathOr4x5;
+        (defaultValue: lodash.__, path: lodash.PropertyPath, object: any): LodashPathOr4x6;
+        (defaultValue: any, path: lodash.PropertyPath, object: any): any;
+    }
+    interface LodashPathOr1x1<TDefault> {
+        <TObject extends object, TKey extends keyof TObject>(path: TKey | [TKey]): LodashPathOr1x3<TObject, TKey, TDefault>;
+        <TObject extends object>(path: lodash.__, object: TObject | null | undefined): LodashPathOr1x5<TObject, TDefault>;
+        <TObject extends object, TKey extends keyof TObject>(path: TKey | [TKey], object: TObject | null | undefined): TObject[TKey] | TDefault;
+        (path: number): LodashPathOr2x3<TDefault>;
+        <T>(path: lodash.__, object: lodash.NumericDictionary<T> | null | undefined): LodashPathOr2x5<T, TDefault>;
+        <T>(path: number, object: lodash.NumericDictionary<T> | null | undefined): T | TDefault;
+        (path: lodash.PropertyPath): LodashPathOr3x3<TDefault>;
+        (path: lodash.__, object: null | undefined): LodashPathOr3x5<TDefault>;
+        (path: lodash.PropertyPath, object: null | undefined): TDefault;
+    }
+    interface LodashPathOr1x2<TObject, TKey extends keyof TObject> {
+        <TDefault>(defaultValue: TDefault): LodashPathOr1x3<TObject, TKey, TDefault>;
+        (defaultValue: lodash.__, object: TObject | null | undefined): LodashPathOr1x6<TObject, TKey>;
+        <TDefault>(defaultValue: TDefault, object: TObject | null | undefined): TObject[TKey] | TDefault;
+    }
+    type LodashPathOr1x3<TObject, TKey extends keyof TObject, TDefault> = (object: TObject | null | undefined) => TObject[TKey] | TDefault;
+    interface LodashPathOr1x4<TObject> {
+        <TDefault>(defaultValue: TDefault): LodashPathOr1x5<TObject, TDefault>;
+        <TKey extends keyof TObject>(defaultValue: lodash.__, path: TKey | [TKey]): LodashPathOr1x6<TObject, TKey>;
+        <TKey extends keyof TObject, TDefault>(defaultValue: TDefault, path: TKey | [TKey]): TObject[TKey] | TDefault;
+    }
+    type LodashPathOr1x5<TObject, TDefault> = <TKey extends keyof TObject>(path: TKey | [TKey]) => TObject[TKey] | TDefault;
+    type LodashPathOr1x6<TObject, TKey extends keyof TObject> = <TDefault>(defaultValue: TDefault) => TObject[TKey] | TDefault;
+    interface LodashPathOr2x2 {
+        <TDefault>(defaultValue: TDefault): LodashPathOr2x3<TDefault>;
+        <T>(defaultValue: lodash.__, object: lodash.NumericDictionary<T> | null | undefined): LodashPathOr2x6<T>;
+        <T, TDefault>(defaultValue: TDefault, object: lodash.NumericDictionary<T> | null | undefined): T | TDefault;
+    }
+    type LodashPathOr2x3<TDefault> = <T>(object: lodash.NumericDictionary<T> | null | undefined) => T | TDefault;
+    interface LodashPathOr2x4<T> {
+        <TDefault>(defaultValue: TDefault): LodashPathOr2x5<T, TDefault>;
+        (defaultValue: lodash.__, path: number): LodashPathOr2x6<T>;
+        <TDefault>(defaultValue: TDefault, path: number): T | TDefault;
+    }
+    type LodashPathOr2x5<T, TDefault> = (path: number) => T | TDefault;
+    type LodashPathOr2x6<T> = <TDefault>(defaultValue: TDefault) => T | TDefault;
+    interface LodashPathOr3x2 {
+        <TDefault>(defaultValue: TDefault): LodashPathOr3x3<TDefault>;
+        (defaultValue: lodash.__, object: null | undefined): LodashPathOr3x6;
+        <TDefault>(defaultValue: TDefault, object: null | undefined): TDefault;
+        (defaultValue: any): LodashPathOr4x3;
+        (defaultValue: lodash.__, object: any): LodashPathOr4x6;
+        (defaultValue: any, object: any): any;
+    }
+    type LodashPathOr3x3<TDefault> = (object: null | undefined) => TDefault;
+    interface LodashPathOr3x4 {
+        <TDefault>(defaultValue: TDefault): LodashPathOr3x5<TDefault>;
+        (defaultValue: lodash.__, path: lodash.PropertyPath): LodashPathOr3x6;
+        <TDefault>(defaultValue: TDefault, path: lodash.PropertyPath): TDefault;
+    }
+    type LodashPathOr3x5<TDefault> = (path: lodash.PropertyPath) => TDefault;
+    type LodashPathOr3x6 = <TDefault>(defaultValue: TDefault) => TDefault;
+    interface LodashPathOr4x1 {
+        (path: lodash.PropertyPath): LodashPathOr4x3;
+        (path: lodash.__, object: any): LodashPathOr4x5;
+        (path: lodash.PropertyPath, object: any): any;
+    }
+    type LodashPathOr4x3 = (object: any) => any;
+    interface LodashPathOr4x4 {
+        (defaultValue: any): LodashPathOr4x5;
+        (defaultValue: lodash.__, path: lodash.PropertyPath): LodashPathOr4x6;
+        (defaultValue: any, path: lodash.PropertyPath): any;
+    }
+    type LodashPathOr4x5 = (path: lodash.PropertyPath) => any;
+    type LodashPathOr4x6 = (defaultValue: any) => any;
+    interface LodashPick {
+        <T extends object, U extends keyof T>(props: lodash.Many<U>): LodashPick1x1<T, U>;
+        <T extends object>(props: lodash.__, object: T): LodashPick1x2<T>;
+        <T extends object, U extends keyof T>(props: lodash.Many<U>, object: T): Pick<T, U>;
+        (props: lodash.PropertyPath): LodashPick2x1;
+        <T>(props: lodash.__, object: T | null | undefined): LodashPick2x2<T>;
+        <T>(props: lodash.PropertyPath, object: T | null | undefined): lodash.PartialDeep<T>;
+    }
+    type LodashPick1x1<T, U extends keyof T> = (object: T) => Pick<T, U>;
+    type LodashPick1x2<T> = <U extends keyof T>(props: lodash.Many<U>) => Pick<T, U>;
+    type LodashPick2x1 = <T>(object: T | null | undefined) => lodash.PartialDeep<T>;
+    type LodashPick2x2<T> = (props: lodash.PropertyPath) => lodash.PartialDeep<T>;
+    interface LodashPickBy {
+        <T>(predicate: lodash.ValueKeyIteratee<T>): LodashPickBy1x1<T>;
+        <T extends object>(predicate: lodash.__, object: T | null | undefined): LodashPickBy1x2<T>;
+        <T extends object>(predicate: lodash.ValueKeyIteratee<T[keyof T]>, object: T | null | undefined): lodash.PartialObject<T>;
+    }
+    type LodashPickBy1x1<T> = <T1 extends object>(object: T1 | null | undefined) => lodash.PartialObject<T1>;
+    type LodashPickBy1x2<T> = (predicate: lodash.ValueKeyIteratee<T[keyof T]>) => lodash.PartialObject<T>;
+    interface LodashProp {
+        <TObject extends object, TKey extends keyof TObject>(path: TKey | [TKey]): LodashProp1x1<TObject, TKey>;
+        <TObject extends object>(path: lodash.__, object: TObject): LodashProp1x2<TObject>;
+        <TObject extends object, TKey extends keyof TObject>(path: TKey | [TKey], object: TObject): TObject[TKey];
+        <TObject extends object>(path: lodash.__, object: TObject | null | undefined): LodashProp2x2<TObject>;
+        <TObject extends object, TKey extends keyof TObject>(path: TKey | [TKey], object: TObject | null | undefined): TObject[TKey] | undefined;
+        (path: number): LodashProp3x1;
+        <T>(path: lodash.__, object: lodash.NumericDictionary<T>): LodashProp3x2<T>;
+        <T>(path: number, object: lodash.NumericDictionary<T>): T;
+        <T>(path: lodash.__, object: lodash.NumericDictionary<T> | null | undefined): LodashProp4x2<T>;
+        <T>(path: number, object: lodash.NumericDictionary<T> | null | undefined): T | undefined;
+        (path: lodash.PropertyPath): LodashProp5x1;
+        (path: lodash.__, object: null | undefined): LodashProp5x2;
+        (path: lodash.PropertyPath, object: null | undefined): undefined;
+        (path: lodash.__, object: any): LodashProp6x2;
+        (path: lodash.PropertyPath, object: any): any;
+    }
+    interface LodashProp1x1<TObject, TKey extends keyof TObject> {
+        (object: TObject): TObject[TKey];
+        (object: TObject | null | undefined): TObject[TKey] | undefined;
+    }
+    type LodashProp1x2<TObject> = <TKey extends keyof TObject>(path: TKey | [TKey]) => TObject[TKey];
+    type LodashProp2x2<TObject> = <TKey extends keyof TObject>(path: TKey | [TKey]) => TObject[TKey] | undefined;
+    interface LodashProp3x1 {
+        <T>(object: lodash.NumericDictionary<T>): T;
+        <T>(object: lodash.NumericDictionary<T> | null | undefined): T | undefined;
+    }
+    type LodashProp3x2<T> = (path: number) => T;
+    type LodashProp4x2<T> = (path: number) => T | undefined;
+    interface LodashProp5x1 {
+        (object: null | undefined): undefined;
+        (object: any): any;
+    }
+    type LodashProp5x2 = (path: lodash.PropertyPath) => undefined;
+    type LodashProp6x2 = (path: lodash.PropertyPath) => any;
+    interface LodashProperty {
+        <TObject extends object, TKey extends keyof TObject>(path: TKey | [TKey]): LodashProperty1x1<TObject, TKey>;
+        <TObject extends object>(path: lodash.__, object: TObject): LodashProperty1x2<TObject>;
+        <TObject extends object, TKey extends keyof TObject>(path: TKey | [TKey], object: TObject): TObject[TKey];
+        <TObject extends object>(path: lodash.__, object: TObject | null | undefined): LodashProperty2x2<TObject>;
+        <TObject extends object, TKey extends keyof TObject>(path: TKey | [TKey], object: TObject | null | undefined): TObject[TKey] | undefined;
+        (path: number): LodashProperty3x1;
+        <T>(path: lodash.__, object: lodash.NumericDictionary<T>): LodashProperty3x2<T>;
+        <T>(path: number, object: lodash.NumericDictionary<T>): T;
+        <T>(path: lodash.__, object: lodash.NumericDictionary<T> | null | undefined): LodashProperty4x2<T>;
+        <T>(path: number, object: lodash.NumericDictionary<T> | null | undefined): T | undefined;
+        (path: lodash.PropertyPath): LodashProperty5x1;
+        (path: lodash.__, object: null | undefined): LodashProperty5x2;
+        (path: lodash.PropertyPath, object: null | undefined): undefined;
+        (path: lodash.__, object: any): LodashProperty6x2;
+        (path: lodash.PropertyPath, object: any): any;
+    }
+    interface LodashProperty1x1<TObject, TKey extends keyof TObject> {
+        (object: TObject): TObject[TKey];
+        (object: TObject | null | undefined): TObject[TKey] | undefined;
+    }
+    type LodashProperty1x2<TObject> = <TKey extends keyof TObject>(path: TKey | [TKey]) => TObject[TKey];
+    type LodashProperty2x2<TObject> = <TKey extends keyof TObject>(path: TKey | [TKey]) => TObject[TKey] | undefined;
+    interface LodashProperty3x1 {
+        <T>(object: lodash.NumericDictionary<T>): T;
+        <T>(object: lodash.NumericDictionary<T> | null | undefined): T | undefined;
+    }
+    type LodashProperty3x2<T> = (path: number) => T;
+    type LodashProperty4x2<T> = (path: number) => T | undefined;
+    interface LodashProperty5x1 {
+        (object: null | undefined): undefined;
+        (object: any): any;
+    }
+    type LodashProperty5x2 = (path: lodash.PropertyPath) => undefined;
+    type LodashProperty6x2 = (path: lodash.PropertyPath) => any;
+    interface LodashPropertyOf {
+        <TObject extends object, TKey extends keyof TObject>(path: TKey | [TKey]): LodashPropertyOf1x1<TObject, TKey>;
+        <TObject extends object>(path: lodash.__, object: TObject): LodashPropertyOf1x2<TObject>;
+        <TObject extends object, TKey extends keyof TObject>(path: TKey | [TKey], object: TObject): TObject[TKey];
+        <TObject extends object>(path: lodash.__, object: TObject | null | undefined): LodashPropertyOf2x2<TObject>;
+        <TObject extends object, TKey extends keyof TObject>(path: TKey | [TKey], object: TObject | null | undefined): TObject[TKey] | undefined;
+        (path: number): LodashPropertyOf3x1;
+        <T>(path: lodash.__, object: lodash.NumericDictionary<T>): LodashPropertyOf3x2<T>;
+        <T>(path: number, object: lodash.NumericDictionary<T>): T;
+        <T>(path: lodash.__, object: lodash.NumericDictionary<T> | null | undefined): LodashPropertyOf4x2<T>;
+        <T>(path: number, object: lodash.NumericDictionary<T> | null | undefined): T | undefined;
+        (path: lodash.PropertyPath): LodashPropertyOf5x1;
+        (path: lodash.__, object: null | undefined): LodashPropertyOf5x2;
+        (path: lodash.PropertyPath, object: null | undefined): undefined;
+        (path: lodash.__, object: any): LodashPropertyOf6x2;
+        (path: lodash.PropertyPath, object: any): any;
+    }
+    interface LodashPropertyOf1x1<TObject, TKey extends keyof TObject> {
+        (object: TObject): TObject[TKey];
+        (object: TObject | null | undefined): TObject[TKey] | undefined;
+    }
+    type LodashPropertyOf1x2<TObject> = <TKey extends keyof TObject>(path: TKey | [TKey]) => TObject[TKey];
+    type LodashPropertyOf2x2<TObject> = <TKey extends keyof TObject>(path: TKey | [TKey]) => TObject[TKey] | undefined;
+    interface LodashPropertyOf3x1 {
+        <T>(object: lodash.NumericDictionary<T>): T;
+        <T>(object: lodash.NumericDictionary<T> | null | undefined): T | undefined;
+    }
+    type LodashPropertyOf3x2<T> = (path: number) => T;
+    type LodashPropertyOf4x2<T> = (path: number) => T | undefined;
+    interface LodashPropertyOf5x1 {
+        (object: null | undefined): undefined;
+        (object: any): any;
+    }
+    type LodashPropertyOf5x2 = (path: lodash.PropertyPath) => undefined;
+    type LodashPropertyOf6x2 = (path: lodash.PropertyPath) => any;
+    interface LodashPropOr {
+        <TDefault>(defaultValue: TDefault): LodashPropOr1x1<TDefault>;
+        <TObject extends object, TKey extends keyof TObject>(defaultValue: lodash.__, path: TKey | [TKey]): LodashPropOr1x2<TObject, TKey>;
+        <TObject extends object, TKey extends keyof TObject, TDefault>(defaultValue: TDefault, path: TKey | [TKey]): LodashPropOr1x3<TObject, TKey, TDefault>;
+        <TObject extends object>(defaultValue: lodash.__, path: lodash.__, object: TObject | null | undefined): LodashPropOr1x4<TObject>;
+        <TObject extends object, TDefault>(defaultValue: TDefault, path: lodash.__, object: TObject | null | undefined): LodashPropOr1x5<TObject, TDefault>;
+        <TObject extends object, TKey extends keyof TObject>(defaultValue: lodash.__, path: TKey | [TKey], object: TObject | null | undefined): LodashPropOr1x6<TObject, TKey>;
+        <TObject extends object, TKey extends keyof TObject, TDefault>(defaultValue: TDefault, path: TKey | [TKey], object: TObject | null | undefined): TObject[TKey] | TDefault;
+        (defaultValue: lodash.__, path: number): LodashPropOr2x2;
+        <TDefault>(defaultValue: TDefault, path: number): LodashPropOr2x3<TDefault>;
+        <T>(defaultValue: lodash.__, path: lodash.__, object: lodash.NumericDictionary<T> | null | undefined): LodashPropOr2x4<T>;
+        <T, TDefault>(defaultValue: TDefault, path: lodash.__, object: lodash.NumericDictionary<T> | null | undefined): LodashPropOr2x5<T, TDefault>;
+        <T>(defaultValue: lodash.__, path: number, object: lodash.NumericDictionary<T> | null | undefined): LodashPropOr2x6<T>;
+        <T, TDefault>(defaultValue: TDefault, path: number, object: lodash.NumericDictionary<T> | null | undefined): T | TDefault;
+        (defaultValue: lodash.__, path: lodash.PropertyPath): LodashPropOr3x2;
+        <TDefault>(defaultValue: TDefault, path: lodash.PropertyPath): LodashPropOr3x3<TDefault>;
+        (defaultValue: lodash.__, path: lodash.__, object: null | undefined): LodashPropOr3x4;
+        <TDefault>(defaultValue: TDefault, path: lodash.__, object: null | undefined): LodashPropOr3x5<TDefault>;
+        (defaultValue: lodash.__, path: lodash.PropertyPath, object: null | undefined): LodashPropOr3x6;
+        <TDefault>(defaultValue: TDefault, path: lodash.PropertyPath, object: null | undefined): TDefault;
+        (defaultValue: any): LodashPropOr4x1;
+        (defaultValue: any, path: lodash.PropertyPath): LodashPropOr4x3;
+        (defaultValue: lodash.__, path: lodash.__, object: any): LodashPropOr4x4;
+        (defaultValue: any, path: lodash.__, object: any): LodashPropOr4x5;
+        (defaultValue: lodash.__, path: lodash.PropertyPath, object: any): LodashPropOr4x6;
+        (defaultValue: any, path: lodash.PropertyPath, object: any): any;
+    }
+    interface LodashPropOr1x1<TDefault> {
+        <TObject extends object, TKey extends keyof TObject>(path: TKey | [TKey]): LodashPropOr1x3<TObject, TKey, TDefault>;
+        <TObject extends object>(path: lodash.__, object: TObject | null | undefined): LodashPropOr1x5<TObject, TDefault>;
+        <TObject extends object, TKey extends keyof TObject>(path: TKey | [TKey], object: TObject | null | undefined): TObject[TKey] | TDefault;
+        (path: number): LodashPropOr2x3<TDefault>;
+        <T>(path: lodash.__, object: lodash.NumericDictionary<T> | null | undefined): LodashPropOr2x5<T, TDefault>;
+        <T>(path: number, object: lodash.NumericDictionary<T> | null | undefined): T | TDefault;
+        (path: lodash.PropertyPath): LodashPropOr3x3<TDefault>;
+        (path: lodash.__, object: null | undefined): LodashPropOr3x5<TDefault>;
+        (path: lodash.PropertyPath, object: null | undefined): TDefault;
+    }
+    interface LodashPropOr1x2<TObject, TKey extends keyof TObject> {
+        <TDefault>(defaultValue: TDefault): LodashPropOr1x3<TObject, TKey, TDefault>;
+        (defaultValue: lodash.__, object: TObject | null | undefined): LodashPropOr1x6<TObject, TKey>;
+        <TDefault>(defaultValue: TDefault, object: TObject | null | undefined): TObject[TKey] | TDefault;
+    }
+    type LodashPropOr1x3<TObject, TKey extends keyof TObject, TDefault> = (object: TObject | null | undefined) => TObject[TKey] | TDefault;
+    interface LodashPropOr1x4<TObject> {
+        <TDefault>(defaultValue: TDefault): LodashPropOr1x5<TObject, TDefault>;
+        <TKey extends keyof TObject>(defaultValue: lodash.__, path: TKey | [TKey]): LodashPropOr1x6<TObject, TKey>;
+        <TKey extends keyof TObject, TDefault>(defaultValue: TDefault, path: TKey | [TKey]): TObject[TKey] | TDefault;
+    }
+    type LodashPropOr1x5<TObject, TDefault> = <TKey extends keyof TObject>(path: TKey | [TKey]) => TObject[TKey] | TDefault;
+    type LodashPropOr1x6<TObject, TKey extends keyof TObject> = <TDefault>(defaultValue: TDefault) => TObject[TKey] | TDefault;
+    interface LodashPropOr2x2 {
+        <TDefault>(defaultValue: TDefault): LodashPropOr2x3<TDefault>;
+        <T>(defaultValue: lodash.__, object: lodash.NumericDictionary<T> | null | undefined): LodashPropOr2x6<T>;
+        <T, TDefault>(defaultValue: TDefault, object: lodash.NumericDictionary<T> | null | undefined): T | TDefault;
+    }
+    type LodashPropOr2x3<TDefault> = <T>(object: lodash.NumericDictionary<T> | null | undefined) => T | TDefault;
+    interface LodashPropOr2x4<T> {
+        <TDefault>(defaultValue: TDefault): LodashPropOr2x5<T, TDefault>;
+        (defaultValue: lodash.__, path: number): LodashPropOr2x6<T>;
+        <TDefault>(defaultValue: TDefault, path: number): T | TDefault;
+    }
+    type LodashPropOr2x5<T, TDefault> = (path: number) => T | TDefault;
+    type LodashPropOr2x6<T> = <TDefault>(defaultValue: TDefault) => T | TDefault;
+    interface LodashPropOr3x2 {
+        <TDefault>(defaultValue: TDefault): LodashPropOr3x3<TDefault>;
+        (defaultValue: lodash.__, object: null | undefined): LodashPropOr3x6;
+        <TDefault>(defaultValue: TDefault, object: null | undefined): TDefault;
+        (defaultValue: any): LodashPropOr4x3;
+        (defaultValue: lodash.__, object: any): LodashPropOr4x6;
+        (defaultValue: any, object: any): any;
+    }
+    type LodashPropOr3x3<TDefault> = (object: null | undefined) => TDefault;
+    interface LodashPropOr3x4 {
+        <TDefault>(defaultValue: TDefault): LodashPropOr3x5<TDefault>;
+        (defaultValue: lodash.__, path: lodash.PropertyPath): LodashPropOr3x6;
+        <TDefault>(defaultValue: TDefault, path: lodash.PropertyPath): TDefault;
+    }
+    type LodashPropOr3x5<TDefault> = (path: lodash.PropertyPath) => TDefault;
+    type LodashPropOr3x6 = <TDefault>(defaultValue: TDefault) => TDefault;
+    interface LodashPropOr4x1 {
+        (path: lodash.PropertyPath): LodashPropOr4x3;
+        (path: lodash.__, object: any): LodashPropOr4x5;
+        (path: lodash.PropertyPath, object: any): any;
+    }
+    type LodashPropOr4x3 = (object: any) => any;
+    interface LodashPropOr4x4 {
+        (defaultValue: any): LodashPropOr4x5;
+        (defaultValue: lodash.__, path: lodash.PropertyPath): LodashPropOr4x6;
+        (defaultValue: any, path: lodash.PropertyPath): any;
+    }
+    type LodashPropOr4x5 = (path: lodash.PropertyPath) => any;
+    type LodashPropOr4x6 = (defaultValue: any) => any;
+    interface LodashPull {
+        <T>(values: T): LodashPull1x1<T>;
+        <T>(values: lodash.__, array: ReadonlyArray<T>): LodashPull1x2<T>;
+        <T>(values: T, array: ReadonlyArray<T>): T[];
+        <T>(values: lodash.__, array: lodash.List<T>): LodashPull2x2<T>;
+        <T>(values: T, array: lodash.List<T>): lodash.List<T>;
+    }
+    interface LodashPull1x1<T> {
+        (array: ReadonlyArray<T>): T[];
+        (array: lodash.List<T>): lodash.List<T>;
+    }
+    type LodashPull1x2<T> = (values: T) => T[];
+    type LodashPull2x2<T> = (values: T) => lodash.List<T>;
+    interface LodashPullAll {
+        <T>(values: lodash.List<T>): LodashPullAll1x1<T>;
+        <T>(values: lodash.__, array: ReadonlyArray<T>): LodashPullAll1x2<T>;
+        <T>(values: lodash.List<T>, array: ReadonlyArray<T>): T[];
+        <T>(values: lodash.__, array: lodash.List<T>): LodashPullAll2x2<T>;
+        <T>(values: lodash.List<T>, array: lodash.List<T>): lodash.List<T>;
+    }
+    interface LodashPullAll1x1<T> {
+        (array: ReadonlyArray<T>): T[];
+        (array: lodash.List<T>): lodash.List<T>;
+    }
+    type LodashPullAll1x2<T> = (values: lodash.List<T>) => T[];
+    type LodashPullAll2x2<T> = (values: lodash.List<T>) => lodash.List<T>;
+    interface LodashPullAllBy {
+        <T>(iteratee: lodash.ValueIteratee<T>): LodashPullAllBy1x1<T>;
+        <T>(iteratee: lodash.__, values: lodash.List<T>): LodashPullAllBy1x2<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, values: lodash.List<T>): LodashPullAllBy1x3<T>;
+        <T>(iteratee: lodash.__, values: lodash.__, array: ReadonlyArray<T>): LodashPullAllBy1x4<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, values: lodash.__, array: ReadonlyArray<T>): LodashPullAllBy1x5<T>;
+        <T>(iteratee: lodash.__, values: lodash.List<T>, array: ReadonlyArray<T>): LodashPullAllBy1x6<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, values: lodash.List<T>, array: ReadonlyArray<T>): T[];
+        <T>(iteratee: lodash.__, values: lodash.__, array: lodash.List<T>): LodashPullAllBy2x4<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, values: lodash.__, array: lodash.List<T>): LodashPullAllBy2x5<T>;
+        <T>(iteratee: lodash.__, values: lodash.List<T>, array: lodash.List<T>): LodashPullAllBy2x6<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, values: lodash.List<T>, array: lodash.List<T>): lodash.List<T>;
+        <T1, T2>(iteratee: lodash.ValueIteratee<T1 | T2>): LodashPullAllBy3x1<T1, T2>;
+        <T2>(iteratee: lodash.__, values: lodash.List<T2>): LodashPullAllBy3x2<T2>;
+        <T1, T2>(iteratee: lodash.ValueIteratee<T1 | T2>, values: lodash.List<T2>): LodashPullAllBy3x3<T1>;
+        <T1>(iteratee: lodash.__, values: lodash.__, array: ReadonlyArray<T1>): LodashPullAllBy3x4<T1>;
+        <T1, T2>(iteratee: lodash.ValueIteratee<T1 | T2>, values: lodash.__, array: ReadonlyArray<T1>): LodashPullAllBy3x5<T1, T2>;
+        <T1, T2>(iteratee: lodash.__, values: lodash.List<T2>, array: ReadonlyArray<T1>): LodashPullAllBy3x6<T1, T2>;
+        <T1, T2>(iteratee: lodash.ValueIteratee<T1 | T2>, values: lodash.List<T2>, array: ReadonlyArray<T1>): T1[];
+        <T1>(iteratee: lodash.__, values: lodash.__, array: lodash.List<T1>): LodashPullAllBy4x4<T1>;
+        <T1, T2>(iteratee: lodash.ValueIteratee<T1 | T2>, values: lodash.__, array: lodash.List<T1>): LodashPullAllBy4x5<T1, T2>;
+        <T1, T2>(iteratee: lodash.__, values: lodash.List<T2>, array: lodash.List<T1>): LodashPullAllBy4x6<T1, T2>;
+        <T1, T2>(iteratee: lodash.ValueIteratee<T1 | T2>, values: lodash.List<T2>, array: lodash.List<T1>): lodash.List<T1>;
+    }
+    interface LodashPullAllBy1x1<T> {
+        (values: lodash.List<T>): LodashPullAllBy1x3<T>;
+        (values: lodash.__, array: ReadonlyArray<T>): LodashPullAllBy1x5<T>;
+        (values: lodash.List<T>, array: ReadonlyArray<T>): T[];
+        (values: lodash.__, array: lodash.List<T>): LodashPullAllBy2x5<T>;
+        (values: lodash.List<T>, array: lodash.List<T>): lodash.List<T>;
+    }
+    interface LodashPullAllBy1x2<T> {
+        (iteratee: lodash.ValueIteratee<T>): LodashPullAllBy1x3<T>;
+        (iteratee: lodash.__, array: ReadonlyArray<T>): LodashPullAllBy1x6<T>;
+        (iteratee: lodash.ValueIteratee<T>, array: ReadonlyArray<T>): T[];
+        (iteratee: lodash.__, array: lodash.List<T>): LodashPullAllBy2x6<T>;
+        (iteratee: lodash.ValueIteratee<T>, array: lodash.List<T>): lodash.List<T>;
+    }
+    interface LodashPullAllBy1x3<T> {
+        (array: ReadonlyArray<T>): T[];
+        (array: lodash.List<T>): lodash.List<T>;
+    }
+    interface LodashPullAllBy1x4<T> {
+        (iteratee: lodash.ValueIteratee<T>): LodashPullAllBy1x5<T>;
+        (iteratee: lodash.__, values: lodash.List<T>): LodashPullAllBy1x6<T>;
+        (iteratee: lodash.ValueIteratee<T>, values: lodash.List<T>): T[];
+    }
+    type LodashPullAllBy1x5<T> = (values: lodash.List<T>) => T[];
+    type LodashPullAllBy1x6<T> = (iteratee: lodash.ValueIteratee<T>) => T[];
+    interface LodashPullAllBy2x4<T> {
+        (iteratee: lodash.ValueIteratee<T>): LodashPullAllBy2x5<T>;
+        (iteratee: lodash.__, values: lodash.List<T>): LodashPullAllBy2x6<T>;
+        (iteratee: lodash.ValueIteratee<T>, values: lodash.List<T>): lodash.List<T>;
+    }
+    type LodashPullAllBy2x5<T> = (values: lodash.List<T>) => lodash.List<T>;
+    type LodashPullAllBy2x6<T> = (iteratee: lodash.ValueIteratee<T>) => lodash.List<T>;
+    interface LodashPullAllBy3x1<T1, T2> {
+        (values: lodash.List<T2>): LodashPullAllBy3x3<T1>;
+        (values: lodash.__, array: ReadonlyArray<T1>): LodashPullAllBy3x5<T1, T2>;
+        (values: lodash.List<T2>, array: ReadonlyArray<T1>): T1[];
+        (values: lodash.__, array: lodash.List<T1>): LodashPullAllBy4x5<T1, T2>;
+        (values: lodash.List<T2>, array: lodash.List<T1>): lodash.List<T1>;
+    }
+    interface LodashPullAllBy3x2<T2> {
+        <T1>(iteratee: lodash.ValueIteratee<T1 | T2>): LodashPullAllBy3x3<T1>;
+        <T1>(iteratee: lodash.__, array: ReadonlyArray<T1>): LodashPullAllBy3x6<T1, T2>;
+        <T1>(iteratee: lodash.ValueIteratee<T1 | T2>, array: ReadonlyArray<T1>): T1[];
+        <T1>(iteratee: lodash.__, array: lodash.List<T1>): LodashPullAllBy4x6<T1, T2>;
+        <T1>(iteratee: lodash.ValueIteratee<T1 | T2>, array: lodash.List<T1>): lodash.List<T1>;
+    }
+    interface LodashPullAllBy3x3<T1> {
+        (array: ReadonlyArray<T1>): T1[];
+        (array: lodash.List<T1>): lodash.List<T1>;
+    }
+    interface LodashPullAllBy3x4<T1> {
+        <T2>(iteratee: lodash.ValueIteratee<T1 | T2>): LodashPullAllBy3x5<T1, T2>;
+        <T2>(iteratee: lodash.__, values: lodash.List<T2>): LodashPullAllBy3x6<T1, T2>;
+        <T2>(iteratee: lodash.ValueIteratee<T1 | T2>, values: lodash.List<T2>): T1[];
+    }
+    type LodashPullAllBy3x5<T1, T2> = (values: lodash.List<T2>) => T1[];
+    type LodashPullAllBy3x6<T1, T2> = (iteratee: lodash.ValueIteratee<T1 | T2>) => T1[];
+    interface LodashPullAllBy4x4<T1> {
+        <T2>(iteratee: lodash.ValueIteratee<T1 | T2>): LodashPullAllBy4x5<T1, T2>;
+        <T2>(iteratee: lodash.__, values: lodash.List<T2>): LodashPullAllBy4x6<T1, T2>;
+        <T2>(iteratee: lodash.ValueIteratee<T1 | T2>, values: lodash.List<T2>): lodash.List<T1>;
+    }
+    type LodashPullAllBy4x5<T1, T2> = (values: lodash.List<T2>) => lodash.List<T1>;
+    type LodashPullAllBy4x6<T1, T2> = (iteratee: lodash.ValueIteratee<T1 | T2>) => lodash.List<T1>;
+    interface LodashPullAllWith {
+        <T>(comparator: lodash.Comparator<T>): LodashPullAllWith1x1<T>;
+        <T>(comparator: lodash.__, values: lodash.List<T>): LodashPullAllWith1x2<T>;
+        <T>(comparator: lodash.Comparator<T>, values: lodash.List<T>): LodashPullAllWith1x3<T>;
+        <T>(comparator: lodash.__, values: lodash.__, array: ReadonlyArray<T>): LodashPullAllWith1x4<T>;
+        <T>(comparator: lodash.Comparator<T>, values: lodash.__, array: ReadonlyArray<T>): LodashPullAllWith1x5<T>;
+        <T>(comparator: lodash.__, values: lodash.List<T>, array: ReadonlyArray<T>): LodashPullAllWith1x6<T>;
+        <T>(comparator: lodash.Comparator<T>, values: lodash.List<T>, array: ReadonlyArray<T>): T[];
+        <T>(comparator: lodash.__, values: lodash.__, array: lodash.List<T>): LodashPullAllWith2x4<T>;
+        <T>(comparator: lodash.Comparator<T>, values: lodash.__, array: lodash.List<T>): LodashPullAllWith2x5<T>;
+        <T>(comparator: lodash.__, values: lodash.List<T>, array: lodash.List<T>): LodashPullAllWith2x6<T>;
+        <T>(comparator: lodash.Comparator<T>, values: lodash.List<T>, array: lodash.List<T>): lodash.List<T>;
+        <T1, T2>(comparator: lodash.Comparator2<T1, T2>): LodashPullAllWith3x1<T1, T2>;
+        <T2>(comparator: lodash.__, values: lodash.List<T2>): LodashPullAllWith3x2<T2>;
+        <T1, T2>(comparator: lodash.Comparator2<T1, T2>, values: lodash.List<T2>): LodashPullAllWith3x3<T1>;
+        <T1>(comparator: lodash.__, values: lodash.__, array: ReadonlyArray<T1>): LodashPullAllWith3x4<T1>;
+        <T1, T2>(comparator: lodash.Comparator2<T1, T2>, values: lodash.__, array: ReadonlyArray<T1>): LodashPullAllWith3x5<T1, T2>;
+        <T1, T2>(comparator: lodash.__, values: lodash.List<T2>, array: ReadonlyArray<T1>): LodashPullAllWith3x6<T1, T2>;
+        <T1, T2>(comparator: lodash.Comparator2<T1, T2>, values: lodash.List<T2>, array: ReadonlyArray<T1>): T1[];
+        <T1>(comparator: lodash.__, values: lodash.__, array: lodash.List<T1>): LodashPullAllWith4x4<T1>;
+        <T1, T2>(comparator: lodash.Comparator2<T1, T2>, values: lodash.__, array: lodash.List<T1>): LodashPullAllWith4x5<T1, T2>;
+        <T1, T2>(comparator: lodash.__, values: lodash.List<T2>, array: lodash.List<T1>): LodashPullAllWith4x6<T1, T2>;
+        <T1, T2>(comparator: lodash.Comparator2<T1, T2>, values: lodash.List<T2>, array: lodash.List<T1>): lodash.List<T1>;
+    }
+    interface LodashPullAllWith1x1<T> {
+        (values: lodash.List<T>): LodashPullAllWith1x3<T>;
+        (values: lodash.__, array: ReadonlyArray<T>): LodashPullAllWith1x5<T>;
+        (values: lodash.List<T>, array: ReadonlyArray<T>): T[];
+        (values: lodash.__, array: lodash.List<T>): LodashPullAllWith2x5<T>;
+        (values: lodash.List<T>, array: lodash.List<T>): lodash.List<T>;
+    }
+    interface LodashPullAllWith1x2<T> {
+        (comparator: lodash.Comparator<T>): LodashPullAllWith1x3<T>;
+        (comparator: lodash.__, array: ReadonlyArray<T>): LodashPullAllWith1x6<T>;
+        (comparator: lodash.Comparator<T>, array: ReadonlyArray<T>): T[];
+        (comparator: lodash.__, array: lodash.List<T>): LodashPullAllWith2x6<T>;
+        (comparator: lodash.Comparator<T>, array: lodash.List<T>): lodash.List<T>;
+    }
+    interface LodashPullAllWith1x3<T> {
+        (array: ReadonlyArray<T>): T[];
+        (array: lodash.List<T>): lodash.List<T>;
+    }
+    interface LodashPullAllWith1x4<T> {
+        (comparator: lodash.Comparator<T>): LodashPullAllWith1x5<T>;
+        (comparator: lodash.__, values: lodash.List<T>): LodashPullAllWith1x6<T>;
+        (comparator: lodash.Comparator<T>, values: lodash.List<T>): T[];
+    }
+    type LodashPullAllWith1x5<T> = (values: lodash.List<T>) => T[];
+    type LodashPullAllWith1x6<T> = (comparator: lodash.Comparator<T>) => T[];
+    interface LodashPullAllWith2x4<T> {
+        (comparator: lodash.Comparator<T>): LodashPullAllWith2x5<T>;
+        (comparator: lodash.__, values: lodash.List<T>): LodashPullAllWith2x6<T>;
+        (comparator: lodash.Comparator<T>, values: lodash.List<T>): lodash.List<T>;
+    }
+    type LodashPullAllWith2x5<T> = (values: lodash.List<T>) => lodash.List<T>;
+    type LodashPullAllWith2x6<T> = (comparator: lodash.Comparator<T>) => lodash.List<T>;
+    interface LodashPullAllWith3x1<T1, T2> {
+        (values: lodash.List<T2>): LodashPullAllWith3x3<T1>;
+        (values: lodash.__, array: ReadonlyArray<T1>): LodashPullAllWith3x5<T1, T2>;
+        (values: lodash.List<T2>, array: ReadonlyArray<T1>): T1[];
+        (values: lodash.__, array: lodash.List<T1>): LodashPullAllWith4x5<T1, T2>;
+        (values: lodash.List<T2>, array: lodash.List<T1>): lodash.List<T1>;
+    }
+    interface LodashPullAllWith3x2<T2> {
+        <T1>(comparator: lodash.Comparator2<T1, T2>): LodashPullAllWith3x3<T1>;
+        <T1>(comparator: lodash.__, array: ReadonlyArray<T1>): LodashPullAllWith3x6<T1, T2>;
+        <T1>(comparator: lodash.Comparator2<T1, T2>, array: ReadonlyArray<T1>): T1[];
+        <T1>(comparator: lodash.__, array: lodash.List<T1>): LodashPullAllWith4x6<T1, T2>;
+        <T1>(comparator: lodash.Comparator2<T1, T2>, array: lodash.List<T1>): lodash.List<T1>;
+    }
+    interface LodashPullAllWith3x3<T1> {
+        (array: ReadonlyArray<T1>): T1[];
+        (array: lodash.List<T1>): lodash.List<T1>;
+    }
+    interface LodashPullAllWith3x4<T1> {
+        <T2>(comparator: lodash.Comparator2<T1, T2>): LodashPullAllWith3x5<T1, T2>;
+        <T2>(comparator: lodash.__, values: lodash.List<T2>): LodashPullAllWith3x6<T1, T2>;
+        <T2>(comparator: lodash.Comparator2<T1, T2>, values: lodash.List<T2>): T1[];
+    }
+    type LodashPullAllWith3x5<T1, T2> = (values: lodash.List<T2>) => T1[];
+    type LodashPullAllWith3x6<T1, T2> = (comparator: lodash.Comparator2<T1, T2>) => T1[];
+    interface LodashPullAllWith4x4<T1> {
+        <T2>(comparator: lodash.Comparator2<T1, T2>): LodashPullAllWith4x5<T1, T2>;
+        <T2>(comparator: lodash.__, values: lodash.List<T2>): LodashPullAllWith4x6<T1, T2>;
+        <T2>(comparator: lodash.Comparator2<T1, T2>, values: lodash.List<T2>): lodash.List<T1>;
+    }
+    type LodashPullAllWith4x5<T1, T2> = (values: lodash.List<T2>) => lodash.List<T1>;
+    type LodashPullAllWith4x6<T1, T2> = (comparator: lodash.Comparator2<T1, T2>) => lodash.List<T1>;
+    interface LodashPullAt {
+        (indexes: lodash.Many<number>): LodashPullAt1x1;
+        <T>(indexes: lodash.__, array: ReadonlyArray<T>): LodashPullAt1x2<T>;
+        <T>(indexes: lodash.Many<number>, array: ReadonlyArray<T>): T[];
+        <T>(indexes: lodash.__, array: lodash.List<T>): LodashPullAt2x2<T>;
+        <T>(indexes: lodash.Many<number>, array: lodash.List<T>): lodash.List<T>;
+    }
+    interface LodashPullAt1x1 {
+        <T>(array: ReadonlyArray<T>): T[];
+        <T>(array: lodash.List<T>): lodash.List<T>;
+    }
+    type LodashPullAt1x2<T> = (indexes: lodash.Many<number>) => T[];
+    type LodashPullAt2x2<T> = (indexes: lodash.Many<number>) => lodash.List<T>;
+    interface LodashRandom {
+        (maxOrMin: number): LodashRandom1x1;
+        (max: lodash.__, floating: boolean): LodashRandom1x2;
+        (maxOrMin: number, floatingOrMax: boolean | number): number;
+        (min: lodash.__, max: number): LodashRandom2x2;
+    }
+    type LodashRandom1x1 = (floatingOrMax: boolean | number) => number;
+    type LodashRandom1x2 = (max: number) => number;
+    type LodashRandom2x2 = (min: number) => number;
+    interface LodashRange {
+        (start: number): LodashRange1x1;
+        (start: lodash.__, end: number): LodashRange1x2;
+        (start: number, end: number): number[];
+    }
+    type LodashRange1x1 = (end: number) => number[];
+    type LodashRange1x2 = (start: number) => number[];
+    interface LodashRangeRight {
+        (start: number): LodashRangeRight1x1;
+        (start: lodash.__, end: number): LodashRangeRight1x2;
+        (start: number, end: number): number[];
+    }
+    type LodashRangeRight1x1 = (end: number) => number[];
+    type LodashRangeRight1x2 = (start: number) => number[];
+    interface LodashRangeStep {
+        (start: number): LodashRangeStep1x1;
+        (start: lodash.__, end: number): LodashRangeStep1x2;
+        (start: number, end: number): LodashRangeStep1x3;
+        (start: lodash.__, end: lodash.__, step: number): LodashRangeStep1x4;
+        (start: number, end: lodash.__, step: number): LodashRangeStep1x5;
+        (start: lodash.__, end: number, step: number): LodashRangeStep1x6;
+        (start: number, end: number, step: number): number[];
+    }
+    interface LodashRangeStep1x1 {
+        (end: number): LodashRangeStep1x3;
+        (end: lodash.__, step: number): LodashRangeStep1x5;
+        (end: number, step: number): number[];
+    }
+    interface LodashRangeStep1x2 {
+        (start: number): LodashRangeStep1x3;
+        (start: lodash.__, step: number): LodashRangeStep1x6;
+        (start: number, step: number): number[];
+    }
+    type LodashRangeStep1x3 = (step: number) => number[];
+    interface LodashRangeStep1x4 {
+        (start: number): LodashRangeStep1x5;
+        (start: lodash.__, end: number): LodashRangeStep1x6;
+        (start: number, end: number): number[];
+    }
+    type LodashRangeStep1x5 = (end: number) => number[];
+    type LodashRangeStep1x6 = (start: number) => number[];
+    interface LodashRangeStepRight {
+        (start: number): LodashRangeStepRight1x1;
+        (start: lodash.__, end: number): LodashRangeStepRight1x2;
+        (start: number, end: number): LodashRangeStepRight1x3;
+        (start: lodash.__, end: lodash.__, step: number): LodashRangeStepRight1x4;
+        (start: number, end: lodash.__, step: number): LodashRangeStepRight1x5;
+        (start: lodash.__, end: number, step: number): LodashRangeStepRight1x6;
+        (start: number, end: number, step: number): number[];
+    }
+    interface LodashRangeStepRight1x1 {
+        (end: number): LodashRangeStepRight1x3;
+        (end: lodash.__, step: number): LodashRangeStepRight1x5;
+        (end: number, step: number): number[];
+    }
+    interface LodashRangeStepRight1x2 {
+        (start: number): LodashRangeStepRight1x3;
+        (start: lodash.__, step: number): LodashRangeStepRight1x6;
+        (start: number, step: number): number[];
+    }
+    type LodashRangeStepRight1x3 = (step: number) => number[];
+    interface LodashRangeStepRight1x4 {
+        (start: number): LodashRangeStepRight1x5;
+        (start: lodash.__, end: number): LodashRangeStepRight1x6;
+        (start: number, end: number): number[];
+    }
+    type LodashRangeStepRight1x5 = (end: number) => number[];
+    type LodashRangeStepRight1x6 = (start: number) => number[];
+    interface LodashRearg {
+        (indexes: lodash.Many<number>): LodashRearg1x1;
+        (indexes: lodash.__, func: (...args: any[]) => any): LodashRearg1x2;
+        (indexes: lodash.Many<number>, func: (...args: any[]) => any): (...args: any[]) => any;
+    }
+    type LodashRearg1x1 = (func: (...args: any[]) => any) => (...args: any[]) => any;
+    type LodashRearg1x2 = (indexes: lodash.Many<number>) => (...args: any[]) => any;
+    interface LodashReduce {
+        <T, TResult>(callback: lodash.MemoIteratorCapped<T, TResult>): LodashReduce1x1<T, TResult>;
+        <TResult>(callback: lodash.__, accumulator: TResult): LodashReduce1x2<TResult>;
+        <T, TResult>(callback: lodash.MemoIteratorCapped<T, TResult>, accumulator: TResult): LodashReduce1x3<T, TResult>;
+        <T>(callback: lodash.__, accumulator: lodash.__, collection: T[] | null | undefined): LodashReduce1x4<T>;
+        <T, TResult>(callback: lodash.MemoIteratorCapped<T, TResult>, accumulator: lodash.__, collection: T[] | null | undefined): LodashReduce1x5<TResult>;
+        <T, TResult>(callback: lodash.__, accumulator: TResult, collection: T[] | null | undefined): LodashReduce1x6<T, TResult>;
+        <T, TResult>(callback: lodash.MemoIteratorCapped<T, TResult>, accumulator: TResult, collection: T[] | lodash.List<T> | null | undefined): TResult;
+        <T>(callback: lodash.__, accumulator: lodash.__, collection: lodash.List<T> | null | undefined): LodashReduce2x4<T>;
+        <T, TResult>(callback: lodash.MemoIteratorCapped<T, TResult>, accumulator: lodash.__, collection: lodash.List<T> | null | undefined): LodashReduce2x5<TResult>;
+        <T, TResult>(callback: lodash.__, accumulator: TResult, collection: lodash.List<T> | null | undefined): LodashReduce2x6<T, TResult>;
+        <T extends object, TResult>(callback: lodash.MemoIteratorCapped<T[keyof T], TResult>): LodashReduce3x1<T, TResult>;
+        <T extends object, TResult>(callback: lodash.MemoIteratorCapped<T[keyof T], TResult>, accumulator: TResult): LodashReduce3x3<T, TResult>;
+        <T extends object>(callback: lodash.__, accumulator: lodash.__, collection: T | null | undefined): LodashReduce3x4<T>;
+        <T extends object, TResult>(callback: lodash.MemoIteratorCapped<T[keyof T], TResult>, accumulator: lodash.__, collection: T | null | undefined): LodashReduce3x5<TResult>;
+        <T extends object, TResult>(callback: lodash.__, accumulator: TResult, collection: T | null | undefined): LodashReduce3x6<T, TResult>;
+        <T extends object, TResult>(callback: lodash.MemoIteratorCapped<T[keyof T], TResult>, accumulator: TResult, collection: T | null | undefined): TResult;
+    }
+    interface LodashReduce1x1<T, TResult> {
+        (accumulator: TResult): LodashReduce1x3<T, TResult>;
+        (accumulator: lodash.__, collection: T[] | null | undefined): LodashReduce1x5<TResult>;
+        (accumulator: TResult, collection: T[] | lodash.List<T> | null | undefined): TResult;
+        (accumulator: lodash.__, collection: lodash.List<T> | null | undefined): LodashReduce2x5<TResult>;
+    }
+    interface LodashReduce1x2<TResult> {
+        <T>(callback: lodash.MemoIteratorCapped<T, TResult>): LodashReduce1x3<T, TResult>;
+        <T>(callback: lodash.__, collection: T[] | null | undefined): LodashReduce1x6<T, TResult>;
+        <T>(callback: lodash.MemoIteratorCapped<T, TResult>, collection: T[] | lodash.List<T> | null | undefined): TResult;
+        <T>(callback: lodash.__, collection: lodash.List<T> | null | undefined): LodashReduce2x6<T, TResult>;
+        <T extends object>(callback: lodash.MemoIteratorCapped<T[keyof T], TResult>): LodashReduce3x3<T, TResult>;
+        <T extends object>(callback: lodash.__, collection: T | null | undefined): LodashReduce3x6<T, TResult>;
+        <T extends object>(callback: lodash.MemoIteratorCapped<T[keyof T], TResult>, collection: T | null | undefined): TResult;
+    }
+    type LodashReduce1x3<T, TResult> = (collection: T[] | lodash.List<T> | null | undefined) => TResult;
+    interface LodashReduce1x4<T> {
+        <TResult>(callback: lodash.MemoIteratorCapped<T, TResult>): LodashReduce1x5<TResult>;
+        <TResult>(callback: lodash.__, accumulator: TResult): LodashReduce1x6<T, TResult>;
+        <TResult>(callback: lodash.MemoIteratorCapped<T, TResult>, accumulator: TResult): TResult;
+    }
+    type LodashReduce1x5<TResult> = (accumulator: TResult) => TResult;
+    type LodashReduce1x6<T, TResult> = (callback: lodash.MemoIteratorCapped<T, TResult>) => TResult;
+    interface LodashReduce2x4<T> {
+        <TResult>(callback: lodash.MemoIteratorCapped<T, TResult>): LodashReduce2x5<TResult>;
+        <TResult>(callback: lodash.__, accumulator: TResult): LodashReduce2x6<T, TResult>;
+        <TResult>(callback: lodash.MemoIteratorCapped<T, TResult>, accumulator: TResult): TResult;
+    }
+    type LodashReduce2x5<TResult> = (accumulator: TResult) => TResult;
+    type LodashReduce2x6<T, TResult> = (callback: lodash.MemoIteratorCapped<T, TResult>) => TResult;
+    interface LodashReduce3x1<T, TResult> {
+        (accumulator: TResult): LodashReduce3x3<T, TResult>;
+        (accumulator: lodash.__, collection: T | null | undefined): LodashReduce3x5<TResult>;
+        (accumulator: TResult, collection: T | null | undefined): TResult;
+    }
+    type LodashReduce3x3<T, TResult> = (collection: T | null | undefined) => TResult;
+    interface LodashReduce3x4<T> {
+        <TResult>(callback: lodash.MemoIteratorCapped<T[keyof T], TResult>): LodashReduce3x5<TResult>;
+        <TResult>(callback: lodash.__, accumulator: TResult): LodashReduce3x6<T, TResult>;
+        <TResult>(callback: lodash.MemoIteratorCapped<T[keyof T], TResult>, accumulator: TResult): TResult;
+    }
+    type LodashReduce3x5<TResult> = (accumulator: TResult) => TResult;
+    type LodashReduce3x6<T, TResult> = (callback: lodash.MemoIteratorCapped<T[keyof T], TResult>) => TResult;
+    interface LodashReduceRight {
+        <T, TResult>(callback: lodash.MemoIteratorCappedRight<T, TResult>): LodashReduceRight1x1<T, TResult>;
+        <TResult>(callback: lodash.__, accumulator: TResult): LodashReduceRight1x2<TResult>;
+        <T, TResult>(callback: lodash.MemoIteratorCappedRight<T, TResult>, accumulator: TResult): LodashReduceRight1x3<T, TResult>;
+        <T>(callback: lodash.__, accumulator: lodash.__, collection: T[] | null | undefined): LodashReduceRight1x4<T>;
+        <T, TResult>(callback: lodash.MemoIteratorCappedRight<T, TResult>, accumulator: lodash.__, collection: T[] | null | undefined): LodashReduceRight1x5<TResult>;
+        <T, TResult>(callback: lodash.__, accumulator: TResult, collection: T[] | null | undefined): LodashReduceRight1x6<T, TResult>;
+        <T, TResult>(callback: lodash.MemoIteratorCappedRight<T, TResult>, accumulator: TResult, collection: T[] | lodash.List<T> | null | undefined): TResult;
+        <T>(callback: lodash.__, accumulator: lodash.__, collection: lodash.List<T> | null | undefined): LodashReduceRight2x4<T>;
+        <T, TResult>(callback: lodash.MemoIteratorCappedRight<T, TResult>, accumulator: lodash.__, collection: lodash.List<T> | null | undefined): LodashReduceRight2x5<TResult>;
+        <T, TResult>(callback: lodash.__, accumulator: TResult, collection: lodash.List<T> | null | undefined): LodashReduceRight2x6<T, TResult>;
+        <T extends object, TResult>(callback: lodash.MemoIteratorCappedRight<T[keyof T], TResult>): LodashReduceRight3x1<T, TResult>;
+        <T extends object, TResult>(callback: lodash.MemoIteratorCappedRight<T[keyof T], TResult>, accumulator: TResult): LodashReduceRight3x3<T, TResult>;
+        <T extends object>(callback: lodash.__, accumulator: lodash.__, collection: T | null | undefined): LodashReduceRight3x4<T>;
+        <T extends object, TResult>(callback: lodash.MemoIteratorCappedRight<T[keyof T], TResult>, accumulator: lodash.__, collection: T | null | undefined): LodashReduceRight3x5<TResult>;
+        <T extends object, TResult>(callback: lodash.__, accumulator: TResult, collection: T | null | undefined): LodashReduceRight3x6<T, TResult>;
+        <T extends object, TResult>(callback: lodash.MemoIteratorCappedRight<T[keyof T], TResult>, accumulator: TResult, collection: T | null | undefined): TResult;
+    }
+    interface LodashReduceRight1x1<T, TResult> {
+        (accumulator: TResult): LodashReduceRight1x3<T, TResult>;
+        (accumulator: lodash.__, collection: T[] | null | undefined): LodashReduceRight1x5<TResult>;
+        (accumulator: TResult, collection: T[] | lodash.List<T> | null | undefined): TResult;
+        (accumulator: lodash.__, collection: lodash.List<T> | null | undefined): LodashReduceRight2x5<TResult>;
+    }
+    interface LodashReduceRight1x2<TResult> {
+        <T>(callback: lodash.MemoIteratorCappedRight<T, TResult>): LodashReduceRight1x3<T, TResult>;
+        <T>(callback: lodash.__, collection: T[] | null | undefined): LodashReduceRight1x6<T, TResult>;
+        <T>(callback: lodash.MemoIteratorCappedRight<T, TResult>, collection: T[] | lodash.List<T> | null | undefined): TResult;
+        <T>(callback: lodash.__, collection: lodash.List<T> | null | undefined): LodashReduceRight2x6<T, TResult>;
+        <T extends object>(callback: lodash.MemoIteratorCappedRight<T[keyof T], TResult>): LodashReduceRight3x3<T, TResult>;
+        <T extends object>(callback: lodash.__, collection: T | null | undefined): LodashReduceRight3x6<T, TResult>;
+        <T extends object>(callback: lodash.MemoIteratorCappedRight<T[keyof T], TResult>, collection: T | null | undefined): TResult;
+    }
+    type LodashReduceRight1x3<T, TResult> = (collection: T[] | lodash.List<T> | null | undefined) => TResult;
+    interface LodashReduceRight1x4<T> {
+        <TResult>(callback: lodash.MemoIteratorCappedRight<T, TResult>): LodashReduceRight1x5<TResult>;
+        <TResult>(callback: lodash.__, accumulator: TResult): LodashReduceRight1x6<T, TResult>;
+        <TResult>(callback: lodash.MemoIteratorCappedRight<T, TResult>, accumulator: TResult): TResult;
+    }
+    type LodashReduceRight1x5<TResult> = (accumulator: TResult) => TResult;
+    type LodashReduceRight1x6<T, TResult> = (callback: lodash.MemoIteratorCappedRight<T, TResult>) => TResult;
+    interface LodashReduceRight2x4<T> {
+        <TResult>(callback: lodash.MemoIteratorCappedRight<T, TResult>): LodashReduceRight2x5<TResult>;
+        <TResult>(callback: lodash.__, accumulator: TResult): LodashReduceRight2x6<T, TResult>;
+        <TResult>(callback: lodash.MemoIteratorCappedRight<T, TResult>, accumulator: TResult): TResult;
+    }
+    type LodashReduceRight2x5<TResult> = (accumulator: TResult) => TResult;
+    type LodashReduceRight2x6<T, TResult> = (callback: lodash.MemoIteratorCappedRight<T, TResult>) => TResult;
+    interface LodashReduceRight3x1<T, TResult> {
+        (accumulator: TResult): LodashReduceRight3x3<T, TResult>;
+        (accumulator: lodash.__, collection: T | null | undefined): LodashReduceRight3x5<TResult>;
+        (accumulator: TResult, collection: T | null | undefined): TResult;
+    }
+    type LodashReduceRight3x3<T, TResult> = (collection: T | null | undefined) => TResult;
+    interface LodashReduceRight3x4<T> {
+        <TResult>(callback: lodash.MemoIteratorCappedRight<T[keyof T], TResult>): LodashReduceRight3x5<TResult>;
+        <TResult>(callback: lodash.__, accumulator: TResult): LodashReduceRight3x6<T, TResult>;
+        <TResult>(callback: lodash.MemoIteratorCappedRight<T[keyof T], TResult>, accumulator: TResult): TResult;
+    }
+    type LodashReduceRight3x5<TResult> = (accumulator: TResult) => TResult;
+    type LodashReduceRight3x6<T, TResult> = (callback: lodash.MemoIteratorCappedRight<T[keyof T], TResult>) => TResult;
+    interface LodashReject {
+        (predicate: (value: string) => boolean): LodashReject1x1;
+        (predicate: lodash.__, collection: string | null | undefined): LodashReject1x2;
+        (predicate: (value: string) => boolean, collection: string | null | undefined): string[];
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>): LodashReject2x1<T>;
+        <T>(predicate: lodash.__, collection: lodash.List<T> | null | undefined): LodashReject2x2<T>;
+        <T>(predicate: lodash.ValueIterateeCustom<T, boolean>, collection: lodash.List<T> | null | undefined): T[];
+        <T extends object>(predicate: lodash.__, collection: T | null | undefined): LodashReject3x2<T>;
+        <T extends object>(predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>, collection: T | null | undefined): Array<T[keyof T]>;
+    }
+    type LodashReject1x1 = (collection: string | null | undefined) => string[];
+    type LodashReject1x2 = (predicate: (value: string) => boolean) => string[];
+    type LodashReject2x1<T> = (collection: lodash.List<T> | object | null | undefined) => T[];
+    type LodashReject2x2<T> = (predicate: lodash.ValueIterateeCustom<T, boolean>) => T[];
+    type LodashReject3x2<T> = (predicate: lodash.ValueIterateeCustom<T[keyof T], boolean>) => Array<T[keyof T]>;
+    interface LodashRemove {
+        <T>(predicate: lodash.ValueIteratee<T>): LodashRemove1x1<T>;
+        <T>(predicate: lodash.__, array: lodash.List<T>): LodashRemove1x2<T>;
+        <T>(predicate: lodash.ValueIteratee<T>, array: lodash.List<T>): T[];
+    }
+    type LodashRemove1x1<T> = (array: lodash.List<T>) => T[];
+    type LodashRemove1x2<T> = (predicate: lodash.ValueIteratee<T>) => T[];
+    interface LodashRepeat {
+        (n: number): LodashRepeat1x1;
+        (n: lodash.__, string: string): LodashRepeat1x2;
+        (n: number, string: string): string;
+    }
+    type LodashRepeat1x1 = (string: string) => string;
+    type LodashRepeat1x2 = (n: number) => string;
+    interface LodashReplace {
+        (pattern: RegExp | string): LodashReplace1x1;
+        (pattern: lodash.__, replacement: lodash.ReplaceFunction | string): LodashReplace1x2;
+        (pattern: RegExp | string, replacement: lodash.ReplaceFunction | string): LodashReplace1x3;
+        (pattern: lodash.__, replacement: lodash.__, string: string): LodashReplace1x4;
+        (pattern: RegExp | string, replacement: lodash.__, string: string): LodashReplace1x5;
+        (pattern: lodash.__, replacement: lodash.ReplaceFunction | string, string: string): LodashReplace1x6;
+        (pattern: RegExp | string, replacement: lodash.ReplaceFunction | string, string: string): string;
+    }
+    interface LodashReplace1x1 {
+        (replacement: lodash.ReplaceFunction | string): LodashReplace1x3;
+        (replacement: lodash.__, string: string): LodashReplace1x5;
+        (replacement: lodash.ReplaceFunction | string, string: string): string;
+    }
+    interface LodashReplace1x2 {
+        (pattern: RegExp | string): LodashReplace1x3;
+        (pattern: lodash.__, string: string): LodashReplace1x6;
+        (pattern: RegExp | string, string: string): string;
+    }
+    type LodashReplace1x3 = (string: string) => string;
+    interface LodashReplace1x4 {
+        (pattern: RegExp | string): LodashReplace1x5;
+        (pattern: lodash.__, replacement: lodash.ReplaceFunction | string): LodashReplace1x6;
+        (pattern: RegExp | string, replacement: lodash.ReplaceFunction | string): string;
+    }
+    type LodashReplace1x5 = (replacement: lodash.ReplaceFunction | string) => string;
+    type LodashReplace1x6 = (pattern: RegExp | string) => string;
+    type LodashRest = (func: (...args: any[]) => any) => (...args: any[]) => any;
+    interface LodashRestFrom {
+        (start: number): LodashRestFrom1x1;
+        (start: lodash.__, func: (...args: any[]) => any): LodashRestFrom1x2;
+        (start: number, func: (...args: any[]) => any): (...args: any[]) => any;
+    }
+    type LodashRestFrom1x1 = (func: (...args: any[]) => any) => (...args: any[]) => any;
+    type LodashRestFrom1x2 = (start: number) => (...args: any[]) => any;
+    interface LodashResult {
+        (path: lodash.PropertyPath): LodashResult1x1;
+        (path: lodash.__, object: any): LodashResult1x2;
+        <TResult>(path: lodash.PropertyPath, object: any): TResult;
+    }
+    type LodashResult1x1 = <TResult>(object: any) => TResult;
+    type LodashResult1x2 = <TResult>(path: lodash.PropertyPath) => TResult;
+    type LodashReverse = <TList extends lodash.List<any>>(array: TList) => TList;
+    type LodashRound = (n: number) => number;
+    type LodashRunInContext = (context: object) => lodash.LoDashStatic;
+    interface LodashSample {
+        <T>(collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): T | undefined;
+        <T extends object>(collection: T | null | undefined): T[keyof T] | undefined;
+    }
+    interface LodashSampleSize {
+        (n: number): LodashSampleSize1x1;
+        <T>(n: lodash.__, collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): LodashSampleSize1x2<T>;
+        <T>(n: number, collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): T[];
+        <T extends object>(n: lodash.__, collection: T | null | undefined): LodashSampleSize2x2<T>;
+        <T extends object>(n: number, collection: T | null | undefined): Array<T[keyof T]>;
+    }
+    interface LodashSampleSize1x1 {
+        <T>(collection: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): T[];
+        <T extends object>(collection: T | null | undefined): Array<T[keyof T]>;
+    }
+    type LodashSampleSize1x2<T> = (n: number) => T[];
+    type LodashSampleSize2x2<T> = (n: number) => Array<T[keyof T]>;
+    interface LodashSetWith {
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>): LodashSetWith1x1<T>;
+        (customizer: lodash.__, path: lodash.PropertyPath): LodashSetWith1x2;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, path: lodash.PropertyPath): LodashSetWith1x3<T>;
+        (customizer: lodash.__, path: lodash.__, value: any): LodashSetWith1x4;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, path: lodash.__, value: any): LodashSetWith1x5<T>;
+        (customizer: lodash.__, path: lodash.PropertyPath, value: any): LodashSetWith1x6;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, path: lodash.PropertyPath, value: any): LodashSetWith1x7<T>;
+        <T extends object>(customizer: lodash.__, path: lodash.__, value: lodash.__, object: T): LodashSetWith1x8<T>;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, path: lodash.__, value: lodash.__, object: T): LodashSetWith1x9<T>;
+        <T extends object>(customizer: lodash.__, path: lodash.PropertyPath, value: lodash.__, object: T): LodashSetWith1x10<T>;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, path: lodash.PropertyPath, value: lodash.__, object: T): LodashSetWith1x11<T>;
+        <T extends object>(customizer: lodash.__, path: lodash.__, value: any, object: T): LodashSetWith1x12<T>;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, path: lodash.__, value: any, object: T): LodashSetWith1x13<T>;
+        <T extends object>(customizer: lodash.__, path: lodash.PropertyPath, value: any, object: T): LodashSetWith1x14<T>;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, path: lodash.PropertyPath, value: any, object: T): T;
+    }
+    interface LodashSetWith1x1<T> {
+        (path: lodash.PropertyPath): LodashSetWith1x3<T>;
+        (path: lodash.__, value: any): LodashSetWith1x5<T>;
+        (path: lodash.PropertyPath, value: any): LodashSetWith1x7<T>;
+        (path: lodash.__, value: lodash.__, object: T): LodashSetWith1x9<T>;
+        (path: lodash.PropertyPath, value: lodash.__, object: T): LodashSetWith1x11<T>;
+        (path: lodash.__, value: any, object: T): LodashSetWith1x13<T>;
+        (path: lodash.PropertyPath, value: any, object: T): T;
+    }
+    interface LodashSetWith1x2 {
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>): LodashSetWith1x3<T>;
+        (customizer: lodash.__, value: any): LodashSetWith1x6;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, value: any): LodashSetWith1x7<T>;
+        <T extends object>(customizer: lodash.__, value: lodash.__, object: T): LodashSetWith1x10<T>;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, value: lodash.__, object: T): LodashSetWith1x11<T>;
+        <T extends object>(customizer: lodash.__, value: any, object: T): LodashSetWith1x14<T>;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, value: any, object: T): T;
+    }
+    interface LodashSetWith1x3<T> {
+        (value: any): LodashSetWith1x7<T>;
+        (value: lodash.__, object: T): LodashSetWith1x11<T>;
+        (value: any, object: T): T;
+    }
+    interface LodashSetWith1x4 {
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>): LodashSetWith1x5<T>;
+        (customizer: lodash.__, path: lodash.PropertyPath): LodashSetWith1x6;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, path: lodash.PropertyPath): LodashSetWith1x7<T>;
+        <T extends object>(customizer: lodash.__, path: lodash.__, object: T): LodashSetWith1x12<T>;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, path: lodash.__, object: T): LodashSetWith1x13<T>;
+        <T extends object>(customizer: lodash.__, path: lodash.PropertyPath, object: T): LodashSetWith1x14<T>;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, path: lodash.PropertyPath, object: T): T;
+    }
+    interface LodashSetWith1x5<T> {
+        (path: lodash.PropertyPath): LodashSetWith1x7<T>;
+        (path: lodash.__, object: T): LodashSetWith1x13<T>;
+        (path: lodash.PropertyPath, object: T): T;
+    }
+    interface LodashSetWith1x6 {
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>): LodashSetWith1x7<T>;
+        <T extends object>(customizer: lodash.__, object: T): LodashSetWith1x14<T>;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, object: T): T;
+    }
+    type LodashSetWith1x7<T> = (object: T) => T;
+    interface LodashSetWith1x8<T> {
+        (customizer: lodash.SetWithCustomizer<T>): LodashSetWith1x9<T>;
+        (customizer: lodash.__, path: lodash.PropertyPath): LodashSetWith1x10<T>;
+        (customizer: lodash.SetWithCustomizer<T>, path: lodash.PropertyPath): LodashSetWith1x11<T>;
+        (customizer: lodash.__, path: lodash.__, value: any): LodashSetWith1x12<T>;
+        (customizer: lodash.SetWithCustomizer<T>, path: lodash.__, value: any): LodashSetWith1x13<T>;
+        (customizer: lodash.__, path: lodash.PropertyPath, value: any): LodashSetWith1x14<T>;
+        (customizer: lodash.SetWithCustomizer<T>, path: lodash.PropertyPath, value: any): T;
+    }
+    interface LodashSetWith1x9<T> {
+        (path: lodash.PropertyPath): LodashSetWith1x11<T>;
+        (path: lodash.__, value: any): LodashSetWith1x13<T>;
+        (path: lodash.PropertyPath, value: any): T;
+    }
+    interface LodashSetWith1x10<T> {
+        (customizer: lodash.SetWithCustomizer<T>): LodashSetWith1x11<T>;
+        (customizer: lodash.__, value: any): LodashSetWith1x14<T>;
+        (customizer: lodash.SetWithCustomizer<T>, value: any): T;
+    }
+    type LodashSetWith1x11<T> = (value: any) => T;
+    interface LodashSetWith1x12<T> {
+        (customizer: lodash.SetWithCustomizer<T>): LodashSetWith1x13<T>;
+        (customizer: lodash.__, path: lodash.PropertyPath): LodashSetWith1x14<T>;
+        (customizer: lodash.SetWithCustomizer<T>, path: lodash.PropertyPath): T;
+    }
+    type LodashSetWith1x13<T> = (path: lodash.PropertyPath) => T;
+    type LodashSetWith1x14<T> = (customizer: lodash.SetWithCustomizer<T>) => T;
+    interface LodashShuffle {
+        <T>(collection: lodash.List<T> | null | undefined): T[];
+        <T extends object>(collection: T | null | undefined): Array<T[keyof T]>;
+    }
+    type LodashSize = (collection: object | string | null | undefined) => number;
+    interface LodashSlice {
+        (start: number): LodashSlice1x1;
+        (start: lodash.__, end: number): LodashSlice1x2;
+        (start: number, end: number): LodashSlice1x3;
+        <T>(start: lodash.__, end: lodash.__, array: lodash.List<T> | null | undefined): LodashSlice1x4<T>;
+        <T>(start: number, end: lodash.__, array: lodash.List<T> | null | undefined): LodashSlice1x5<T>;
+        <T>(start: lodash.__, end: number, array: lodash.List<T> | null | undefined): LodashSlice1x6<T>;
+        <T>(start: number, end: number, array: lodash.List<T> | null | undefined): T[];
+    }
+    interface LodashSlice1x1 {
+        (end: number): LodashSlice1x3;
+        <T>(end: lodash.__, array: lodash.List<T> | null | undefined): LodashSlice1x5<T>;
+        <T>(end: number, array: lodash.List<T> | null | undefined): T[];
+    }
+    interface LodashSlice1x2 {
+        (start: number): LodashSlice1x3;
+        <T>(start: lodash.__, array: lodash.List<T> | null | undefined): LodashSlice1x6<T>;
+        <T>(start: number, array: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashSlice1x3 = <T>(array: lodash.List<T> | null | undefined) => T[];
+    interface LodashSlice1x4<T> {
+        (start: number): LodashSlice1x5<T>;
+        (start: lodash.__, end: number): LodashSlice1x6<T>;
+        (start: number, end: number): T[];
+    }
+    type LodashSlice1x5<T> = (end: number) => T[];
+    type LodashSlice1x6<T> = (start: number) => T[];
+    type LodashSnakeCase = (string: string) => string;
+    interface LodashSortBy {
+        <T>(iteratees: lodash.Many<lodash.ValueIteratee<T>>): LodashSortBy1x1<T>;
+        <T>(iteratees: lodash.__, collection: lodash.List<T> | null | undefined): LodashSortBy1x2<T>;
+        <T>(iteratees: lodash.Many<lodash.ValueIteratee<T>>, collection: lodash.List<T> | null | undefined): T[];
+        <T extends object>(iteratees: lodash.__, collection: T | null | undefined): LodashSortBy2x2<T>;
+        <T extends object>(iteratees: lodash.Many<lodash.ValueIteratee<T[keyof T]>>, collection: T | null | undefined): Array<T[keyof T]>;
+    }
+    type LodashSortBy1x1<T> = (collection: lodash.List<T> | object | null | undefined) => T[];
+    type LodashSortBy1x2<T> = (iteratees: lodash.Many<lodash.ValueIteratee<T>>) => T[];
+    type LodashSortBy2x2<T> = (iteratees: lodash.Many<lodash.ValueIteratee<T[keyof T]>>) => Array<T[keyof T]>;
+    interface LodashSortedIndex {
+        <T>(value: T): LodashSortedIndex1x1<T>;
+        <T>(value: lodash.__, array: lodash.List<T> | null | undefined): LodashSortedIndex1x2<T>;
+        <T>(value: T, array: lodash.List<T> | null | undefined): number;
+    }
+    type LodashSortedIndex1x1<T> = (array: lodash.List<T> | null | undefined) => number;
+    type LodashSortedIndex1x2<T> = (value: T) => number;
+    interface LodashSortedIndexBy {
+        <T>(iteratee: lodash.ValueIteratee<T>): LodashSortedIndexBy1x1<T>;
+        <T>(iteratee: lodash.__, value: T): LodashSortedIndexBy1x2<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, value: T): LodashSortedIndexBy1x3<T>;
+        <T>(iteratee: lodash.__, value: lodash.__, array: lodash.List<T> | null | undefined): LodashSortedIndexBy1x4<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, value: lodash.__, array: lodash.List<T> | null | undefined): LodashSortedIndexBy1x5<T>;
+        <T>(iteratee: lodash.__, value: T, array: lodash.List<T> | null | undefined): LodashSortedIndexBy1x6<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, value: T, array: lodash.List<T> | null | undefined): number;
+    }
+    interface LodashSortedIndexBy1x1<T> {
+        (value: T): LodashSortedIndexBy1x3<T>;
+        (value: lodash.__, array: lodash.List<T> | null | undefined): LodashSortedIndexBy1x5<T>;
+        (value: T, array: lodash.List<T> | null | undefined): number;
+    }
+    interface LodashSortedIndexBy1x2<T> {
+        (iteratee: lodash.ValueIteratee<T>): LodashSortedIndexBy1x3<T>;
+        (iteratee: lodash.__, array: lodash.List<T> | null | undefined): LodashSortedIndexBy1x6<T>;
+        (iteratee: lodash.ValueIteratee<T>, array: lodash.List<T> | null | undefined): number;
+    }
+    type LodashSortedIndexBy1x3<T> = (array: lodash.List<T> | null | undefined) => number;
+    interface LodashSortedIndexBy1x4<T> {
+        (iteratee: lodash.ValueIteratee<T>): LodashSortedIndexBy1x5<T>;
+        (iteratee: lodash.__, value: T): LodashSortedIndexBy1x6<T>;
+        (iteratee: lodash.ValueIteratee<T>, value: T): number;
+    }
+    type LodashSortedIndexBy1x5<T> = (value: T) => number;
+    type LodashSortedIndexBy1x6<T> = (iteratee: lodash.ValueIteratee<T>) => number;
+    interface LodashSortedIndexOf {
+        <T>(value: T): LodashSortedIndexOf1x1<T>;
+        <T>(value: lodash.__, array: lodash.List<T> | null | undefined): LodashSortedIndexOf1x2<T>;
+        <T>(value: T, array: lodash.List<T> | null | undefined): number;
+    }
+    type LodashSortedIndexOf1x1<T> = (array: lodash.List<T> | null | undefined) => number;
+    type LodashSortedIndexOf1x2<T> = (value: T) => number;
+    interface LodashSortedLastIndex {
+        <T>(value: T): LodashSortedLastIndex1x1<T>;
+        <T>(value: lodash.__, array: lodash.List<T> | null | undefined): LodashSortedLastIndex1x2<T>;
+        <T>(value: T, array: lodash.List<T> | null | undefined): number;
+    }
+    type LodashSortedLastIndex1x1<T> = (array: lodash.List<T> | null | undefined) => number;
+    type LodashSortedLastIndex1x2<T> = (value: T) => number;
+    interface LodashSortedLastIndexBy {
+        <T>(iteratee: lodash.ValueIteratee<T>): LodashSortedLastIndexBy1x1<T>;
+        <T>(iteratee: lodash.__, value: T): LodashSortedLastIndexBy1x2<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, value: T): LodashSortedLastIndexBy1x3<T>;
+        <T>(iteratee: lodash.__, value: lodash.__, array: lodash.List<T> | null | undefined): LodashSortedLastIndexBy1x4<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, value: lodash.__, array: lodash.List<T> | null | undefined): LodashSortedLastIndexBy1x5<T>;
+        <T>(iteratee: lodash.__, value: T, array: lodash.List<T> | null | undefined): LodashSortedLastIndexBy1x6<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, value: T, array: lodash.List<T> | null | undefined): number;
+    }
+    interface LodashSortedLastIndexBy1x1<T> {
+        (value: T): LodashSortedLastIndexBy1x3<T>;
+        (value: lodash.__, array: lodash.List<T> | null | undefined): LodashSortedLastIndexBy1x5<T>;
+        (value: T, array: lodash.List<T> | null | undefined): number;
+    }
+    interface LodashSortedLastIndexBy1x2<T> {
+        (iteratee: lodash.ValueIteratee<T>): LodashSortedLastIndexBy1x3<T>;
+        (iteratee: lodash.__, array: lodash.List<T> | null | undefined): LodashSortedLastIndexBy1x6<T>;
+        (iteratee: lodash.ValueIteratee<T>, array: lodash.List<T> | null | undefined): number;
+    }
+    type LodashSortedLastIndexBy1x3<T> = (array: lodash.List<T> | null | undefined) => number;
+    interface LodashSortedLastIndexBy1x4<T> {
+        (iteratee: lodash.ValueIteratee<T>): LodashSortedLastIndexBy1x5<T>;
+        (iteratee: lodash.__, value: T): LodashSortedLastIndexBy1x6<T>;
+        (iteratee: lodash.ValueIteratee<T>, value: T): number;
+    }
+    type LodashSortedLastIndexBy1x5<T> = (value: T) => number;
+    type LodashSortedLastIndexBy1x6<T> = (iteratee: lodash.ValueIteratee<T>) => number;
+    interface LodashSortedLastIndexOf {
+        <T>(value: T): LodashSortedLastIndexOf1x1<T>;
+        <T>(value: lodash.__, array: lodash.List<T> | null | undefined): LodashSortedLastIndexOf1x2<T>;
+        <T>(value: T, array: lodash.List<T> | null | undefined): number;
+    }
+    type LodashSortedLastIndexOf1x1<T> = (array: lodash.List<T> | null | undefined) => number;
+    type LodashSortedLastIndexOf1x2<T> = (value: T) => number;
+    type LodashSortedUniq = <T>(array: lodash.List<T> | null | undefined) => T[];
+    interface LodashSortedUniqBy {
+        <T>(iteratee: lodash.ValueIteratee<T>): LodashSortedUniqBy1x1<T>;
+        <T>(iteratee: lodash.__, array: lodash.List<T> | null | undefined): LodashSortedUniqBy1x2<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, array: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashSortedUniqBy1x1<T> = (array: lodash.List<T> | null | undefined) => T[];
+    type LodashSortedUniqBy1x2<T> = (iteratee: lodash.ValueIteratee<T>) => T[];
+    interface LodashSplit {
+        (separator: RegExp|string): LodashSplit1x1;
+        (separator: lodash.__, string: string): LodashSplit1x2;
+        (separator: RegExp|string, string: string): string[];
+    }
+    type LodashSplit1x1 = (string: string) => string[];
+    type LodashSplit1x2 = (separator: RegExp|string) => string[];
+    type LodashSpread = <TResult>(func: (...args: any[]) => TResult) => (...args: any[]) => TResult;
+    interface LodashSpreadFrom {
+        (start: number): LodashSpreadFrom1x1;
+        <TResult>(start: lodash.__, func: (...args: any[]) => TResult): LodashSpreadFrom1x2<TResult>;
+        <TResult>(start: number, func: (...args: any[]) => TResult): (...args: any[]) => TResult;
+    }
+    type LodashSpreadFrom1x1 = <TResult>(func: (...args: any[]) => TResult) => (...args: any[]) => TResult;
+    type LodashSpreadFrom1x2<TResult> = (start: number) => (...args: any[]) => TResult;
+    type LodashStartCase = (string: string) => string;
+    interface LodashStartsWith {
+        (target: string): LodashStartsWith1x1;
+        (target: lodash.__, string: string): LodashStartsWith1x2;
+        (target: string, string: string): boolean;
+    }
+    type LodashStartsWith1x1 = (string: string) => boolean;
+    type LodashStartsWith1x2 = (target: string) => boolean;
+    type LodashStubArray = () => any[];
+    type LodashStubObject = () => any;
+    type LodashStubString = () => string;
+    type LodashStubTrue = () => true;
+    interface LodashSubtract {
+        (minuend: number): LodashSubtract1x1;
+        (minuend: lodash.__, subtrahend: number): LodashSubtract1x2;
+        (minuend: number, subtrahend: number): number;
+    }
+    type LodashSubtract1x1 = (subtrahend: number) => number;
+    type LodashSubtract1x2 = (minuend: number) => number;
+    type LodashSum = (collection: lodash.List<any> | null | undefined) => number;
+    interface LodashSumBy {
+        <T>(iteratee: ((value: T) => number) | string): LodashSumBy1x1<T>;
+        <T>(iteratee: lodash.__, collection: lodash.List<T> | null | undefined): LodashSumBy1x2<T>;
+        <T>(iteratee: ((value: T) => number) | string, collection: lodash.List<T> | null | undefined): number;
+    }
+    type LodashSumBy1x1<T> = (collection: lodash.List<T> | null | undefined) => number;
+    type LodashSumBy1x2<T> = (iteratee: ((value: T) => number) | string) => number;
+    interface LodashXor {
+        <T>(arrays2: lodash.List<T> | null | undefined): LodashXor1x1<T>;
+        <T>(arrays2: lodash.__, arrays: lodash.List<T> | null | undefined): LodashXor1x2<T>;
+        <T>(arrays2: lodash.List<T> | null | undefined, arrays: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashXor1x1<T> = (arrays: lodash.List<T> | null | undefined) => T[];
+    type LodashXor1x2<T> = (arrays2: lodash.List<T> | null | undefined) => T[];
+    interface LodashXorBy {
+        <T>(iteratee: lodash.ValueIteratee<T>): LodashXorBy1x1<T>;
+        <T>(iteratee: lodash.__, arrays: lodash.List<T> | null | undefined): LodashXorBy1x2<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, arrays: lodash.List<T> | null | undefined): LodashXorBy1x3<T>;
+        <T>(iteratee: lodash.__, arrays: lodash.__, arrays2: lodash.List<T> | null | undefined): LodashXorBy1x4<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, arrays: lodash.__, arrays2: lodash.List<T> | null | undefined): LodashXorBy1x5<T>;
+        <T>(iteratee: lodash.__, arrays: lodash.List<T> | null | undefined, arrays2: lodash.List<T> | null | undefined): LodashXorBy1x6<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, arrays: lodash.List<T> | null | undefined, arrays2: lodash.List<T> | null | undefined): T[];
+    }
+    interface LodashXorBy1x1<T> {
+        (arrays: lodash.List<T> | null | undefined): LodashXorBy1x3<T>;
+        (arrays: lodash.__, arrays2: lodash.List<T> | null | undefined): LodashXorBy1x5<T>;
+        (arrays: lodash.List<T> | null | undefined, arrays2: lodash.List<T> | null | undefined): T[];
+    }
+    interface LodashXorBy1x2<T> {
+        (iteratee: lodash.ValueIteratee<T>): LodashXorBy1x3<T>;
+        (iteratee: lodash.__, arrays2: lodash.List<T> | null | undefined): LodashXorBy1x6<T>;
+        (iteratee: lodash.ValueIteratee<T>, arrays2: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashXorBy1x3<T> = (arrays2: lodash.List<T> | null | undefined) => T[];
+    interface LodashXorBy1x4<T> {
+        (iteratee: lodash.ValueIteratee<T>): LodashXorBy1x5<T>;
+        (iteratee: lodash.__, arrays: lodash.List<T> | null | undefined): LodashXorBy1x6<T>;
+        (iteratee: lodash.ValueIteratee<T>, arrays: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashXorBy1x5<T> = (arrays: lodash.List<T> | null | undefined) => T[];
+    type LodashXorBy1x6<T> = (iteratee: lodash.ValueIteratee<T>) => T[];
+    interface LodashXorWith {
+        <T>(comparator: lodash.Comparator<T>): LodashXorWith1x1<T>;
+        <T>(comparator: lodash.__, arrays: lodash.List<T> | null | undefined): LodashXorWith1x2<T>;
+        <T>(comparator: lodash.Comparator<T>, arrays: lodash.List<T> | null | undefined): LodashXorWith1x3<T>;
+        <T>(comparator: lodash.__, arrays: lodash.__, arrays2: lodash.List<T> | null | undefined): LodashXorWith1x4<T>;
+        <T>(comparator: lodash.Comparator<T>, arrays: lodash.__, arrays2: lodash.List<T> | null | undefined): LodashXorWith1x5<T>;
+        <T>(comparator: lodash.__, arrays: lodash.List<T> | null | undefined, arrays2: lodash.List<T> | null | undefined): LodashXorWith1x6<T>;
+        <T>(comparator: lodash.Comparator<T>, arrays: lodash.List<T> | null | undefined, arrays2: lodash.List<T> | null | undefined): T[];
+    }
+    interface LodashXorWith1x1<T> {
+        (arrays: lodash.List<T> | null | undefined): LodashXorWith1x3<T>;
+        (arrays: lodash.__, arrays2: lodash.List<T> | null | undefined): LodashXorWith1x5<T>;
+        (arrays: lodash.List<T> | null | undefined, arrays2: lodash.List<T> | null | undefined): T[];
+    }
+    interface LodashXorWith1x2<T> {
+        (comparator: lodash.Comparator<T>): LodashXorWith1x3<T>;
+        (comparator: lodash.__, arrays2: lodash.List<T> | null | undefined): LodashXorWith1x6<T>;
+        (comparator: lodash.Comparator<T>, arrays2: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashXorWith1x3<T> = (arrays2: lodash.List<T> | null | undefined) => T[];
+    interface LodashXorWith1x4<T> {
+        (comparator: lodash.Comparator<T>): LodashXorWith1x5<T>;
+        (comparator: lodash.__, arrays: lodash.List<T> | null | undefined): LodashXorWith1x6<T>;
+        (comparator: lodash.Comparator<T>, arrays: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashXorWith1x5<T> = (arrays: lodash.List<T> | null | undefined) => T[];
+    type LodashXorWith1x6<T> = (comparator: lodash.Comparator<T>) => T[];
+    type LodashTail = <T>(array: lodash.List<T> | null | undefined) => T[];
+    interface LodashTake {
+        (n: number): LodashTake1x1;
+        <T>(n: lodash.__, array: lodash.List<T> | null | undefined): LodashTake1x2<T>;
+        <T>(n: number, array: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashTake1x1 = <T>(array: lodash.List<T> | null | undefined) => T[];
+    type LodashTake1x2<T> = (n: number) => T[];
+    interface LodashTakeRight {
+        (n: number): LodashTakeRight1x1;
+        <T>(n: lodash.__, array: lodash.List<T> | null | undefined): LodashTakeRight1x2<T>;
+        <T>(n: number, array: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashTakeRight1x1 = <T>(array: lodash.List<T> | null | undefined) => T[];
+    type LodashTakeRight1x2<T> = (n: number) => T[];
+    interface LodashTakeRightWhile {
+        <T>(predicate: lodash.ValueIteratee<T>): LodashTakeRightWhile1x1<T>;
+        <T>(predicate: lodash.__, array: lodash.List<T> | null | undefined): LodashTakeRightWhile1x2<T>;
+        <T>(predicate: lodash.ValueIteratee<T>, array: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashTakeRightWhile1x1<T> = (array: lodash.List<T> | null | undefined) => T[];
+    type LodashTakeRightWhile1x2<T> = (predicate: lodash.ValueIteratee<T>) => T[];
+    interface LodashTakeWhile {
+        <T>(predicate: lodash.ValueIteratee<T>): LodashTakeWhile1x1<T>;
+        <T>(predicate: lodash.__, array: lodash.List<T> | null | undefined): LodashTakeWhile1x2<T>;
+        <T>(predicate: lodash.ValueIteratee<T>, array: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashTakeWhile1x1<T> = (array: lodash.List<T> | null | undefined) => T[];
+    type LodashTakeWhile1x2<T> = (predicate: lodash.ValueIteratee<T>) => T[];
+    interface LodashTap {
+        <T>(interceptor: (value: T) => void): LodashTap1x1<T>;
+        <T>(interceptor: lodash.__, value: T): LodashTap1x2<T>;
+        <T>(interceptor: (value: T) => void, value: T): T;
+    }
+    type LodashTap1x1<T> = (value: T) => T;
+    type LodashTap1x2<T> = (interceptor: (value: T) => void) => T;
+    type LodashTemplate = (string: string) => lodash.TemplateExecutor;
+    interface LodashThrottle {
+        (wait: number): LodashThrottle1x1;
+        <T extends (...args: any[]) => any>(wait: lodash.__, func: T): LodashThrottle1x2<T>;
+        <T extends (...args: any[]) => any>(wait: number, func: T): T & lodash.Cancelable;
+    }
+    type LodashThrottle1x1 = <T extends (...args: any[]) => any>(func: T) => T & lodash.Cancelable;
+    type LodashThrottle1x2<T> = (wait: number) => T & lodash.Cancelable;
+    interface LodashThru {
+        <T, TResult>(interceptor: (value: T) => TResult): LodashThru1x1<T, TResult>;
+        <T>(interceptor: lodash.__, value: T): LodashThru1x2<T>;
+        <T, TResult>(interceptor: (value: T) => TResult, value: T): TResult;
+    }
+    type LodashThru1x1<T, TResult> = (value: T) => TResult;
+    type LodashThru1x2<T> = <TResult>(interceptor: (value: T) => TResult) => TResult;
+    interface LodashTimes {
+        <TResult>(iteratee: (num: number) => TResult): LodashTimes1x1<TResult>;
+        (iteratee: lodash.__, n: number): LodashTimes1x2;
+        <TResult>(iteratee: (num: number) => TResult, n: number): TResult[];
+    }
+    type LodashTimes1x1<TResult> = (n: number) => TResult[];
+    type LodashTimes1x2 = <TResult>(iteratee: (num: number) => TResult) => TResult[];
+    interface LodashToArray {
+        <T>(value: lodash.List<T> | lodash.Dictionary<T> | lodash.NumericDictionary<T> | null | undefined): T[];
+        <T>(value: T): Array<T[keyof T]>;
+        (): any[];
+    }
+    type LodashToFinite = (value: any) => number;
+    type LodashToInteger = (value: any) => number;
+    type LodashToLength = (value: any) => number;
+    type LodashToLower = (string: string) => string;
+    type LodashToNumber = (value: any) => number;
+    type LodashToPath = (value: any) => string[];
+    type LodashToPlainObject = (value: any) => any;
+    type LodashToSafeInteger = (value: any) => number;
+    type LodashToString = (value: any) => string;
+    type LodashToUpper = (string: string) => string;
+    interface LodashTransform {
+        <T, TResult>(iteratee: lodash.MemoVoidIteratorCapped<T, TResult[]>): LodashTransform1x1<T, TResult>;
+        <TResult>(iteratee: lodash.__, accumulator: ReadonlyArray<TResult>): LodashTransform1x2<TResult>;
+        <T, TResult>(iteratee: lodash.MemoVoidIteratorCapped<T, TResult[]>, accumulator: ReadonlyArray<TResult>): LodashTransform1x3<T, TResult>;
+        <T>(iteratee: lodash.__, accumulator: lodash.__, object: ReadonlyArray<T>): LodashTransform1x4<T>;
+        <T, TResult>(iteratee: lodash.MemoVoidIteratorCapped<T, TResult[]>, accumulator: lodash.__, object: ReadonlyArray<T>): LodashTransform1x5<TResult>;
+        <T, TResult>(iteratee: lodash.__, accumulator: ReadonlyArray<TResult>, object: ReadonlyArray<T>): LodashTransform1x6<T, TResult>;
+        <T, TResult>(iteratee: lodash.MemoVoidIteratorCapped<T, TResult[]>, accumulator: ReadonlyArray<TResult>, object: ReadonlyArray<T> | lodash.Dictionary<T>): TResult[];
+        <T, TResult>(iteratee: lodash.MemoVoidIteratorCapped<T, lodash.Dictionary<TResult>>): LodashTransform2x1<T, TResult>;
+        <TResult>(iteratee: lodash.__, accumulator: lodash.Dictionary<TResult>): LodashTransform2x2<TResult>;
+        <T, TResult>(iteratee: lodash.MemoVoidIteratorCapped<T, lodash.Dictionary<TResult>>, accumulator: lodash.Dictionary<TResult>): LodashTransform2x3<T, TResult>;
+        <T, TResult>(iteratee: lodash.MemoVoidIteratorCapped<T, lodash.Dictionary<TResult>>, accumulator: lodash.__, object: ReadonlyArray<T>): LodashTransform2x5<TResult>;
+        <T, TResult>(iteratee: lodash.__, accumulator: lodash.Dictionary<TResult>, object: ReadonlyArray<T>): LodashTransform2x6<T, TResult>;
+        <T, TResult>(iteratee: lodash.MemoVoidIteratorCapped<T, lodash.Dictionary<TResult>>, accumulator: lodash.Dictionary<TResult>, object: ReadonlyArray<T> | lodash.Dictionary<T>): lodash.Dictionary<TResult>;
+        <T>(iteratee: lodash.__, accumulator: lodash.__, object: lodash.Dictionary<T>): LodashTransform3x4<T>;
+        <T, TResult>(iteratee: lodash.MemoVoidIteratorCapped<T, lodash.Dictionary<TResult>>, accumulator: lodash.__, object: lodash.Dictionary<T>): LodashTransform3x5<TResult>;
+        <T, TResult>(iteratee: lodash.__, accumulator: lodash.Dictionary<TResult>, object: lodash.Dictionary<T>): LodashTransform3x6<T, TResult>;
+        <T, TResult>(iteratee: lodash.MemoVoidIteratorCapped<T, TResult[]>, accumulator: lodash.__, object: lodash.Dictionary<T>): LodashTransform4x5<TResult>;
+        <T, TResult>(iteratee: lodash.__, accumulator: ReadonlyArray<TResult>, object: lodash.Dictionary<T>): LodashTransform4x6<T, TResult>;
+    }
+    interface LodashTransform1x1<T, TResult> {
+        (accumulator: ReadonlyArray<TResult>): LodashTransform1x3<T, TResult>;
+        (accumulator: lodash.__, object: ReadonlyArray<T>): LodashTransform1x5<TResult>;
+        (accumulator: ReadonlyArray<TResult>, object: ReadonlyArray<T> | lodash.Dictionary<T>): TResult[];
+        (accumulator: lodash.__, object: lodash.Dictionary<T>): LodashTransform4x5<TResult>;
+    }
+    interface LodashTransform1x2<TResult> {
+        <T>(iteratee: lodash.MemoVoidIteratorCapped<T, TResult[]>): LodashTransform1x3<T, TResult>;
+        <T>(iteratee: lodash.__, object: ReadonlyArray<T>): LodashTransform1x6<T, TResult>;
+        <T>(iteratee: lodash.MemoVoidIteratorCapped<T, TResult[]>, object: ReadonlyArray<T> | lodash.Dictionary<T>): TResult[];
+        <T>(iteratee: lodash.__, object: lodash.Dictionary<T>): LodashTransform4x6<T, TResult>;
+    }
+    type LodashTransform1x3<T, TResult> = (object: ReadonlyArray<T> | lodash.Dictionary<T>) => TResult[];
+    interface LodashTransform1x4<T> {
+        <TResult>(iteratee: lodash.MemoVoidIteratorCapped<T, TResult[]>): LodashTransform1x5<TResult>;
+        <TResult>(iteratee: lodash.__, accumulator: ReadonlyArray<TResult>): LodashTransform1x6<T, TResult>;
+        <TResult>(iteratee: lodash.MemoVoidIteratorCapped<T, TResult[]>, accumulator: ReadonlyArray<TResult>): TResult[];
+        <TResult>(iteratee: lodash.MemoVoidIteratorCapped<T, lodash.Dictionary<TResult>>): LodashTransform2x5<TResult>;
+        <TResult>(iteratee: lodash.__, accumulator: lodash.Dictionary<TResult>): LodashTransform2x6<T, TResult>;
+        <TResult>(iteratee: lodash.MemoVoidIteratorCapped<T, lodash.Dictionary<TResult>>, accumulator: lodash.Dictionary<TResult>): lodash.Dictionary<TResult>;
+    }
+    type LodashTransform1x5<TResult> = (accumulator: ReadonlyArray<TResult>) => TResult[];
+    type LodashTransform1x6<T, TResult> = (iteratee: lodash.MemoVoidIteratorCapped<T, TResult[]>) => TResult[];
+    interface LodashTransform2x1<T, TResult> {
+        (accumulator: lodash.Dictionary<TResult>): LodashTransform2x3<T, TResult>;
+        (accumulator: lodash.__, object: ReadonlyArray<T>): LodashTransform2x5<TResult>;
+        (accumulator: lodash.Dictionary<TResult>, object: ReadonlyArray<T> | lodash.Dictionary<T>): lodash.Dictionary<TResult>;
+        (accumulator: lodash.__, object: lodash.Dictionary<T>): LodashTransform3x5<TResult>;
+    }
+    interface LodashTransform2x2<TResult> {
+        <T>(iteratee: lodash.MemoVoidIteratorCapped<T, lodash.Dictionary<TResult>>): LodashTransform2x3<T, TResult>;
+        <T>(iteratee: lodash.__, object: ReadonlyArray<T>): LodashTransform2x6<T, TResult>;
+        <T>(iteratee: lodash.MemoVoidIteratorCapped<T, lodash.Dictionary<TResult>>, object: ReadonlyArray<T> | lodash.Dictionary<T>): lodash.Dictionary<TResult>;
+        <T>(iteratee: lodash.__, object: lodash.Dictionary<T>): LodashTransform3x6<T, TResult>;
+    }
+    type LodashTransform2x3<T, TResult> = (object: ReadonlyArray<T> | lodash.Dictionary<T>) => lodash.Dictionary<TResult>;
+    type LodashTransform2x5<TResult> = (accumulator: lodash.Dictionary<TResult>) => lodash.Dictionary<TResult>;
+    type LodashTransform2x6<T, TResult> = (iteratee: lodash.MemoVoidIteratorCapped<T, lodash.Dictionary<TResult>>) => lodash.Dictionary<TResult>;
+    interface LodashTransform3x4<T> {
+        <TResult>(iteratee: lodash.MemoVoidIteratorCapped<T, lodash.Dictionary<TResult>>): LodashTransform3x5<TResult>;
+        <TResult>(iteratee: lodash.__, accumulator: lodash.Dictionary<TResult>): LodashTransform3x6<T, TResult>;
+        <TResult>(iteratee: lodash.MemoVoidIteratorCapped<T, lodash.Dictionary<TResult>>, accumulator: lodash.Dictionary<TResult>): lodash.Dictionary<TResult>;
+        <TResult>(iteratee: lodash.MemoVoidIteratorCapped<T, TResult[]>): LodashTransform4x5<TResult>;
+        <TResult>(iteratee: lodash.__, accumulator: ReadonlyArray<TResult>): LodashTransform4x6<T, TResult>;
+        <TResult>(iteratee: lodash.MemoVoidIteratorCapped<T, TResult[]>, accumulator: ReadonlyArray<TResult>): TResult[];
+    }
+    type LodashTransform3x5<TResult> = (accumulator: lodash.Dictionary<TResult>) => lodash.Dictionary<TResult>;
+    type LodashTransform3x6<T, TResult> = (iteratee: lodash.MemoVoidIteratorCapped<T, lodash.Dictionary<TResult>>) => lodash.Dictionary<TResult>;
+    type LodashTransform4x5<TResult> = (accumulator: ReadonlyArray<TResult>) => TResult[];
+    type LodashTransform4x6<T, TResult> = (iteratee: lodash.MemoVoidIteratorCapped<T, TResult[]>) => TResult[];
+    type LodashTrim = (string: string) => string;
+    interface LodashTrimChars {
+        (chars: string): LodashTrimChars1x1;
+        (chars: lodash.__, string: string): LodashTrimChars1x2;
+        (chars: string, string: string): string;
+    }
+    type LodashTrimChars1x1 = (string: string) => string;
+    type LodashTrimChars1x2 = (chars: string) => string;
+    interface LodashTrimCharsEnd {
+        (chars: string): LodashTrimCharsEnd1x1;
+        (chars: lodash.__, string: string): LodashTrimCharsEnd1x2;
+        (chars: string, string: string): string;
+    }
+    type LodashTrimCharsEnd1x1 = (string: string) => string;
+    type LodashTrimCharsEnd1x2 = (chars: string) => string;
+    interface LodashTrimCharsStart {
+        (chars: string): LodashTrimCharsStart1x1;
+        (chars: lodash.__, string: string): LodashTrimCharsStart1x2;
+        (chars: string, string: string): string;
+    }
+    type LodashTrimCharsStart1x1 = (string: string) => string;
+    type LodashTrimCharsStart1x2 = (chars: string) => string;
+    type LodashTrimEnd = (string: string) => string;
+    type LodashTrimStart = (string: string) => string;
+    interface LodashTruncate {
+        (options: lodash.TruncateOptions): LodashTruncate1x1;
+        (options: lodash.__, string: string): LodashTruncate1x2;
+        (options: lodash.TruncateOptions, string: string): string;
+    }
+    type LodashTruncate1x1 = (string: string) => string;
+    type LodashTruncate1x2 = (options: lodash.TruncateOptions) => string;
+    type LodashUnapply = (func: (...args: any[]) => any) => (...args: any[]) => any;
+    type LodashUnary = <T, TResult>(func: (arg1: T, ...args: any[]) => TResult) => (arg1: T) => TResult;
+    type LodashUnescape = (string: string) => string;
+    interface LodashUnion {
+        <T>(arrays2: lodash.List<T> | null | undefined): LodashUnion1x1<T>;
+        <T>(arrays2: lodash.__, arrays: lodash.List<T> | null | undefined): LodashUnion1x2<T>;
+        <T>(arrays2: lodash.List<T> | null | undefined, arrays: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashUnion1x1<T> = (arrays: lodash.List<T> | null | undefined) => T[];
+    type LodashUnion1x2<T> = (arrays2: lodash.List<T> | null | undefined) => T[];
+    interface LodashUnionBy {
+        <T>(iteratee: lodash.ValueIteratee<T>): LodashUnionBy1x1<T>;
+        <T>(iteratee: lodash.__, arrays1: lodash.List<T> | null | undefined): LodashUnionBy1x2<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, arrays1: lodash.List<T> | null | undefined): LodashUnionBy1x3<T>;
+        <T>(iteratee: lodash.__, arrays1: lodash.__, arrays2: lodash.List<T> | null | undefined): LodashUnionBy1x4<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, arrays1: lodash.__, arrays2: lodash.List<T> | null | undefined): LodashUnionBy1x5<T>;
+        <T>(iteratee: lodash.__, arrays1: lodash.List<T> | null | undefined, arrays2: lodash.List<T> | null | undefined): LodashUnionBy1x6<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, arrays1: lodash.List<T> | null | undefined, arrays2: lodash.List<T> | null | undefined): T[];
+    }
+    interface LodashUnionBy1x1<T> {
+        (arrays1: lodash.List<T> | null | undefined): LodashUnionBy1x3<T>;
+        (arrays1: lodash.__, arrays2: lodash.List<T> | null | undefined): LodashUnionBy1x5<T>;
+        (arrays1: lodash.List<T> | null | undefined, arrays2: lodash.List<T> | null | undefined): T[];
+    }
+    interface LodashUnionBy1x2<T> {
+        (iteratee: lodash.ValueIteratee<T>): LodashUnionBy1x3<T>;
+        (iteratee: lodash.__, arrays2: lodash.List<T> | null | undefined): LodashUnionBy1x6<T>;
+        (iteratee: lodash.ValueIteratee<T>, arrays2: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashUnionBy1x3<T> = (arrays2: lodash.List<T> | null | undefined) => T[];
+    interface LodashUnionBy1x4<T> {
+        (iteratee: lodash.ValueIteratee<T>): LodashUnionBy1x5<T>;
+        (iteratee: lodash.__, arrays1: lodash.List<T> | null | undefined): LodashUnionBy1x6<T>;
+        (iteratee: lodash.ValueIteratee<T>, arrays1: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashUnionBy1x5<T> = (arrays1: lodash.List<T> | null | undefined) => T[];
+    type LodashUnionBy1x6<T> = (iteratee: lodash.ValueIteratee<T>) => T[];
+    interface LodashUnionWith {
+        <T>(comparator: lodash.Comparator<T>): LodashUnionWith1x1<T>;
+        <T>(comparator: lodash.__, arrays: lodash.List<T> | null | undefined): LodashUnionWith1x2<T>;
+        <T>(comparator: lodash.Comparator<T>, arrays: lodash.List<T> | null | undefined): LodashUnionWith1x3<T>;
+        <T>(comparator: lodash.__, arrays: lodash.__, arrays2: lodash.List<T> | null | undefined): LodashUnionWith1x4<T>;
+        <T>(comparator: lodash.Comparator<T>, arrays: lodash.__, arrays2: lodash.List<T> | null | undefined): LodashUnionWith1x5<T>;
+        <T>(comparator: lodash.__, arrays: lodash.List<T> | null | undefined, arrays2: lodash.List<T> | null | undefined): LodashUnionWith1x6<T>;
+        <T>(comparator: lodash.Comparator<T>, arrays: lodash.List<T> | null | undefined, arrays2: lodash.List<T> | null | undefined): T[];
+    }
+    interface LodashUnionWith1x1<T> {
+        (arrays: lodash.List<T> | null | undefined): LodashUnionWith1x3<T>;
+        (arrays: lodash.__, arrays2: lodash.List<T> | null | undefined): LodashUnionWith1x5<T>;
+        (arrays: lodash.List<T> | null | undefined, arrays2: lodash.List<T> | null | undefined): T[];
+    }
+    interface LodashUnionWith1x2<T> {
+        (comparator: lodash.Comparator<T>): LodashUnionWith1x3<T>;
+        (comparator: lodash.__, arrays2: lodash.List<T> | null | undefined): LodashUnionWith1x6<T>;
+        (comparator: lodash.Comparator<T>, arrays2: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashUnionWith1x3<T> = (arrays2: lodash.List<T> | null | undefined) => T[];
+    interface LodashUnionWith1x4<T> {
+        (comparator: lodash.Comparator<T>): LodashUnionWith1x5<T>;
+        (comparator: lodash.__, arrays: lodash.List<T> | null | undefined): LodashUnionWith1x6<T>;
+        (comparator: lodash.Comparator<T>, arrays: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashUnionWith1x5<T> = (arrays: lodash.List<T> | null | undefined) => T[];
+    type LodashUnionWith1x6<T> = (comparator: lodash.Comparator<T>) => T[];
+    type LodashUniq = <T>(array: lodash.List<T> | null | undefined) => T[];
+    interface LodashUniqBy {
+        <T>(iteratee: lodash.ValueIteratee<T>): LodashUniqBy1x1<T>;
+        <T>(iteratee: lodash.__, array: lodash.List<T> | null | undefined): LodashUniqBy1x2<T>;
+        <T>(iteratee: lodash.ValueIteratee<T>, array: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashUniqBy1x1<T> = (array: lodash.List<T> | null | undefined) => T[];
+    type LodashUniqBy1x2<T> = (iteratee: lodash.ValueIteratee<T>) => T[];
+    type LodashUniqueId = (prefix: string) => string;
+    interface LodashUniqWith {
+        <T>(comparator: lodash.Comparator<T>): LodashUniqWith1x1<T>;
+        <T>(comparator: lodash.__, array: lodash.List<T> | null | undefined): LodashUniqWith1x2<T>;
+        <T>(comparator: lodash.Comparator<T>, array: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashUniqWith1x1<T> = (array: lodash.List<T> | null | undefined) => T[];
+    type LodashUniqWith1x2<T> = (comparator: lodash.Comparator<T>) => T[];
+    type LodashUnzip = <T>(array: T[][] | lodash.List<lodash.List<T>> | null | undefined) => T[][];
+    interface LodashUnzipWith {
+        <T, TResult>(iteratee: (...values: T[]) => TResult): LodashUnzipWith1x1<T, TResult>;
+        <T>(iteratee: lodash.__, array: lodash.List<lodash.List<T>> | null | undefined): LodashUnzipWith1x2<T>;
+        <T, TResult>(iteratee: (...values: T[]) => TResult, array: lodash.List<lodash.List<T>> | null | undefined): TResult[];
+    }
+    type LodashUnzipWith1x1<T, TResult> = (array: lodash.List<lodash.List<T>> | null | undefined) => TResult[];
+    type LodashUnzipWith1x2<T> = <TResult>(iteratee: (...values: T[]) => TResult) => TResult[];
+    interface LodashUpdate {
+        (path: lodash.PropertyPath): LodashUpdate1x1;
+        (path: lodash.__, updater: (value: any) => any): LodashUpdate1x2;
+        (path: lodash.PropertyPath, updater: (value: any) => any): LodashUpdate1x3;
+        (path: lodash.__, updater: lodash.__, object: object): LodashUpdate1x4;
+        (path: lodash.PropertyPath, updater: lodash.__, object: object): LodashUpdate1x5;
+        (path: lodash.__, updater: (value: any) => any, object: object): LodashUpdate1x6;
+        (path: lodash.PropertyPath, updater: (value: any) => any, object: object): any;
+    }
+    interface LodashUpdate1x1 {
+        (updater: (value: any) => any): LodashUpdate1x3;
+        (updater: lodash.__, object: object): LodashUpdate1x5;
+        (updater: (value: any) => any, object: object): any;
+    }
+    interface LodashUpdate1x2 {
+        (path: lodash.PropertyPath): LodashUpdate1x3;
+        (path: lodash.__, object: object): LodashUpdate1x6;
+        (path: lodash.PropertyPath, object: object): any;
+    }
+    type LodashUpdate1x3 = (object: object) => any;
+    interface LodashUpdate1x4 {
+        (path: lodash.PropertyPath): LodashUpdate1x5;
+        (path: lodash.__, updater: (value: any) => any): LodashUpdate1x6;
+        (path: lodash.PropertyPath, updater: (value: any) => any): any;
+    }
+    type LodashUpdate1x5 = (updater: (value: any) => any) => any;
+    type LodashUpdate1x6 = (path: lodash.PropertyPath) => any;
+    interface LodashUpdateWith {
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>): LodashUpdateWith1x1<T>;
+        (customizer: lodash.__, path: lodash.PropertyPath): LodashUpdateWith1x2;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, path: lodash.PropertyPath): LodashUpdateWith1x3<T>;
+        (customizer: lodash.__, path: lodash.__, updater: (oldValue: any) => any): LodashUpdateWith1x4;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, path: lodash.__, updater: (oldValue: any) => any): LodashUpdateWith1x5<T>;
+        (customizer: lodash.__, path: lodash.PropertyPath, updater: (oldValue: any) => any): LodashUpdateWith1x6;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, path: lodash.PropertyPath, updater: (oldValue: any) => any): LodashUpdateWith1x7<T>;
+        <T extends object>(customizer: lodash.__, path: lodash.__, updater: lodash.__, object: T): LodashUpdateWith1x8<T>;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, path: lodash.__, updater: lodash.__, object: T): LodashUpdateWith1x9<T>;
+        <T extends object>(customizer: lodash.__, path: lodash.PropertyPath, updater: lodash.__, object: T): LodashUpdateWith1x10<T>;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, path: lodash.PropertyPath, updater: lodash.__, object: T): LodashUpdateWith1x11<T>;
+        <T extends object>(customizer: lodash.__, path: lodash.__, updater: (oldValue: any) => any, object: T): LodashUpdateWith1x12<T>;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, path: lodash.__, updater: (oldValue: any) => any, object: T): LodashUpdateWith1x13<T>;
+        <T extends object>(customizer: lodash.__, path: lodash.PropertyPath, updater: (oldValue: any) => any, object: T): LodashUpdateWith1x14<T>;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, path: lodash.PropertyPath, updater: (oldValue: any) => any, object: T): T;
+    }
+    interface LodashUpdateWith1x1<T> {
+        (path: lodash.PropertyPath): LodashUpdateWith1x3<T>;
+        (path: lodash.__, updater: (oldValue: any) => any): LodashUpdateWith1x5<T>;
+        (path: lodash.PropertyPath, updater: (oldValue: any) => any): LodashUpdateWith1x7<T>;
+        (path: lodash.__, updater: lodash.__, object: T): LodashUpdateWith1x9<T>;
+        (path: lodash.PropertyPath, updater: lodash.__, object: T): LodashUpdateWith1x11<T>;
+        (path: lodash.__, updater: (oldValue: any) => any, object: T): LodashUpdateWith1x13<T>;
+        (path: lodash.PropertyPath, updater: (oldValue: any) => any, object: T): T;
+    }
+    interface LodashUpdateWith1x2 {
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>): LodashUpdateWith1x3<T>;
+        (customizer: lodash.__, updater: (oldValue: any) => any): LodashUpdateWith1x6;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, updater: (oldValue: any) => any): LodashUpdateWith1x7<T>;
+        <T extends object>(customizer: lodash.__, updater: lodash.__, object: T): LodashUpdateWith1x10<T>;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, updater: lodash.__, object: T): LodashUpdateWith1x11<T>;
+        <T extends object>(customizer: lodash.__, updater: (oldValue: any) => any, object: T): LodashUpdateWith1x14<T>;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, updater: (oldValue: any) => any, object: T): T;
+    }
+    interface LodashUpdateWith1x3<T> {
+        (updater: (oldValue: any) => any): LodashUpdateWith1x7<T>;
+        (updater: lodash.__, object: T): LodashUpdateWith1x11<T>;
+        (updater: (oldValue: any) => any, object: T): T;
+    }
+    interface LodashUpdateWith1x4 {
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>): LodashUpdateWith1x5<T>;
+        (customizer: lodash.__, path: lodash.PropertyPath): LodashUpdateWith1x6;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, path: lodash.PropertyPath): LodashUpdateWith1x7<T>;
+        <T extends object>(customizer: lodash.__, path: lodash.__, object: T): LodashUpdateWith1x12<T>;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, path: lodash.__, object: T): LodashUpdateWith1x13<T>;
+        <T extends object>(customizer: lodash.__, path: lodash.PropertyPath, object: T): LodashUpdateWith1x14<T>;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, path: lodash.PropertyPath, object: T): T;
+    }
+    interface LodashUpdateWith1x5<T> {
+        (path: lodash.PropertyPath): LodashUpdateWith1x7<T>;
+        (path: lodash.__, object: T): LodashUpdateWith1x13<T>;
+        (path: lodash.PropertyPath, object: T): T;
+    }
+    interface LodashUpdateWith1x6 {
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>): LodashUpdateWith1x7<T>;
+        <T extends object>(customizer: lodash.__, object: T): LodashUpdateWith1x14<T>;
+        <T extends object>(customizer: lodash.SetWithCustomizer<T>, object: T): T;
+    }
+    type LodashUpdateWith1x7<T> = (object: T) => T;
+    interface LodashUpdateWith1x8<T> {
+        (customizer: lodash.SetWithCustomizer<T>): LodashUpdateWith1x9<T>;
+        (customizer: lodash.__, path: lodash.PropertyPath): LodashUpdateWith1x10<T>;
+        (customizer: lodash.SetWithCustomizer<T>, path: lodash.PropertyPath): LodashUpdateWith1x11<T>;
+        (customizer: lodash.__, path: lodash.__, updater: (oldValue: any) => any): LodashUpdateWith1x12<T>;
+        (customizer: lodash.SetWithCustomizer<T>, path: lodash.__, updater: (oldValue: any) => any): LodashUpdateWith1x13<T>;
+        (customizer: lodash.__, path: lodash.PropertyPath, updater: (oldValue: any) => any): LodashUpdateWith1x14<T>;
+        (customizer: lodash.SetWithCustomizer<T>, path: lodash.PropertyPath, updater: (oldValue: any) => any): T;
+    }
+    interface LodashUpdateWith1x9<T> {
+        (path: lodash.PropertyPath): LodashUpdateWith1x11<T>;
+        (path: lodash.__, updater: (oldValue: any) => any): LodashUpdateWith1x13<T>;
+        (path: lodash.PropertyPath, updater: (oldValue: any) => any): T;
+    }
+    interface LodashUpdateWith1x10<T> {
+        (customizer: lodash.SetWithCustomizer<T>): LodashUpdateWith1x11<T>;
+        (customizer: lodash.__, updater: (oldValue: any) => any): LodashUpdateWith1x14<T>;
+        (customizer: lodash.SetWithCustomizer<T>, updater: (oldValue: any) => any): T;
+    }
+    type LodashUpdateWith1x11<T> = (updater: (oldValue: any) => any) => T;
+    interface LodashUpdateWith1x12<T> {
+        (customizer: lodash.SetWithCustomizer<T>): LodashUpdateWith1x13<T>;
+        (customizer: lodash.__, path: lodash.PropertyPath): LodashUpdateWith1x14<T>;
+        (customizer: lodash.SetWithCustomizer<T>, path: lodash.PropertyPath): T;
+    }
+    type LodashUpdateWith1x13<T> = (path: lodash.PropertyPath) => T;
+    type LodashUpdateWith1x14<T> = (customizer: lodash.SetWithCustomizer<T>) => T;
+    type LodashUpperCase = (string: string) => string;
+    type LodashUpperFirst = (string: string) => string;
+    interface LodashValues {
+        <T>(object: lodash.Dictionary<T> | lodash.NumericDictionary<T> | lodash.List<T> | null | undefined): T[];
+        <T extends object>(object: T | null | undefined): Array<T[keyof T]>;
+        (object: any): any[];
+    }
+    interface LodashValuesIn {
+        <T>(object: lodash.Dictionary<T>|lodash.NumericDictionary<T>|lodash.List<T> | null | undefined): T[];
+        <T extends object>(object: T | null | undefined): Array<T[keyof T]>;
+    }
+    interface LodashWithout {
+        <T>(values: ReadonlyArray<T>): LodashWithout1x1<T>;
+        <T>(values: lodash.__, array: lodash.List<T> | null | undefined): LodashWithout1x2<T>;
+        <T>(values: ReadonlyArray<T>, array: lodash.List<T> | null | undefined): T[];
+    }
+    type LodashWithout1x1<T> = (array: lodash.List<T> | null | undefined) => T[];
+    type LodashWithout1x2<T> = (values: ReadonlyArray<T>) => T[];
+    type LodashWords = (string: string) => string[];
+    interface LodashWrap {
+        <T, TArgs, TResult>(wrapper: (value: T, ...args: TArgs[]) => TResult): LodashWrap1x1<T, TArgs, TResult>;
+        <T>(wrapper: lodash.__, value: T): LodashWrap1x2<T>;
+        <T, TArgs, TResult>(wrapper: (value: T, ...args: TArgs[]) => TResult, value: T): (...args: TArgs[]) => TResult;
+        <T, TResult>(wrapper: (value: T, ...args: any[]) => TResult): LodashWrap2x1<T, TResult>;
+        <T, TResult>(wrapper: (value: T, ...args: any[]) => TResult, value: T): (...args: any[]) => TResult;
+    }
+    type LodashWrap1x1<T, TArgs, TResult> = (value: T) => (...args: TArgs[]) => TResult;
+    interface LodashWrap1x2<T> {
+        <TArgs, TResult>(wrapper: (value: T, ...args: TArgs[]) => TResult): (...args: TArgs[]) => TResult;
+        <TResult>(wrapper: (value: T, ...args: any[]) => TResult): (...args: any[]) => TResult;
+    }
+    type LodashWrap2x1<T, TResult> = (value: T) => (...args: any[]) => TResult;
+    interface LodashZip {
+        <T1>(arrays1: lodash.List<T1>): LodashZip1x1<T1>;
+        <T2>(arrays1: lodash.__, arrays2: lodash.List<T2>): LodashZip1x2<T2>;
+        <T1, T2>(arrays1: lodash.List<T1>, arrays2: lodash.List<T2>): Array<[T1 | undefined, T2 | undefined]>;
+    }
+    type LodashZip1x1<T1> = <T2>(arrays2: lodash.List<T2>) => Array<[T1 | undefined, T2 | undefined]>;
+    type LodashZip1x2<T2> = <T1>(arrays1: lodash.List<T1>) => Array<[T1 | undefined, T2 | undefined]>;
+    interface LodashZipAll {
+        <T1, T2>(arrays1: [lodash.List<T1>, lodash.List<T2>]): Array<[T1 | undefined, T2 | undefined]>;
+        <T1, T2, T3>(arrays1: [lodash.List<T1>, lodash.List<T2>, lodash.List<T3>]): Array<[T1 | undefined, T2 | undefined, T3 | undefined]>;
+        <T1, T2, T3, T4>(arrays1: [lodash.List<T1>, lodash.List<T2>, lodash.List<T3>, lodash.List<T4>]): Array<[T1 | undefined, T2 | undefined, T3 | undefined, T4 | undefined]>;
+        <T1, T2, T3, T4, T5>(arrays1: [lodash.List<T1>, lodash.List<T2>, lodash.List<T3>, lodash.List<T4>, lodash.List<T5>]): Array<[T1 | undefined, T2 | undefined, T3 | undefined, T4 | undefined, T5 | undefined]>;
+        <T>(arrays: ReadonlyArray<lodash.List<T> | null | undefined>): Array<Array<T | undefined>>;
+    }
+    interface LodashZipObject {
+        (props: lodash.List<lodash.PropertyName>): LodashZipObject1x1;
+        <T>(props: lodash.__, values: lodash.List<T>): LodashZipObject1x2<T>;
+        <T>(props: lodash.List<lodash.PropertyName>, values: lodash.List<T>): lodash.Dictionary<T>;
+    }
+    type LodashZipObject1x1 = <T>(values: lodash.List<T>) => lodash.Dictionary<T>;
+    type LodashZipObject1x2<T> = (props: lodash.List<lodash.PropertyName>) => lodash.Dictionary<T>;
+    interface LodashZipObjectDeep {
+        (paths: lodash.List<lodash.PropertyPath>): LodashZipObjectDeep1x1;
+        (paths: lodash.__, values: lodash.List<any>): LodashZipObjectDeep1x2;
+        (paths: lodash.List<lodash.PropertyPath>, values: lodash.List<any>): object;
+    }
+    type LodashZipObjectDeep1x1 = (values: lodash.List<any>) => object;
+    type LodashZipObjectDeep1x2 = (paths: lodash.List<lodash.PropertyPath>) => object;
+    interface LodashZipWith {
+        <T1, T2, TResult>(iteratee: (value1: T1, value2: T2) => TResult): LodashZipWith1x1<T1, T2, TResult>;
+        <T1>(iteratee: lodash.__, arrays1: lodash.List<T1>): LodashZipWith1x2<T1>;
+        <T1, T2, TResult>(iteratee: (value1: T1, value2: T2) => TResult, arrays1: lodash.List<T1>): LodashZipWith1x3<T2, TResult>;
+        <T2>(iteratee: lodash.__, arrays1: lodash.__, arrays2: lodash.List<T2>): LodashZipWith1x4<T2>;
+        <T1, T2, TResult>(iteratee: (value1: T1, value2: T2) => TResult, arrays1: lodash.__, arrays2: lodash.List<T2>): LodashZipWith1x5<T1, TResult>;
+        <T1, T2>(iteratee: lodash.__, arrays1: lodash.List<T1>, arrays2: lodash.List<T2>): LodashZipWith1x6<T1, T2>;
+        <T1, T2, TResult>(iteratee: (value1: T1, value2: T2) => TResult, arrays1: lodash.List<T1>, arrays2: lodash.List<T2>): TResult[];
+    }
+    interface LodashZipWith1x1<T1, T2, TResult> {
+        (arrays1: lodash.List<T1>): LodashZipWith1x3<T2, TResult>;
+        (arrays1: lodash.__, arrays2: lodash.List<T2>): LodashZipWith1x5<T1, TResult>;
+        (arrays1: lodash.List<T1>, arrays2: lodash.List<T2>): TResult[];
+    }
+    interface LodashZipWith1x2<T1> {
+        <T2, TResult>(iteratee: (value1: T1, value2: T2) => TResult): LodashZipWith1x3<T2, TResult>;
+        <T2>(iteratee: lodash.__, arrays2: lodash.List<T2>): LodashZipWith1x6<T1, T2>;
+        <T2, TResult>(iteratee: (value1: T1, value2: T2) => TResult, arrays2: lodash.List<T2>): TResult[];
+    }
+    type LodashZipWith1x3<T2, TResult> = (arrays2: lodash.List<T2>) => TResult[];
+    interface LodashZipWith1x4<T2> {
+        <T1, TResult>(iteratee: (value1: T1, value2: T2) => TResult): LodashZipWith1x5<T1, TResult>;
+        <T1>(iteratee: lodash.__, arrays1: lodash.List<T1>): LodashZipWith1x6<T1, T2>;
+        <T1, TResult>(iteratee: (value1: T1, value2: T2) => TResult, arrays1: lodash.List<T1>): TResult[];
+    }
+    type LodashZipWith1x5<T1, TResult> = (arrays1: lodash.List<T1>) => TResult[];
+    type LodashZipWith1x6<T1, T2> = <TResult>(iteratee: (value1: T1, value2: T2) => TResult) => TResult[];
+
+    interface LoDashFp {
+        add: LodashAdd;
+        after: LodashAfter;
+        all: LodashEvery;
+        allPass: LodashOverEvery;
+        always: LodashConstant;
+        any: LodashSome;
+        anyPass: LodashOverSome;
+        apply: LodashApply;
+        ary: LodashAry;
+        assign: LodashAssign;
+        assignAll: LodashAssignAll;
+        assignAllWith: LodashAssignAllWith;
+        assignIn: LodashAssignIn;
+        assignInAll: LodashAssignInAll;
+        assignInAllWith: LodashAssignInAllWith;
+        assignInWith: LodashAssignInWith;
+        assignWith: LodashAssignWith;
+        assoc: LodashSet;
+        assocPath: LodashSet;
+        at: LodashAt;
+        attempt: LodashAttempt;
+        before: LodashBefore;
+        bind: LodashBind;
+        bindAll: LodashBindAll;
+        bindKey: LodashBindKey;
+        camelCase: LodashCamelCase;
+        capitalize: LodashCapitalize;
+        castArray: LodashCastArray;
+        ceil: LodashCeil;
+        chunk: LodashChunk;
+        clamp: LodashClamp;
+        clone: LodashClone;
+        cloneDeep: LodashCloneDeep;
+        cloneDeepWith: LodashCloneDeepWith;
+        cloneWith: LodashCloneWith;
+        compact: LodashCompact;
+        complement: LodashNegate;
+        compose: LodashFlowRight;
+        concat: LodashConcat;
+        cond: LodashCond;
+        conforms: LodashConformsTo;
+        conformsTo: LodashConformsTo;
+        constant: LodashConstant;
+        contains: LodashContains;
+        countBy: LodashCountBy;
+        create: LodashCreate;
+        curry: LodashCurry;
+        curryN: LodashCurryN;
+        curryRight: LodashCurryRight;
+        curryRightN: LodashCurryRightN;
+        debounce: LodashDebounce;
+        deburr: LodashDeburr;
+        defaults: LodashDefaults;
+        defaultsAll: LodashDefaultsAll;
+        defaultsDeep: LodashDefaultsDeep;
+        defaultsDeepAll: LodashDefaultsDeepAll;
+        defaultTo: LodashDefaultTo;
+        defer: LodashDefer;
+        delay: LodashDelay;
+        difference: LodashDifference;
+        differenceBy: LodashDifferenceBy;
+        differenceWith: LodashDifferenceWith;
+        dissoc: LodashUnset;
+        dissocPath: LodashUnset;
+        divide: LodashDivide;
+        drop: LodashDrop;
+        dropLast: LodashDropRight;
+        dropLastWhile: LodashDropRightWhile;
+        dropRight: LodashDropRight;
+        dropRightWhile: LodashDropRightWhile;
+        dropWhile: LodashDropWhile;
+        each: LodashForEach;
+        eachRight: LodashForEachRight;
+        endsWith: LodashEndsWith;
+        entries: LodashToPairs;
+        entriesIn: LodashToPairsIn;
+        eq: LodashEq;
+        equals: LodashIsEqual;
+        escape: LodashEscape;
+        escapeRegExp: LodashEscapeRegExp;
+        every: LodashEvery;
+        extend: LodashExtend;
+        extendAll: LodashExtendAll;
+        extendAllWith: LodashExtendAllWith;
+        extendWith: LodashExtendWith;
+        F: LodashStubFalse;
+        fill: LodashFill;
+        filter: LodashFilter;
+        find: LodashFind;
+        findFrom: LodashFindFrom;
+        findIndex: LodashFindIndex;
+        findIndexFrom: LodashFindIndexFrom;
+        findKey: LodashFindKey;
+        findLast: LodashFindLast;
+        findLastFrom: LodashFindLastFrom;
+        findLastIndex: LodashFindLastIndex;
+        findLastIndexFrom: LodashFindLastIndexFrom;
+        findLastKey: LodashFindLastKey;
+        first: LodashHead;
+        flatMap: LodashFlatMap;
+        flatMapDeep: LodashFlatMapDeep;
+        flatMapDepth: LodashFlatMapDepth;
+        flatten: LodashFlatten;
+        flattenDeep: LodashFlattenDeep;
+        flattenDepth: LodashFlattenDepth;
+        flip: LodashFlip;
+        floor: LodashFloor;
+        flow: LodashFlow;
+        flowRight: LodashFlowRight;
+        forEach: LodashForEach;
+        forEachRight: LodashForEachRight;
+        forIn: LodashForIn;
+        forInRight: LodashForInRight;
+        forOwn: LodashForOwn;
+        forOwnRight: LodashForOwnRight;
+        fromPairs: LodashFromPairs;
+        functions: LodashFunctions;
+        functionsIn: LodashFunctionsIn;
+        get: LodashGet;
+        getOr: LodashGetOr;
+        groupBy: LodashGroupBy;
+        gt: LodashGt;
+        gte: LodashGte;
+        has: LodashHas;
+        hasIn: LodashHasIn;
+        head: LodashHead;
+        identical: LodashEq;
+        identity: LodashIdentity;
+        includes: LodashIncludes;
+        includesFrom: LodashIncludesFrom;
+        indexBy: LodashKeyBy;
+        indexOf: LodashIndexOf;
+        indexOfFrom: LodashIndexOfFrom;
+        init: LodashInitial;
+        initial: LodashInitial;
+        inRange: LodashInRange;
+        intersection: LodashIntersection;
+        intersectionBy: LodashIntersectionBy;
+        intersectionWith: LodashIntersectionWith;
+        invert: LodashInvert;
+        invertBy: LodashInvertBy;
+        invertObj: LodashInvert;
+        invoke: LodashInvoke;
+        invokeArgs: LodashInvokeArgs;
+        invokeArgsMap: LodashInvokeArgsMap;
+        invokeMap: LodashInvokeMap;
+        isArguments: LodashIsArguments;
+        isArray: LodashIsArray;
+        isArrayBuffer: LodashIsArrayBuffer;
+        isArrayLike: LodashIsArrayLike;
+        isArrayLikeObject: LodashIsArrayLikeObject;
+        isBoolean: LodashIsBoolean;
+        isBuffer: LodashIsBuffer;
+        isDate: LodashIsDate;
+        isElement: LodashIsElement;
+        isEmpty: LodashIsEmpty;
+        isEqual: LodashIsEqual;
+        isEqualWith: LodashIsEqualWith;
+        isError: LodashIsError;
+        isFinite: LodashIsFinite;
+        isFunction: LodashIsFunction;
+        isInteger: LodashIsInteger;
+        isLength: LodashIsLength;
+        isMap: LodashIsMap;
+        isMatch: LodashIsMatch;
+        isMatchWith: LodashIsMatchWith;
+        isNaN: LodashIsNaN;
+        isNative: LodashIsNative;
+        isNil: LodashIsNil;
+        isNull: LodashIsNull;
+        isNumber: LodashIsNumber;
+        isObject: LodashIsObject;
+        isObjectLike: LodashIsObjectLike;
+        isPlainObject: LodashIsPlainObject;
+        isRegExp: LodashIsRegExp;
+        isSafeInteger: LodashIsSafeInteger;
+        isSet: LodashIsSet;
+        isString: LodashIsString;
+        isSymbol: LodashIsSymbol;
+        isTypedArray: LodashIsTypedArray;
+        isUndefined: LodashIsUndefined;
+        isWeakMap: LodashIsWeakMap;
+        isWeakSet: LodashIsWeakSet;
+        iteratee: LodashIteratee;
+        join: LodashJoin;
+        juxt: LodashOver;
+        kebabCase: LodashKebabCase;
+        keyBy: LodashKeyBy;
+        keys: LodashKeys;
+        keysIn: LodashKeysIn;
+        last: LodashLast;
+        lastIndexOf: LodashLastIndexOf;
+        lastIndexOfFrom: LodashLastIndexOfFrom;
+        lowerCase: LodashLowerCase;
+        lowerFirst: LodashLowerFirst;
+        lt: LodashLt;
+        lte: LodashLte;
+        map: LodashMap;
+        mapKeys: LodashMapKeys;
+        mapValues: LodashMapValues;
+        matches: LodashIsMatch;
+        matchesProperty: LodashMatchesProperty;
+        max: LodashMax;
+        maxBy: LodashMaxBy;
+        mean: LodashMean;
+        meanBy: LodashMeanBy;
+        memoize: LodashMemoize;
+        merge: LodashMerge;
+        mergeAll: LodashMergeAll;
+        mergeAllWith: LodashMergeAllWith;
+        mergeWith: LodashMergeWith;
+        method: LodashMethod;
+        methodOf: LodashMethodOf;
+        min: LodashMin;
+        minBy: LodashMinBy;
+        multiply: LodashMultiply;
+        nAry: LodashAry;
+        negate: LodashNegate;
+        noConflict: LodashNoConflict;
+        noop: LodashNoop;
+        now: LodashNow;
+        nth: LodashNth;
+        nthArg: LodashNthArg;
+        omit: LodashOmit;
+        omitAll: LodashOmit;
+        omitBy: LodashOmitBy;
+        once: LodashOnce;
+        orderBy: LodashOrderBy;
+        over: LodashOver;
+        overArgs: LodashOverArgs;
+        overEvery: LodashOverEvery;
+        overSome: LodashOverSome;
+        pad: LodashPad;
+        padChars: LodashPadChars;
+        padCharsEnd: LodashPadCharsEnd;
+        padCharsStart: LodashPadCharsStart;
+        padEnd: LodashPadEnd;
+        padStart: LodashPadStart;
+        parseInt: LodashParseInt;
+        partial: LodashPartial;
+        partialRight: LodashPartialRight;
+        partition: LodashPartition;
+        path: LodashPath;
+        pathEq: LodashMatchesProperty;
+        pathOr: LodashPathOr;
+        paths: LodashAt;
+        pick: LodashPick;
+        pickAll: LodashPick;
+        pickBy: LodashPickBy;
+        pipe: LodashFlow;
+        pluck: LodashMap;
+        prop: LodashProp;
+        propEq: LodashMatchesProperty;
+        property: LodashProperty;
+        propertyOf: LodashPropertyOf;
+        propOr: LodashPropOr;
+        props: LodashAt;
+        pull: LodashPull;
+        pullAll: LodashPullAll;
+        pullAllBy: LodashPullAllBy;
+        pullAllWith: LodashPullAllWith;
+        pullAt: LodashPullAt;
+        random: LodashRandom;
+        range: LodashRange;
+        rangeRight: LodashRangeRight;
+        rangeStep: LodashRangeStep;
+        rangeStepRight: LodashRangeStepRight;
+        rearg: LodashRearg;
+        reduce: LodashReduce;
+        reduceRight: LodashReduceRight;
+        reject: LodashReject;
+        remove: LodashRemove;
+        repeat: LodashRepeat;
+        replace: LodashReplace;
+        rest: LodashRest;
+        restFrom: LodashRestFrom;
+        result: LodashResult;
+        reverse: LodashReverse;
+        round: LodashRound;
+        runInContext: LodashRunInContext;
+        sample: LodashSample;
+        sampleSize: LodashSampleSize;
+        set: LodashSet;
+        setWith: LodashSetWith;
+        shuffle: LodashShuffle;
+        size: LodashSize;
+        slice: LodashSlice;
+        snakeCase: LodashSnakeCase;
+        some: LodashSome;
+        sortBy: LodashSortBy;
+        sortedIndex: LodashSortedIndex;
+        sortedIndexBy: LodashSortedIndexBy;
+        sortedIndexOf: LodashSortedIndexOf;
+        sortedLastIndex: LodashSortedLastIndex;
+        sortedLastIndexBy: LodashSortedLastIndexBy;
+        sortedLastIndexOf: LodashSortedLastIndexOf;
+        sortedUniq: LodashSortedUniq;
+        sortedUniqBy: LodashSortedUniqBy;
+        split: LodashSplit;
+        spread: LodashSpread;
+        spreadFrom: LodashSpreadFrom;
+        startCase: LodashStartCase;
+        startsWith: LodashStartsWith;
+        stubArray: LodashStubArray;
+        stubFalse: LodashStubFalse;
+        stubObject: LodashStubObject;
+        stubString: LodashStubString;
+        stubTrue: LodashStubTrue;
+        subtract: LodashSubtract;
+        sum: LodashSum;
+        sumBy: LodashSumBy;
+        symmetricDifference: LodashXor;
+        symmetricDifferenceBy: LodashXorBy;
+        symmetricDifferenceWith: LodashXorWith;
+        T: LodashStubTrue;
+        tail: LodashTail;
+        take: LodashTake;
+        takeLast: LodashTakeRight;
+        takeLastWhile: LodashTakeRightWhile;
+        takeRight: LodashTakeRight;
+        takeRightWhile: LodashTakeRightWhile;
+        takeWhile: LodashTakeWhile;
+        tap: LodashTap;
+        template: LodashTemplate;
+        throttle: LodashThrottle;
+        thru: LodashThru;
+        times: LodashTimes;
+        toArray: LodashToArray;
+        toFinite: LodashToFinite;
+        toInteger: LodashToInteger;
+        toLength: LodashToLength;
+        toLower: LodashToLower;
+        toNumber: LodashToNumber;
+        toPairs: LodashToPairs;
+        toPairsIn: LodashToPairsIn;
+        toPath: LodashToPath;
+        toPlainObject: LodashToPlainObject;
+        toSafeInteger: LodashToSafeInteger;
+        toString: LodashToString;
+        toUpper: LodashToUpper;
+        transform: LodashTransform;
+        trim: LodashTrim;
+        trimChars: LodashTrimChars;
+        trimCharsEnd: LodashTrimCharsEnd;
+        trimCharsStart: LodashTrimCharsStart;
+        trimEnd: LodashTrimEnd;
+        trimStart: LodashTrimStart;
+        truncate: LodashTruncate;
+        unapply: LodashUnapply;
+        unary: LodashUnary;
+        unescape: LodashUnescape;
+        union: LodashUnion;
+        unionBy: LodashUnionBy;
+        unionWith: LodashUnionWith;
+        uniq: LodashUniq;
+        uniqBy: LodashUniqBy;
+        uniqueId: LodashUniqueId;
+        uniqWith: LodashUniqWith;
+        unnest: LodashFlatten;
+        unset: LodashUnset;
+        unzip: LodashUnzip;
+        unzipWith: LodashUnzipWith;
+        update: LodashUpdate;
+        updateWith: LodashUpdateWith;
+        upperCase: LodashUpperCase;
+        upperFirst: LodashUpperFirst;
+        useWith: LodashOverArgs;
+        values: LodashValues;
+        valuesIn: LodashValuesIn;
+        where: LodashConformsTo;
+        whereEq: LodashIsMatch;
+        without: LodashWithout;
+        words: LodashWords;
+        wrap: LodashWrap;
+        xor: LodashXor;
+        xorBy: LodashXorBy;
+        xorWith: LodashXorWith;
+        zip: LodashZip;
+        zipAll: LodashZipAll;
+        zipObj: LodashZipObject;
+        zipObject: LodashZipObject;
+        zipObjectDeep: LodashZipObjectDeep;
+        zipWith: LodashZipWith;
+        __: lodash.__;
+        placeholder: lodash.__;
+    }
+}
diff --git a/jtg js/node_modules/@types/lodash/fp/F.d.ts b/jtg js/node_modules/@types/lodash/fp/F.d.ts
new file mode 100644
index 0000000..33fc579
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/F.d.ts	
@@ -0,0 +1,2 @@
+import { F } from "../fp";
+export = F;
diff --git a/jtg js/node_modules/@types/lodash/fp/T.d.ts b/jtg js/node_modules/@types/lodash/fp/T.d.ts
new file mode 100644
index 0000000..886606e
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/T.d.ts	
@@ -0,0 +1,2 @@
+import { T } from "../fp";
+export = T;
diff --git a/jtg js/node_modules/@types/lodash/fp/__.d.ts b/jtg js/node_modules/@types/lodash/fp/__.d.ts
new file mode 100644
index 0000000..aec0a51
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/__.d.ts	
@@ -0,0 +1,3 @@
+import _ = require("../index");
+declare const __: _.__;
+export = __;
diff --git a/jtg js/node_modules/@types/lodash/fp/add.d.ts b/jtg js/node_modules/@types/lodash/fp/add.d.ts
new file mode 100644
index 0000000..47c9c6a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/add.d.ts	
@@ -0,0 +1,2 @@
+import { add } from "../fp";
+export = add;
diff --git a/jtg js/node_modules/@types/lodash/fp/after.d.ts b/jtg js/node_modules/@types/lodash/fp/after.d.ts
new file mode 100644
index 0000000..93863a5
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/after.d.ts	
@@ -0,0 +1,2 @@
+import { after } from "../fp";
+export = after;
diff --git a/jtg js/node_modules/@types/lodash/fp/all.d.ts b/jtg js/node_modules/@types/lodash/fp/all.d.ts
new file mode 100644
index 0000000..5ca0f70
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/all.d.ts	
@@ -0,0 +1,2 @@
+import { all } from "../fp";
+export = all;
diff --git a/jtg js/node_modules/@types/lodash/fp/allPass.d.ts b/jtg js/node_modules/@types/lodash/fp/allPass.d.ts
new file mode 100644
index 0000000..5013913
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/allPass.d.ts	
@@ -0,0 +1,2 @@
+import { allPass } from "../fp";
+export = allPass;
diff --git a/jtg js/node_modules/@types/lodash/fp/always.d.ts b/jtg js/node_modules/@types/lodash/fp/always.d.ts
new file mode 100644
index 0000000..07bd82d
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/always.d.ts	
@@ -0,0 +1,2 @@
+import { always } from "../fp";
+export = always;
diff --git a/jtg js/node_modules/@types/lodash/fp/any.d.ts b/jtg js/node_modules/@types/lodash/fp/any.d.ts
new file mode 100644
index 0000000..5d8c38f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/any.d.ts	
@@ -0,0 +1,2 @@
+import { any } from "../fp";
+export = any;
diff --git a/jtg js/node_modules/@types/lodash/fp/anyPass.d.ts b/jtg js/node_modules/@types/lodash/fp/anyPass.d.ts
new file mode 100644
index 0000000..b69becf
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/anyPass.d.ts	
@@ -0,0 +1,2 @@
+import { anyPass } from "../fp";
+export = anyPass;
diff --git a/jtg js/node_modules/@types/lodash/fp/apply.d.ts b/jtg js/node_modules/@types/lodash/fp/apply.d.ts
new file mode 100644
index 0000000..e13c42c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/apply.d.ts	
@@ -0,0 +1,2 @@
+import { apply } from "../fp";
+export = apply;
diff --git a/jtg js/node_modules/@types/lodash/fp/ary.d.ts b/jtg js/node_modules/@types/lodash/fp/ary.d.ts
new file mode 100644
index 0000000..932d7f4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/ary.d.ts	
@@ -0,0 +1,2 @@
+import { ary } from "../fp";
+export = ary;
diff --git a/jtg js/node_modules/@types/lodash/fp/assign.d.ts b/jtg js/node_modules/@types/lodash/fp/assign.d.ts
new file mode 100644
index 0000000..cf17310
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/assign.d.ts	
@@ -0,0 +1,2 @@
+import { assign } from "../fp";
+export = assign;
diff --git a/jtg js/node_modules/@types/lodash/fp/assignAll.d.ts b/jtg js/node_modules/@types/lodash/fp/assignAll.d.ts
new file mode 100644
index 0000000..f95b06b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/assignAll.d.ts	
@@ -0,0 +1,2 @@
+import { assignAll } from "../fp";
+export = assignAll;
diff --git a/jtg js/node_modules/@types/lodash/fp/assignAllWith.d.ts b/jtg js/node_modules/@types/lodash/fp/assignAllWith.d.ts
new file mode 100644
index 0000000..c2695a0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/assignAllWith.d.ts	
@@ -0,0 +1,2 @@
+import { assignAllWith } from "../fp";
+export = assignAllWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/assignIn.d.ts b/jtg js/node_modules/@types/lodash/fp/assignIn.d.ts
new file mode 100644
index 0000000..f6cdee7
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/assignIn.d.ts	
@@ -0,0 +1,2 @@
+import { assignIn } from "../fp";
+export = assignIn;
diff --git a/jtg js/node_modules/@types/lodash/fp/assignInAll.d.ts b/jtg js/node_modules/@types/lodash/fp/assignInAll.d.ts
new file mode 100644
index 0000000..539344b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/assignInAll.d.ts	
@@ -0,0 +1,2 @@
+import { assignInAll } from "../fp";
+export = assignInAll;
diff --git a/jtg js/node_modules/@types/lodash/fp/assignInAllWith.d.ts b/jtg js/node_modules/@types/lodash/fp/assignInAllWith.d.ts
new file mode 100644
index 0000000..3b421fb
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/assignInAllWith.d.ts	
@@ -0,0 +1,2 @@
+import { assignInAllWith } from "../fp";
+export = assignInAllWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/assignInWith.d.ts b/jtg js/node_modules/@types/lodash/fp/assignInWith.d.ts
new file mode 100644
index 0000000..c410091
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/assignInWith.d.ts	
@@ -0,0 +1,2 @@
+import { assignInWith } from "../fp";
+export = assignInWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/assignWith.d.ts b/jtg js/node_modules/@types/lodash/fp/assignWith.d.ts
new file mode 100644
index 0000000..2205db0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/assignWith.d.ts	
@@ -0,0 +1,2 @@
+import { assignWith } from "../fp";
+export = assignWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/assoc.d.ts b/jtg js/node_modules/@types/lodash/fp/assoc.d.ts
new file mode 100644
index 0000000..2a2e29c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/assoc.d.ts	
@@ -0,0 +1,2 @@
+import { assoc } from "../fp";
+export = assoc;
diff --git a/jtg js/node_modules/@types/lodash/fp/assocPath.d.ts b/jtg js/node_modules/@types/lodash/fp/assocPath.d.ts
new file mode 100644
index 0000000..e2dd517
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/assocPath.d.ts	
@@ -0,0 +1,2 @@
+import { assocPath } from "../fp";
+export = assocPath;
diff --git a/jtg js/node_modules/@types/lodash/fp/at.d.ts b/jtg js/node_modules/@types/lodash/fp/at.d.ts
new file mode 100644
index 0000000..beefa33
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/at.d.ts	
@@ -0,0 +1,2 @@
+import { at } from "../fp";
+export = at;
diff --git a/jtg js/node_modules/@types/lodash/fp/attempt.d.ts b/jtg js/node_modules/@types/lodash/fp/attempt.d.ts
new file mode 100644
index 0000000..72d60af
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/attempt.d.ts	
@@ -0,0 +1,2 @@
+import { attempt } from "../fp";
+export = attempt;
diff --git a/jtg js/node_modules/@types/lodash/fp/before.d.ts b/jtg js/node_modules/@types/lodash/fp/before.d.ts
new file mode 100644
index 0000000..ead2869
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/before.d.ts	
@@ -0,0 +1,2 @@
+import { before } from "../fp";
+export = before;
diff --git a/jtg js/node_modules/@types/lodash/fp/bind.d.ts b/jtg js/node_modules/@types/lodash/fp/bind.d.ts
new file mode 100644
index 0000000..a312192
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/bind.d.ts	
@@ -0,0 +1,2 @@
+import { bind } from "../fp";
+export = bind;
diff --git a/jtg js/node_modules/@types/lodash/fp/bindAll.d.ts b/jtg js/node_modules/@types/lodash/fp/bindAll.d.ts
new file mode 100644
index 0000000..4f7c7db
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/bindAll.d.ts	
@@ -0,0 +1,2 @@
+import { bindAll } from "../fp";
+export = bindAll;
diff --git a/jtg js/node_modules/@types/lodash/fp/bindKey.d.ts b/jtg js/node_modules/@types/lodash/fp/bindKey.d.ts
new file mode 100644
index 0000000..8986b2f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/bindKey.d.ts	
@@ -0,0 +1,2 @@
+import { bindKey } from "../fp";
+export = bindKey;
diff --git a/jtg js/node_modules/@types/lodash/fp/camelCase.d.ts b/jtg js/node_modules/@types/lodash/fp/camelCase.d.ts
new file mode 100644
index 0000000..be6628d
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/camelCase.d.ts	
@@ -0,0 +1,2 @@
+import { camelCase } from "../fp";
+export = camelCase;
diff --git a/jtg js/node_modules/@types/lodash/fp/capitalize.d.ts b/jtg js/node_modules/@types/lodash/fp/capitalize.d.ts
new file mode 100644
index 0000000..7dc552f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/capitalize.d.ts	
@@ -0,0 +1,2 @@
+import { capitalize } from "../fp";
+export = capitalize;
diff --git a/jtg js/node_modules/@types/lodash/fp/castArray.d.ts b/jtg js/node_modules/@types/lodash/fp/castArray.d.ts
new file mode 100644
index 0000000..a431805
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/castArray.d.ts	
@@ -0,0 +1,2 @@
+import { castArray } from "../fp";
+export = castArray;
diff --git a/jtg js/node_modules/@types/lodash/fp/ceil.d.ts b/jtg js/node_modules/@types/lodash/fp/ceil.d.ts
new file mode 100644
index 0000000..13cd731
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/ceil.d.ts	
@@ -0,0 +1,2 @@
+import { ceil } from "../fp";
+export = ceil;
diff --git a/jtg js/node_modules/@types/lodash/fp/chunk.d.ts b/jtg js/node_modules/@types/lodash/fp/chunk.d.ts
new file mode 100644
index 0000000..2e40666
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/chunk.d.ts	
@@ -0,0 +1,2 @@
+import { chunk } from "../fp";
+export = chunk;
diff --git a/jtg js/node_modules/@types/lodash/fp/clamp.d.ts b/jtg js/node_modules/@types/lodash/fp/clamp.d.ts
new file mode 100644
index 0000000..121c6f9
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/clamp.d.ts	
@@ -0,0 +1,2 @@
+import { clamp } from "../fp";
+export = clamp;
diff --git a/jtg js/node_modules/@types/lodash/fp/clone.d.ts b/jtg js/node_modules/@types/lodash/fp/clone.d.ts
new file mode 100644
index 0000000..9edf0c8
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/clone.d.ts	
@@ -0,0 +1,2 @@
+import { clone } from "../fp";
+export = clone;
diff --git a/jtg js/node_modules/@types/lodash/fp/cloneDeep.d.ts b/jtg js/node_modules/@types/lodash/fp/cloneDeep.d.ts
new file mode 100644
index 0000000..3bdab15
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/cloneDeep.d.ts	
@@ -0,0 +1,2 @@
+import { cloneDeep } from "../fp";
+export = cloneDeep;
diff --git a/jtg js/node_modules/@types/lodash/fp/cloneDeepWith.d.ts b/jtg js/node_modules/@types/lodash/fp/cloneDeepWith.d.ts
new file mode 100644
index 0000000..57cf5af
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/cloneDeepWith.d.ts	
@@ -0,0 +1,2 @@
+import { cloneDeepWith } from "../fp";
+export = cloneDeepWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/cloneWith.d.ts b/jtg js/node_modules/@types/lodash/fp/cloneWith.d.ts
new file mode 100644
index 0000000..9c63e13
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/cloneWith.d.ts	
@@ -0,0 +1,2 @@
+import { cloneWith } from "../fp";
+export = cloneWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/compact.d.ts b/jtg js/node_modules/@types/lodash/fp/compact.d.ts
new file mode 100644
index 0000000..6ca1547
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/compact.d.ts	
@@ -0,0 +1,2 @@
+import { compact } from "../fp";
+export = compact;
diff --git a/jtg js/node_modules/@types/lodash/fp/complement.d.ts b/jtg js/node_modules/@types/lodash/fp/complement.d.ts
new file mode 100644
index 0000000..e4c3112
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/complement.d.ts	
@@ -0,0 +1,2 @@
+import { complement } from "../fp";
+export = complement;
diff --git a/jtg js/node_modules/@types/lodash/fp/compose.d.ts b/jtg js/node_modules/@types/lodash/fp/compose.d.ts
new file mode 100644
index 0000000..7950c7c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/compose.d.ts	
@@ -0,0 +1,2 @@
+import { compose } from "../fp";
+export = compose;
diff --git a/jtg js/node_modules/@types/lodash/fp/concat.d.ts b/jtg js/node_modules/@types/lodash/fp/concat.d.ts
new file mode 100644
index 0000000..5e109d1
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/concat.d.ts	
@@ -0,0 +1,2 @@
+import { concat } from "../fp";
+export = concat;
diff --git a/jtg js/node_modules/@types/lodash/fp/cond.d.ts b/jtg js/node_modules/@types/lodash/fp/cond.d.ts
new file mode 100644
index 0000000..b9216e3
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/cond.d.ts	
@@ -0,0 +1,2 @@
+import { cond } from "../fp";
+export = cond;
diff --git a/jtg js/node_modules/@types/lodash/fp/conforms.d.ts b/jtg js/node_modules/@types/lodash/fp/conforms.d.ts
new file mode 100644
index 0000000..9bd3353
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/conforms.d.ts	
@@ -0,0 +1,2 @@
+import { conforms } from "../fp";
+export = conforms;
diff --git a/jtg js/node_modules/@types/lodash/fp/conformsTo.d.ts b/jtg js/node_modules/@types/lodash/fp/conformsTo.d.ts
new file mode 100644
index 0000000..ad17280
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/conformsTo.d.ts	
@@ -0,0 +1,2 @@
+import { conformsTo } from "../fp";
+export = conformsTo;
diff --git a/jtg js/node_modules/@types/lodash/fp/constant.d.ts b/jtg js/node_modules/@types/lodash/fp/constant.d.ts
new file mode 100644
index 0000000..ef80ff5
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/constant.d.ts	
@@ -0,0 +1,2 @@
+import { constant } from "../fp";
+export = constant;
diff --git a/jtg js/node_modules/@types/lodash/fp/contains.d.ts b/jtg js/node_modules/@types/lodash/fp/contains.d.ts
new file mode 100644
index 0000000..6c29e95
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/contains.d.ts	
@@ -0,0 +1,2 @@
+import { contains } from "../fp";
+export = contains;
diff --git a/jtg js/node_modules/@types/lodash/fp/convert.d.ts b/jtg js/node_modules/@types/lodash/fp/convert.d.ts
new file mode 100644
index 0000000..c06ecd9
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/convert.d.ts	
@@ -0,0 +1,15 @@
+interface ConvertOptions {
+    cap?: boolean;
+    curry?: boolean;
+    fixed?: boolean;
+    immutable?: boolean;
+    rearg?: boolean;
+}
+
+interface Convert {
+    (func: object, options?: ConvertOptions): any;
+    (name: string, func: (...args: any[]) => any, options?: ConvertOptions): any;
+}
+
+declare const convert: Convert;
+export = convert;
diff --git a/jtg js/node_modules/@types/lodash/fp/countBy.d.ts b/jtg js/node_modules/@types/lodash/fp/countBy.d.ts
new file mode 100644
index 0000000..e3725c3
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/countBy.d.ts	
@@ -0,0 +1,2 @@
+import { countBy } from "../fp";
+export = countBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/create.d.ts b/jtg js/node_modules/@types/lodash/fp/create.d.ts
new file mode 100644
index 0000000..2818e10
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/create.d.ts	
@@ -0,0 +1,2 @@
+import { create } from "../fp";
+export = create;
diff --git a/jtg js/node_modules/@types/lodash/fp/curry.d.ts b/jtg js/node_modules/@types/lodash/fp/curry.d.ts
new file mode 100644
index 0000000..e8fcf1d
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/curry.d.ts	
@@ -0,0 +1,2 @@
+import { curry } from "../fp";
+export = curry;
diff --git a/jtg js/node_modules/@types/lodash/fp/curryN.d.ts b/jtg js/node_modules/@types/lodash/fp/curryN.d.ts
new file mode 100644
index 0000000..55b579b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/curryN.d.ts	
@@ -0,0 +1,2 @@
+import { curryN } from "../fp";
+export = curryN;
diff --git a/jtg js/node_modules/@types/lodash/fp/curryRight.d.ts b/jtg js/node_modules/@types/lodash/fp/curryRight.d.ts
new file mode 100644
index 0000000..d431f3c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/curryRight.d.ts	
@@ -0,0 +1,2 @@
+import { curryRight } from "../fp";
+export = curryRight;
diff --git a/jtg js/node_modules/@types/lodash/fp/curryRightN.d.ts b/jtg js/node_modules/@types/lodash/fp/curryRightN.d.ts
new file mode 100644
index 0000000..89866d1
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/curryRightN.d.ts	
@@ -0,0 +1,2 @@
+import { curryRightN } from "../fp";
+export = curryRightN;
diff --git a/jtg js/node_modules/@types/lodash/fp/debounce.d.ts b/jtg js/node_modules/@types/lodash/fp/debounce.d.ts
new file mode 100644
index 0000000..88b003c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/debounce.d.ts	
@@ -0,0 +1,2 @@
+import { debounce } from "../fp";
+export = debounce;
diff --git a/jtg js/node_modules/@types/lodash/fp/deburr.d.ts b/jtg js/node_modules/@types/lodash/fp/deburr.d.ts
new file mode 100644
index 0000000..769abfb
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/deburr.d.ts	
@@ -0,0 +1,2 @@
+import { deburr } from "../fp";
+export = deburr;
diff --git a/jtg js/node_modules/@types/lodash/fp/defaultTo.d.ts b/jtg js/node_modules/@types/lodash/fp/defaultTo.d.ts
new file mode 100644
index 0000000..e02cc46
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/defaultTo.d.ts	
@@ -0,0 +1,2 @@
+import { defaultTo } from "../fp";
+export = defaultTo;
diff --git a/jtg js/node_modules/@types/lodash/fp/defaults.d.ts b/jtg js/node_modules/@types/lodash/fp/defaults.d.ts
new file mode 100644
index 0000000..132e47b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/defaults.d.ts	
@@ -0,0 +1,2 @@
+import { defaults } from "../fp";
+export = defaults;
diff --git a/jtg js/node_modules/@types/lodash/fp/defaultsAll.d.ts b/jtg js/node_modules/@types/lodash/fp/defaultsAll.d.ts
new file mode 100644
index 0000000..1f2a330
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/defaultsAll.d.ts	
@@ -0,0 +1,2 @@
+import { defaultsAll } from "../fp";
+export = defaultsAll;
diff --git a/jtg js/node_modules/@types/lodash/fp/defaultsDeep.d.ts b/jtg js/node_modules/@types/lodash/fp/defaultsDeep.d.ts
new file mode 100644
index 0000000..6268a02
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/defaultsDeep.d.ts	
@@ -0,0 +1,2 @@
+import { defaultsDeep } from "../fp";
+export = defaultsDeep;
diff --git a/jtg js/node_modules/@types/lodash/fp/defaultsDeepAll.d.ts b/jtg js/node_modules/@types/lodash/fp/defaultsDeepAll.d.ts
new file mode 100644
index 0000000..7791666
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/defaultsDeepAll.d.ts	
@@ -0,0 +1,2 @@
+import { defaultsDeepAll } from "../fp";
+export = defaultsDeepAll;
diff --git a/jtg js/node_modules/@types/lodash/fp/defer.d.ts b/jtg js/node_modules/@types/lodash/fp/defer.d.ts
new file mode 100644
index 0000000..f8be4ae
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/defer.d.ts	
@@ -0,0 +1,2 @@
+import { defer } from "../fp";
+export = defer;
diff --git a/jtg js/node_modules/@types/lodash/fp/delay.d.ts b/jtg js/node_modules/@types/lodash/fp/delay.d.ts
new file mode 100644
index 0000000..2f0c399
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/delay.d.ts	
@@ -0,0 +1,2 @@
+import { delay } from "../fp";
+export = delay;
diff --git a/jtg js/node_modules/@types/lodash/fp/difference.d.ts b/jtg js/node_modules/@types/lodash/fp/difference.d.ts
new file mode 100644
index 0000000..9448085
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/difference.d.ts	
@@ -0,0 +1,2 @@
+import { difference } from "../fp";
+export = difference;
diff --git a/jtg js/node_modules/@types/lodash/fp/differenceBy.d.ts b/jtg js/node_modules/@types/lodash/fp/differenceBy.d.ts
new file mode 100644
index 0000000..52ba5b8
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/differenceBy.d.ts	
@@ -0,0 +1,2 @@
+import { differenceBy } from "../fp";
+export = differenceBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/differenceWith.d.ts b/jtg js/node_modules/@types/lodash/fp/differenceWith.d.ts
new file mode 100644
index 0000000..fd3c9a2
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/differenceWith.d.ts	
@@ -0,0 +1,2 @@
+import { differenceWith } from "../fp";
+export = differenceWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/dissoc.d.ts b/jtg js/node_modules/@types/lodash/fp/dissoc.d.ts
new file mode 100644
index 0000000..9b0fd6b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/dissoc.d.ts	
@@ -0,0 +1,2 @@
+import { dissoc } from "../fp";
+export = dissoc;
diff --git a/jtg js/node_modules/@types/lodash/fp/dissocPath.d.ts b/jtg js/node_modules/@types/lodash/fp/dissocPath.d.ts
new file mode 100644
index 0000000..a201aa4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/dissocPath.d.ts	
@@ -0,0 +1,2 @@
+import { dissocPath } from "../fp";
+export = dissocPath;
diff --git a/jtg js/node_modules/@types/lodash/fp/divide.d.ts b/jtg js/node_modules/@types/lodash/fp/divide.d.ts
new file mode 100644
index 0000000..5cd02e4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/divide.d.ts	
@@ -0,0 +1,2 @@
+import { divide } from "../fp";
+export = divide;
diff --git a/jtg js/node_modules/@types/lodash/fp/drop.d.ts b/jtg js/node_modules/@types/lodash/fp/drop.d.ts
new file mode 100644
index 0000000..bc3b9b2
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/drop.d.ts	
@@ -0,0 +1,2 @@
+import { drop } from "../fp";
+export = drop;
diff --git a/jtg js/node_modules/@types/lodash/fp/dropLast.d.ts b/jtg js/node_modules/@types/lodash/fp/dropLast.d.ts
new file mode 100644
index 0000000..1dd388a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/dropLast.d.ts	
@@ -0,0 +1,2 @@
+import { dropLast } from "../fp";
+export = dropLast;
diff --git a/jtg js/node_modules/@types/lodash/fp/dropLastWhile.d.ts b/jtg js/node_modules/@types/lodash/fp/dropLastWhile.d.ts
new file mode 100644
index 0000000..97529a6
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/dropLastWhile.d.ts	
@@ -0,0 +1,2 @@
+import { dropLastWhile } from "../fp";
+export = dropLastWhile;
diff --git a/jtg js/node_modules/@types/lodash/fp/dropRight.d.ts b/jtg js/node_modules/@types/lodash/fp/dropRight.d.ts
new file mode 100644
index 0000000..a2740ff
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/dropRight.d.ts	
@@ -0,0 +1,2 @@
+import { dropRight } from "../fp";
+export = dropRight;
diff --git a/jtg js/node_modules/@types/lodash/fp/dropRightWhile.d.ts b/jtg js/node_modules/@types/lodash/fp/dropRightWhile.d.ts
new file mode 100644
index 0000000..1a5aa5f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/dropRightWhile.d.ts	
@@ -0,0 +1,2 @@
+import { dropRightWhile } from "../fp";
+export = dropRightWhile;
diff --git a/jtg js/node_modules/@types/lodash/fp/dropWhile.d.ts b/jtg js/node_modules/@types/lodash/fp/dropWhile.d.ts
new file mode 100644
index 0000000..2cab8d8
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/dropWhile.d.ts	
@@ -0,0 +1,2 @@
+import { dropWhile } from "../fp";
+export = dropWhile;
diff --git a/jtg js/node_modules/@types/lodash/fp/each.d.ts b/jtg js/node_modules/@types/lodash/fp/each.d.ts
new file mode 100644
index 0000000..af1d3b2
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/each.d.ts	
@@ -0,0 +1,2 @@
+import { each } from "../fp";
+export = each;
diff --git a/jtg js/node_modules/@types/lodash/fp/eachRight.d.ts b/jtg js/node_modules/@types/lodash/fp/eachRight.d.ts
new file mode 100644
index 0000000..5ca2934
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/eachRight.d.ts	
@@ -0,0 +1,2 @@
+import { eachRight } from "../fp";
+export = eachRight;
diff --git a/jtg js/node_modules/@types/lodash/fp/endsWith.d.ts b/jtg js/node_modules/@types/lodash/fp/endsWith.d.ts
new file mode 100644
index 0000000..7e1b243
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/endsWith.d.ts	
@@ -0,0 +1,2 @@
+import { endsWith } from "../fp";
+export = endsWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/entries.d.ts b/jtg js/node_modules/@types/lodash/fp/entries.d.ts
new file mode 100644
index 0000000..534c7bd
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/entries.d.ts	
@@ -0,0 +1,2 @@
+import { entries } from "../fp";
+export = entries;
diff --git a/jtg js/node_modules/@types/lodash/fp/entriesIn.d.ts b/jtg js/node_modules/@types/lodash/fp/entriesIn.d.ts
new file mode 100644
index 0000000..932b17f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/entriesIn.d.ts	
@@ -0,0 +1,2 @@
+import { entriesIn } from "../fp";
+export = entriesIn;
diff --git a/jtg js/node_modules/@types/lodash/fp/eq.d.ts b/jtg js/node_modules/@types/lodash/fp/eq.d.ts
new file mode 100644
index 0000000..4778846
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/eq.d.ts	
@@ -0,0 +1,2 @@
+import { eq } from "../fp";
+export = eq;
diff --git a/jtg js/node_modules/@types/lodash/fp/equals.d.ts b/jtg js/node_modules/@types/lodash/fp/equals.d.ts
new file mode 100644
index 0000000..18ec108
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/equals.d.ts	
@@ -0,0 +1,2 @@
+import { equals } from "../fp";
+export = equals;
diff --git a/jtg js/node_modules/@types/lodash/fp/escape.d.ts b/jtg js/node_modules/@types/lodash/fp/escape.d.ts
new file mode 100644
index 0000000..36e7e87
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/escape.d.ts	
@@ -0,0 +1,2 @@
+import { escape } from "../fp";
+export = escape;
diff --git a/jtg js/node_modules/@types/lodash/fp/escapeRegExp.d.ts b/jtg js/node_modules/@types/lodash/fp/escapeRegExp.d.ts
new file mode 100644
index 0000000..6adc20e
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/escapeRegExp.d.ts	
@@ -0,0 +1,2 @@
+import { escapeRegExp } from "../fp";
+export = escapeRegExp;
diff --git a/jtg js/node_modules/@types/lodash/fp/every.d.ts b/jtg js/node_modules/@types/lodash/fp/every.d.ts
new file mode 100644
index 0000000..7fbeaf7
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/every.d.ts	
@@ -0,0 +1,2 @@
+import { every } from "../fp";
+export = every;
diff --git a/jtg js/node_modules/@types/lodash/fp/extend.d.ts b/jtg js/node_modules/@types/lodash/fp/extend.d.ts
new file mode 100644
index 0000000..cbe294e
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/extend.d.ts	
@@ -0,0 +1,2 @@
+import { extend } from "../fp";
+export = extend;
diff --git a/jtg js/node_modules/@types/lodash/fp/extendAll.d.ts b/jtg js/node_modules/@types/lodash/fp/extendAll.d.ts
new file mode 100644
index 0000000..92cb3d6
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/extendAll.d.ts	
@@ -0,0 +1,2 @@
+import { extendAll } from "../fp";
+export = extendAll;
diff --git a/jtg js/node_modules/@types/lodash/fp/extendAllWith.d.ts b/jtg js/node_modules/@types/lodash/fp/extendAllWith.d.ts
new file mode 100644
index 0000000..712d1d8
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/extendAllWith.d.ts	
@@ -0,0 +1,2 @@
+import { extendAllWith } from "../fp";
+export = extendAllWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/extendWith.d.ts b/jtg js/node_modules/@types/lodash/fp/extendWith.d.ts
new file mode 100644
index 0000000..9681360
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/extendWith.d.ts	
@@ -0,0 +1,2 @@
+import { extendWith } from "../fp";
+export = extendWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/fill.d.ts b/jtg js/node_modules/@types/lodash/fp/fill.d.ts
new file mode 100644
index 0000000..5778015
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/fill.d.ts	
@@ -0,0 +1,2 @@
+import { fill } from "../fp";
+export = fill;
diff --git a/jtg js/node_modules/@types/lodash/fp/filter.d.ts b/jtg js/node_modules/@types/lodash/fp/filter.d.ts
new file mode 100644
index 0000000..8619741
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/filter.d.ts	
@@ -0,0 +1,2 @@
+import { filter } from "../fp";
+export = filter;
diff --git a/jtg js/node_modules/@types/lodash/fp/find.d.ts b/jtg js/node_modules/@types/lodash/fp/find.d.ts
new file mode 100644
index 0000000..06418fb
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/find.d.ts	
@@ -0,0 +1,2 @@
+import { find } from "../fp";
+export = find;
diff --git a/jtg js/node_modules/@types/lodash/fp/findFrom.d.ts b/jtg js/node_modules/@types/lodash/fp/findFrom.d.ts
new file mode 100644
index 0000000..64275d0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/findFrom.d.ts	
@@ -0,0 +1,2 @@
+import { findFrom } from "../fp";
+export = findFrom;
diff --git a/jtg js/node_modules/@types/lodash/fp/findIndex.d.ts b/jtg js/node_modules/@types/lodash/fp/findIndex.d.ts
new file mode 100644
index 0000000..77d1f7b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/findIndex.d.ts	
@@ -0,0 +1,2 @@
+import { findIndex } from "../fp";
+export = findIndex;
diff --git a/jtg js/node_modules/@types/lodash/fp/findIndexFrom.d.ts b/jtg js/node_modules/@types/lodash/fp/findIndexFrom.d.ts
new file mode 100644
index 0000000..22330ad
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/findIndexFrom.d.ts	
@@ -0,0 +1,2 @@
+import { findIndexFrom } from "../fp";
+export = findIndexFrom;
diff --git a/jtg js/node_modules/@types/lodash/fp/findKey.d.ts b/jtg js/node_modules/@types/lodash/fp/findKey.d.ts
new file mode 100644
index 0000000..c5a225a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/findKey.d.ts	
@@ -0,0 +1,2 @@
+import { findKey } from "../fp";
+export = findKey;
diff --git a/jtg js/node_modules/@types/lodash/fp/findLast.d.ts b/jtg js/node_modules/@types/lodash/fp/findLast.d.ts
new file mode 100644
index 0000000..b400c94
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/findLast.d.ts	
@@ -0,0 +1,2 @@
+import { findLast } from "../fp";
+export = findLast;
diff --git a/jtg js/node_modules/@types/lodash/fp/findLastFrom.d.ts b/jtg js/node_modules/@types/lodash/fp/findLastFrom.d.ts
new file mode 100644
index 0000000..1f034df
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/findLastFrom.d.ts	
@@ -0,0 +1,2 @@
+import { findLastFrom } from "../fp";
+export = findLastFrom;
diff --git a/jtg js/node_modules/@types/lodash/fp/findLastIndex.d.ts b/jtg js/node_modules/@types/lodash/fp/findLastIndex.d.ts
new file mode 100644
index 0000000..51ee410
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/findLastIndex.d.ts	
@@ -0,0 +1,2 @@
+import { findLastIndex } from "../fp";
+export = findLastIndex;
diff --git a/jtg js/node_modules/@types/lodash/fp/findLastIndexFrom.d.ts b/jtg js/node_modules/@types/lodash/fp/findLastIndexFrom.d.ts
new file mode 100644
index 0000000..08bd53a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/findLastIndexFrom.d.ts	
@@ -0,0 +1,2 @@
+import { findLastIndexFrom } from "../fp";
+export = findLastIndexFrom;
diff --git a/jtg js/node_modules/@types/lodash/fp/findLastKey.d.ts b/jtg js/node_modules/@types/lodash/fp/findLastKey.d.ts
new file mode 100644
index 0000000..7437a9d
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/findLastKey.d.ts	
@@ -0,0 +1,2 @@
+import { findLastKey } from "../fp";
+export = findLastKey;
diff --git a/jtg js/node_modules/@types/lodash/fp/first.d.ts b/jtg js/node_modules/@types/lodash/fp/first.d.ts
new file mode 100644
index 0000000..4554ad0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/first.d.ts	
@@ -0,0 +1,2 @@
+import { first } from "../fp";
+export = first;
diff --git a/jtg js/node_modules/@types/lodash/fp/flatMap.d.ts b/jtg js/node_modules/@types/lodash/fp/flatMap.d.ts
new file mode 100644
index 0000000..eb6d804
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/flatMap.d.ts	
@@ -0,0 +1,2 @@
+import { flatMap } from "../fp";
+export = flatMap;
diff --git a/jtg js/node_modules/@types/lodash/fp/flatMapDeep.d.ts b/jtg js/node_modules/@types/lodash/fp/flatMapDeep.d.ts
new file mode 100644
index 0000000..0ce4db4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/flatMapDeep.d.ts	
@@ -0,0 +1,2 @@
+import { flatMapDeep } from "../fp";
+export = flatMapDeep;
diff --git a/jtg js/node_modules/@types/lodash/fp/flatMapDepth.d.ts b/jtg js/node_modules/@types/lodash/fp/flatMapDepth.d.ts
new file mode 100644
index 0000000..b60af92
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/flatMapDepth.d.ts	
@@ -0,0 +1,2 @@
+import { flatMapDepth } from "../fp";
+export = flatMapDepth;
diff --git a/jtg js/node_modules/@types/lodash/fp/flatten.d.ts b/jtg js/node_modules/@types/lodash/fp/flatten.d.ts
new file mode 100644
index 0000000..02c051f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/flatten.d.ts	
@@ -0,0 +1,2 @@
+import { flatten } from "../fp";
+export = flatten;
diff --git a/jtg js/node_modules/@types/lodash/fp/flattenDeep.d.ts b/jtg js/node_modules/@types/lodash/fp/flattenDeep.d.ts
new file mode 100644
index 0000000..44b40e3
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/flattenDeep.d.ts	
@@ -0,0 +1,2 @@
+import { flattenDeep } from "../fp";
+export = flattenDeep;
diff --git a/jtg js/node_modules/@types/lodash/fp/flattenDepth.d.ts b/jtg js/node_modules/@types/lodash/fp/flattenDepth.d.ts
new file mode 100644
index 0000000..f046f20
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/flattenDepth.d.ts	
@@ -0,0 +1,2 @@
+import { flattenDepth } from "../fp";
+export = flattenDepth;
diff --git a/jtg js/node_modules/@types/lodash/fp/flip.d.ts b/jtg js/node_modules/@types/lodash/fp/flip.d.ts
new file mode 100644
index 0000000..e5b3b7d
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/flip.d.ts	
@@ -0,0 +1,2 @@
+import { flip } from "../fp";
+export = flip;
diff --git a/jtg js/node_modules/@types/lodash/fp/floor.d.ts b/jtg js/node_modules/@types/lodash/fp/floor.d.ts
new file mode 100644
index 0000000..167ab95
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/floor.d.ts	
@@ -0,0 +1,2 @@
+import { floor } from "../fp";
+export = floor;
diff --git a/jtg js/node_modules/@types/lodash/fp/flow.d.ts b/jtg js/node_modules/@types/lodash/fp/flow.d.ts
new file mode 100644
index 0000000..97f0fb8
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/flow.d.ts	
@@ -0,0 +1,2 @@
+import { flow } from "../fp";
+export = flow;
diff --git a/jtg js/node_modules/@types/lodash/fp/flowRight.d.ts b/jtg js/node_modules/@types/lodash/fp/flowRight.d.ts
new file mode 100644
index 0000000..f148fea
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/flowRight.d.ts	
@@ -0,0 +1,2 @@
+import { flowRight } from "../fp";
+export = flowRight;
diff --git a/jtg js/node_modules/@types/lodash/fp/forEach.d.ts b/jtg js/node_modules/@types/lodash/fp/forEach.d.ts
new file mode 100644
index 0000000..f8aa7a4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/forEach.d.ts	
@@ -0,0 +1,2 @@
+import { forEach } from "../fp";
+export = forEach;
diff --git a/jtg js/node_modules/@types/lodash/fp/forEachRight.d.ts b/jtg js/node_modules/@types/lodash/fp/forEachRight.d.ts
new file mode 100644
index 0000000..135a424
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/forEachRight.d.ts	
@@ -0,0 +1,2 @@
+import { forEachRight } from "../fp";
+export = forEachRight;
diff --git a/jtg js/node_modules/@types/lodash/fp/forIn.d.ts b/jtg js/node_modules/@types/lodash/fp/forIn.d.ts
new file mode 100644
index 0000000..dab37b1
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/forIn.d.ts	
@@ -0,0 +1,2 @@
+import { forIn } from "../fp";
+export = forIn;
diff --git a/jtg js/node_modules/@types/lodash/fp/forInRight.d.ts b/jtg js/node_modules/@types/lodash/fp/forInRight.d.ts
new file mode 100644
index 0000000..c560df0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/forInRight.d.ts	
@@ -0,0 +1,2 @@
+import { forInRight } from "../fp";
+export = forInRight;
diff --git a/jtg js/node_modules/@types/lodash/fp/forOwn.d.ts b/jtg js/node_modules/@types/lodash/fp/forOwn.d.ts
new file mode 100644
index 0000000..7099c48
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/forOwn.d.ts	
@@ -0,0 +1,2 @@
+import { forOwn } from "../fp";
+export = forOwn;
diff --git a/jtg js/node_modules/@types/lodash/fp/forOwnRight.d.ts b/jtg js/node_modules/@types/lodash/fp/forOwnRight.d.ts
new file mode 100644
index 0000000..f1e3928
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/forOwnRight.d.ts	
@@ -0,0 +1,2 @@
+import { forOwnRight } from "../fp";
+export = forOwnRight;
diff --git a/jtg js/node_modules/@types/lodash/fp/fromPairs.d.ts b/jtg js/node_modules/@types/lodash/fp/fromPairs.d.ts
new file mode 100644
index 0000000..b0d0082
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/fromPairs.d.ts	
@@ -0,0 +1,2 @@
+import { fromPairs } from "../fp";
+export = fromPairs;
diff --git a/jtg js/node_modules/@types/lodash/fp/functions.d.ts b/jtg js/node_modules/@types/lodash/fp/functions.d.ts
new file mode 100644
index 0000000..727d68e
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/functions.d.ts	
@@ -0,0 +1,2 @@
+import { functions } from "../fp";
+export = functions;
diff --git a/jtg js/node_modules/@types/lodash/fp/functionsIn.d.ts b/jtg js/node_modules/@types/lodash/fp/functionsIn.d.ts
new file mode 100644
index 0000000..448746e
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/functionsIn.d.ts	
@@ -0,0 +1,2 @@
+import { functionsIn } from "../fp";
+export = functionsIn;
diff --git a/jtg js/node_modules/@types/lodash/fp/get.d.ts b/jtg js/node_modules/@types/lodash/fp/get.d.ts
new file mode 100644
index 0000000..ff3ab8b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/get.d.ts	
@@ -0,0 +1,2 @@
+import { get } from "../fp";
+export = get;
diff --git a/jtg js/node_modules/@types/lodash/fp/getOr.d.ts b/jtg js/node_modules/@types/lodash/fp/getOr.d.ts
new file mode 100644
index 0000000..ce3d5bb
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/getOr.d.ts	
@@ -0,0 +1,2 @@
+import { getOr } from "../fp";
+export = getOr;
diff --git a/jtg js/node_modules/@types/lodash/fp/groupBy.d.ts b/jtg js/node_modules/@types/lodash/fp/groupBy.d.ts
new file mode 100644
index 0000000..813830a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/groupBy.d.ts	
@@ -0,0 +1,2 @@
+import { groupBy } from "../fp";
+export = groupBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/gt.d.ts b/jtg js/node_modules/@types/lodash/fp/gt.d.ts
new file mode 100644
index 0000000..517071f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/gt.d.ts	
@@ -0,0 +1,2 @@
+import { gt } from "../fp";
+export = gt;
diff --git a/jtg js/node_modules/@types/lodash/fp/gte.d.ts b/jtg js/node_modules/@types/lodash/fp/gte.d.ts
new file mode 100644
index 0000000..5f6d85c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/gte.d.ts	
@@ -0,0 +1,2 @@
+import { gte } from "../fp";
+export = gte;
diff --git a/jtg js/node_modules/@types/lodash/fp/has.d.ts b/jtg js/node_modules/@types/lodash/fp/has.d.ts
new file mode 100644
index 0000000..8cbda7f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/has.d.ts	
@@ -0,0 +1,2 @@
+import { has } from "../fp";
+export = has;
diff --git a/jtg js/node_modules/@types/lodash/fp/hasIn.d.ts b/jtg js/node_modules/@types/lodash/fp/hasIn.d.ts
new file mode 100644
index 0000000..7e06a87
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/hasIn.d.ts	
@@ -0,0 +1,2 @@
+import { hasIn } from "../fp";
+export = hasIn;
diff --git a/jtg js/node_modules/@types/lodash/fp/head.d.ts b/jtg js/node_modules/@types/lodash/fp/head.d.ts
new file mode 100644
index 0000000..4a7d5e5
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/head.d.ts	
@@ -0,0 +1,2 @@
+import { head } from "../fp";
+export = head;
diff --git a/jtg js/node_modules/@types/lodash/fp/identical.d.ts b/jtg js/node_modules/@types/lodash/fp/identical.d.ts
new file mode 100644
index 0000000..954dff5
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/identical.d.ts	
@@ -0,0 +1,2 @@
+import { identical } from "../fp";
+export = identical;
diff --git a/jtg js/node_modules/@types/lodash/fp/identity.d.ts b/jtg js/node_modules/@types/lodash/fp/identity.d.ts
new file mode 100644
index 0000000..97e613c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/identity.d.ts	
@@ -0,0 +1,2 @@
+import { identity } from "../fp";
+export = identity;
diff --git a/jtg js/node_modules/@types/lodash/fp/inRange.d.ts b/jtg js/node_modules/@types/lodash/fp/inRange.d.ts
new file mode 100644
index 0000000..06ed312
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/inRange.d.ts	
@@ -0,0 +1,2 @@
+import { inRange } from "../fp";
+export = inRange;
diff --git a/jtg js/node_modules/@types/lodash/fp/includes.d.ts b/jtg js/node_modules/@types/lodash/fp/includes.d.ts
new file mode 100644
index 0000000..afc9984
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/includes.d.ts	
@@ -0,0 +1,2 @@
+import { includes } from "../fp";
+export = includes;
diff --git a/jtg js/node_modules/@types/lodash/fp/includesFrom.d.ts b/jtg js/node_modules/@types/lodash/fp/includesFrom.d.ts
new file mode 100644
index 0000000..13042d0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/includesFrom.d.ts	
@@ -0,0 +1,2 @@
+import { includesFrom } from "../fp";
+export = includesFrom;
diff --git a/jtg js/node_modules/@types/lodash/fp/indexBy.d.ts b/jtg js/node_modules/@types/lodash/fp/indexBy.d.ts
new file mode 100644
index 0000000..f3f75a4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/indexBy.d.ts	
@@ -0,0 +1,2 @@
+import { indexBy } from "../fp";
+export = indexBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/indexOf.d.ts b/jtg js/node_modules/@types/lodash/fp/indexOf.d.ts
new file mode 100644
index 0000000..8078c46
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/indexOf.d.ts	
@@ -0,0 +1,2 @@
+import { indexOf } from "../fp";
+export = indexOf;
diff --git a/jtg js/node_modules/@types/lodash/fp/indexOfFrom.d.ts b/jtg js/node_modules/@types/lodash/fp/indexOfFrom.d.ts
new file mode 100644
index 0000000..fe66609
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/indexOfFrom.d.ts	
@@ -0,0 +1,2 @@
+import { indexOfFrom } from "../fp";
+export = indexOfFrom;
diff --git a/jtg js/node_modules/@types/lodash/fp/init.d.ts b/jtg js/node_modules/@types/lodash/fp/init.d.ts
new file mode 100644
index 0000000..2f37ecd
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/init.d.ts	
@@ -0,0 +1,2 @@
+import { init } from "../fp";
+export = init;
diff --git a/jtg js/node_modules/@types/lodash/fp/initial.d.ts b/jtg js/node_modules/@types/lodash/fp/initial.d.ts
new file mode 100644
index 0000000..446da06
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/initial.d.ts	
@@ -0,0 +1,2 @@
+import { initial } from "../fp";
+export = initial;
diff --git a/jtg js/node_modules/@types/lodash/fp/intersection.d.ts b/jtg js/node_modules/@types/lodash/fp/intersection.d.ts
new file mode 100644
index 0000000..41d7915
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/intersection.d.ts	
@@ -0,0 +1,2 @@
+import { intersection } from "../fp";
+export = intersection;
diff --git a/jtg js/node_modules/@types/lodash/fp/intersectionBy.d.ts b/jtg js/node_modules/@types/lodash/fp/intersectionBy.d.ts
new file mode 100644
index 0000000..a123ddd
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/intersectionBy.d.ts	
@@ -0,0 +1,2 @@
+import { intersectionBy } from "../fp";
+export = intersectionBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/intersectionWith.d.ts b/jtg js/node_modules/@types/lodash/fp/intersectionWith.d.ts
new file mode 100644
index 0000000..9ad9941
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/intersectionWith.d.ts	
@@ -0,0 +1,2 @@
+import { intersectionWith } from "../fp";
+export = intersectionWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/invert.d.ts b/jtg js/node_modules/@types/lodash/fp/invert.d.ts
new file mode 100644
index 0000000..a41c2bc
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/invert.d.ts	
@@ -0,0 +1,2 @@
+import { invert } from "../fp";
+export = invert;
diff --git a/jtg js/node_modules/@types/lodash/fp/invertBy.d.ts b/jtg js/node_modules/@types/lodash/fp/invertBy.d.ts
new file mode 100644
index 0000000..e28f713
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/invertBy.d.ts	
@@ -0,0 +1,2 @@
+import { invertBy } from "../fp";
+export = invertBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/invertObj.d.ts b/jtg js/node_modules/@types/lodash/fp/invertObj.d.ts
new file mode 100644
index 0000000..2e16c4f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/invertObj.d.ts	
@@ -0,0 +1,2 @@
+import { invertObj } from "../fp";
+export = invertObj;
diff --git a/jtg js/node_modules/@types/lodash/fp/invoke.d.ts b/jtg js/node_modules/@types/lodash/fp/invoke.d.ts
new file mode 100644
index 0000000..1a9ce3b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/invoke.d.ts	
@@ -0,0 +1,2 @@
+import { invoke } from "../fp";
+export = invoke;
diff --git a/jtg js/node_modules/@types/lodash/fp/invokeArgs.d.ts b/jtg js/node_modules/@types/lodash/fp/invokeArgs.d.ts
new file mode 100644
index 0000000..8b498e0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/invokeArgs.d.ts	
@@ -0,0 +1,2 @@
+import { invokeArgs } from "../fp";
+export = invokeArgs;
diff --git a/jtg js/node_modules/@types/lodash/fp/invokeArgsMap.d.ts b/jtg js/node_modules/@types/lodash/fp/invokeArgsMap.d.ts
new file mode 100644
index 0000000..f5ba3e7
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/invokeArgsMap.d.ts	
@@ -0,0 +1,2 @@
+import { invokeArgsMap } from "../fp";
+export = invokeArgsMap;
diff --git a/jtg js/node_modules/@types/lodash/fp/invokeMap.d.ts b/jtg js/node_modules/@types/lodash/fp/invokeMap.d.ts
new file mode 100644
index 0000000..9f0aea9
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/invokeMap.d.ts	
@@ -0,0 +1,2 @@
+import { invokeMap } from "../fp";
+export = invokeMap;
diff --git a/jtg js/node_modules/@types/lodash/fp/isArguments.d.ts b/jtg js/node_modules/@types/lodash/fp/isArguments.d.ts
new file mode 100644
index 0000000..23c438c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isArguments.d.ts	
@@ -0,0 +1,2 @@
+import { isArguments } from "../fp";
+export = isArguments;
diff --git a/jtg js/node_modules/@types/lodash/fp/isArray.d.ts b/jtg js/node_modules/@types/lodash/fp/isArray.d.ts
new file mode 100644
index 0000000..dadecce
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isArray.d.ts	
@@ -0,0 +1,2 @@
+import { isArray } from "../fp";
+export = isArray;
diff --git a/jtg js/node_modules/@types/lodash/fp/isArrayBuffer.d.ts b/jtg js/node_modules/@types/lodash/fp/isArrayBuffer.d.ts
new file mode 100644
index 0000000..3201834
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isArrayBuffer.d.ts	
@@ -0,0 +1,2 @@
+import { isArrayBuffer } from "../fp";
+export = isArrayBuffer;
diff --git a/jtg js/node_modules/@types/lodash/fp/isArrayLike.d.ts b/jtg js/node_modules/@types/lodash/fp/isArrayLike.d.ts
new file mode 100644
index 0000000..2be9b54
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isArrayLike.d.ts	
@@ -0,0 +1,2 @@
+import { isArrayLike } from "../fp";
+export = isArrayLike;
diff --git a/jtg js/node_modules/@types/lodash/fp/isArrayLikeObject.d.ts b/jtg js/node_modules/@types/lodash/fp/isArrayLikeObject.d.ts
new file mode 100644
index 0000000..709f513
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isArrayLikeObject.d.ts	
@@ -0,0 +1,2 @@
+import { isArrayLikeObject } from "../fp";
+export = isArrayLikeObject;
diff --git a/jtg js/node_modules/@types/lodash/fp/isBoolean.d.ts b/jtg js/node_modules/@types/lodash/fp/isBoolean.d.ts
new file mode 100644
index 0000000..605cb2c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isBoolean.d.ts	
@@ -0,0 +1,2 @@
+import { isBoolean } from "../fp";
+export = isBoolean;
diff --git a/jtg js/node_modules/@types/lodash/fp/isBuffer.d.ts b/jtg js/node_modules/@types/lodash/fp/isBuffer.d.ts
new file mode 100644
index 0000000..3d06b54
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isBuffer.d.ts	
@@ -0,0 +1,2 @@
+import { isBuffer } from "../fp";
+export = isBuffer;
diff --git a/jtg js/node_modules/@types/lodash/fp/isDate.d.ts b/jtg js/node_modules/@types/lodash/fp/isDate.d.ts
new file mode 100644
index 0000000..979594f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isDate.d.ts	
@@ -0,0 +1,2 @@
+import { isDate } from "../fp";
+export = isDate;
diff --git a/jtg js/node_modules/@types/lodash/fp/isElement.d.ts b/jtg js/node_modules/@types/lodash/fp/isElement.d.ts
new file mode 100644
index 0000000..26739ad
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isElement.d.ts	
@@ -0,0 +1,2 @@
+import { isElement } from "../fp";
+export = isElement;
diff --git a/jtg js/node_modules/@types/lodash/fp/isEmpty.d.ts b/jtg js/node_modules/@types/lodash/fp/isEmpty.d.ts
new file mode 100644
index 0000000..ed9b33f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isEmpty.d.ts	
@@ -0,0 +1,2 @@
+import { isEmpty } from "../fp";
+export = isEmpty;
diff --git a/jtg js/node_modules/@types/lodash/fp/isEqual.d.ts b/jtg js/node_modules/@types/lodash/fp/isEqual.d.ts
new file mode 100644
index 0000000..0a51c5c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isEqual.d.ts	
@@ -0,0 +1,2 @@
+import { isEqual } from "../fp";
+export = isEqual;
diff --git a/jtg js/node_modules/@types/lodash/fp/isEqualWith.d.ts b/jtg js/node_modules/@types/lodash/fp/isEqualWith.d.ts
new file mode 100644
index 0000000..27fa441
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isEqualWith.d.ts	
@@ -0,0 +1,2 @@
+import { isEqualWith } from "../fp";
+export = isEqualWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/isError.d.ts b/jtg js/node_modules/@types/lodash/fp/isError.d.ts
new file mode 100644
index 0000000..4adb988
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isError.d.ts	
@@ -0,0 +1,2 @@
+import { isError } from "../fp";
+export = isError;
diff --git a/jtg js/node_modules/@types/lodash/fp/isFinite.d.ts b/jtg js/node_modules/@types/lodash/fp/isFinite.d.ts
new file mode 100644
index 0000000..5641edc
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isFinite.d.ts	
@@ -0,0 +1,2 @@
+import { isFinite } from "../fp";
+export = isFinite;
diff --git a/jtg js/node_modules/@types/lodash/fp/isFunction.d.ts b/jtg js/node_modules/@types/lodash/fp/isFunction.d.ts
new file mode 100644
index 0000000..3404e74
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isFunction.d.ts	
@@ -0,0 +1,2 @@
+import { isFunction } from "../fp";
+export = isFunction;
diff --git a/jtg js/node_modules/@types/lodash/fp/isInteger.d.ts b/jtg js/node_modules/@types/lodash/fp/isInteger.d.ts
new file mode 100644
index 0000000..310df93
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isInteger.d.ts	
@@ -0,0 +1,2 @@
+import { isInteger } from "../fp";
+export = isInteger;
diff --git a/jtg js/node_modules/@types/lodash/fp/isLength.d.ts b/jtg js/node_modules/@types/lodash/fp/isLength.d.ts
new file mode 100644
index 0000000..3073b67
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isLength.d.ts	
@@ -0,0 +1,2 @@
+import { isLength } from "../fp";
+export = isLength;
diff --git a/jtg js/node_modules/@types/lodash/fp/isMap.d.ts b/jtg js/node_modules/@types/lodash/fp/isMap.d.ts
new file mode 100644
index 0000000..e76745c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isMap.d.ts	
@@ -0,0 +1,2 @@
+import { isMap } from "../fp";
+export = isMap;
diff --git a/jtg js/node_modules/@types/lodash/fp/isMatch.d.ts b/jtg js/node_modules/@types/lodash/fp/isMatch.d.ts
new file mode 100644
index 0000000..58a0a2d
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isMatch.d.ts	
@@ -0,0 +1,2 @@
+import { isMatch } from "../fp";
+export = isMatch;
diff --git a/jtg js/node_modules/@types/lodash/fp/isMatchWith.d.ts b/jtg js/node_modules/@types/lodash/fp/isMatchWith.d.ts
new file mode 100644
index 0000000..40ff3a6
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isMatchWith.d.ts	
@@ -0,0 +1,2 @@
+import { isMatchWith } from "../fp";
+export = isMatchWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/isNaN.d.ts b/jtg js/node_modules/@types/lodash/fp/isNaN.d.ts
new file mode 100644
index 0000000..2f92885
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isNaN.d.ts	
@@ -0,0 +1,2 @@
+import { isNaN } from "../fp";
+export = isNaN;
diff --git a/jtg js/node_modules/@types/lodash/fp/isNative.d.ts b/jtg js/node_modules/@types/lodash/fp/isNative.d.ts
new file mode 100644
index 0000000..6e189a8
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isNative.d.ts	
@@ -0,0 +1,2 @@
+import { isNative } from "../fp";
+export = isNative;
diff --git a/jtg js/node_modules/@types/lodash/fp/isNil.d.ts b/jtg js/node_modules/@types/lodash/fp/isNil.d.ts
new file mode 100644
index 0000000..0baee7f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isNil.d.ts	
@@ -0,0 +1,2 @@
+import { isNil } from "../fp";
+export = isNil;
diff --git a/jtg js/node_modules/@types/lodash/fp/isNull.d.ts b/jtg js/node_modules/@types/lodash/fp/isNull.d.ts
new file mode 100644
index 0000000..5e5fad5
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isNull.d.ts	
@@ -0,0 +1,2 @@
+import { isNull } from "../fp";
+export = isNull;
diff --git a/jtg js/node_modules/@types/lodash/fp/isNumber.d.ts b/jtg js/node_modules/@types/lodash/fp/isNumber.d.ts
new file mode 100644
index 0000000..93368f1
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isNumber.d.ts	
@@ -0,0 +1,2 @@
+import { isNumber } from "../fp";
+export = isNumber;
diff --git a/jtg js/node_modules/@types/lodash/fp/isObject.d.ts b/jtg js/node_modules/@types/lodash/fp/isObject.d.ts
new file mode 100644
index 0000000..7e9e257
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isObject.d.ts	
@@ -0,0 +1,2 @@
+import { isObject } from "../fp";
+export = isObject;
diff --git a/jtg js/node_modules/@types/lodash/fp/isObjectLike.d.ts b/jtg js/node_modules/@types/lodash/fp/isObjectLike.d.ts
new file mode 100644
index 0000000..ba03ddc
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isObjectLike.d.ts	
@@ -0,0 +1,2 @@
+import { isObjectLike } from "../fp";
+export = isObjectLike;
diff --git a/jtg js/node_modules/@types/lodash/fp/isPlainObject.d.ts b/jtg js/node_modules/@types/lodash/fp/isPlainObject.d.ts
new file mode 100644
index 0000000..87da4bd
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isPlainObject.d.ts	
@@ -0,0 +1,2 @@
+import { isPlainObject } from "../fp";
+export = isPlainObject;
diff --git a/jtg js/node_modules/@types/lodash/fp/isRegExp.d.ts b/jtg js/node_modules/@types/lodash/fp/isRegExp.d.ts
new file mode 100644
index 0000000..47edf50
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isRegExp.d.ts	
@@ -0,0 +1,2 @@
+import { isRegExp } from "../fp";
+export = isRegExp;
diff --git a/jtg js/node_modules/@types/lodash/fp/isSafeInteger.d.ts b/jtg js/node_modules/@types/lodash/fp/isSafeInteger.d.ts
new file mode 100644
index 0000000..a32b12c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isSafeInteger.d.ts	
@@ -0,0 +1,2 @@
+import { isSafeInteger } from "../fp";
+export = isSafeInteger;
diff --git a/jtg js/node_modules/@types/lodash/fp/isSet.d.ts b/jtg js/node_modules/@types/lodash/fp/isSet.d.ts
new file mode 100644
index 0000000..85e4933
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isSet.d.ts	
@@ -0,0 +1,2 @@
+import { isSet } from "../fp";
+export = isSet;
diff --git a/jtg js/node_modules/@types/lodash/fp/isString.d.ts b/jtg js/node_modules/@types/lodash/fp/isString.d.ts
new file mode 100644
index 0000000..9a21494
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isString.d.ts	
@@ -0,0 +1,2 @@
+import { isString } from "../fp";
+export = isString;
diff --git a/jtg js/node_modules/@types/lodash/fp/isSymbol.d.ts b/jtg js/node_modules/@types/lodash/fp/isSymbol.d.ts
new file mode 100644
index 0000000..3d82e97
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isSymbol.d.ts	
@@ -0,0 +1,2 @@
+import { isSymbol } from "../fp";
+export = isSymbol;
diff --git a/jtg js/node_modules/@types/lodash/fp/isTypedArray.d.ts b/jtg js/node_modules/@types/lodash/fp/isTypedArray.d.ts
new file mode 100644
index 0000000..fce6c44
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isTypedArray.d.ts	
@@ -0,0 +1,2 @@
+import { isTypedArray } from "../fp";
+export = isTypedArray;
diff --git a/jtg js/node_modules/@types/lodash/fp/isUndefined.d.ts b/jtg js/node_modules/@types/lodash/fp/isUndefined.d.ts
new file mode 100644
index 0000000..ccb0100
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isUndefined.d.ts	
@@ -0,0 +1,2 @@
+import { isUndefined } from "../fp";
+export = isUndefined;
diff --git a/jtg js/node_modules/@types/lodash/fp/isWeakMap.d.ts b/jtg js/node_modules/@types/lodash/fp/isWeakMap.d.ts
new file mode 100644
index 0000000..11edaab
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isWeakMap.d.ts	
@@ -0,0 +1,2 @@
+import { isWeakMap } from "../fp";
+export = isWeakMap;
diff --git a/jtg js/node_modules/@types/lodash/fp/isWeakSet.d.ts b/jtg js/node_modules/@types/lodash/fp/isWeakSet.d.ts
new file mode 100644
index 0000000..6d877e9
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/isWeakSet.d.ts	
@@ -0,0 +1,2 @@
+import { isWeakSet } from "../fp";
+export = isWeakSet;
diff --git a/jtg js/node_modules/@types/lodash/fp/iteratee.d.ts b/jtg js/node_modules/@types/lodash/fp/iteratee.d.ts
new file mode 100644
index 0000000..0ec2832
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/iteratee.d.ts	
@@ -0,0 +1,2 @@
+import { iteratee } from "../fp";
+export = iteratee;
diff --git a/jtg js/node_modules/@types/lodash/fp/join.d.ts b/jtg js/node_modules/@types/lodash/fp/join.d.ts
new file mode 100644
index 0000000..beee04c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/join.d.ts	
@@ -0,0 +1,2 @@
+import { join } from "../fp";
+export = join;
diff --git a/jtg js/node_modules/@types/lodash/fp/juxt.d.ts b/jtg js/node_modules/@types/lodash/fp/juxt.d.ts
new file mode 100644
index 0000000..5e972d4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/juxt.d.ts	
@@ -0,0 +1,2 @@
+import { juxt } from "../fp";
+export = juxt;
diff --git a/jtg js/node_modules/@types/lodash/fp/kebabCase.d.ts b/jtg js/node_modules/@types/lodash/fp/kebabCase.d.ts
new file mode 100644
index 0000000..8231b15
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/kebabCase.d.ts	
@@ -0,0 +1,2 @@
+import { kebabCase } from "../fp";
+export = kebabCase;
diff --git a/jtg js/node_modules/@types/lodash/fp/keyBy.d.ts b/jtg js/node_modules/@types/lodash/fp/keyBy.d.ts
new file mode 100644
index 0000000..e4b1381
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/keyBy.d.ts	
@@ -0,0 +1,2 @@
+import { keyBy } from "../fp";
+export = keyBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/keys.d.ts b/jtg js/node_modules/@types/lodash/fp/keys.d.ts
new file mode 100644
index 0000000..0323484
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/keys.d.ts	
@@ -0,0 +1,2 @@
+import { keys } from "../fp";
+export = keys;
diff --git a/jtg js/node_modules/@types/lodash/fp/keysIn.d.ts b/jtg js/node_modules/@types/lodash/fp/keysIn.d.ts
new file mode 100644
index 0000000..f6f3482
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/keysIn.d.ts	
@@ -0,0 +1,2 @@
+import { keysIn } from "../fp";
+export = keysIn;
diff --git a/jtg js/node_modules/@types/lodash/fp/last.d.ts b/jtg js/node_modules/@types/lodash/fp/last.d.ts
new file mode 100644
index 0000000..f74171a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/last.d.ts	
@@ -0,0 +1,2 @@
+import { last } from "../fp";
+export = last;
diff --git a/jtg js/node_modules/@types/lodash/fp/lastIndexOf.d.ts b/jtg js/node_modules/@types/lodash/fp/lastIndexOf.d.ts
new file mode 100644
index 0000000..2d60e64
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/lastIndexOf.d.ts	
@@ -0,0 +1,2 @@
+import { lastIndexOf } from "../fp";
+export = lastIndexOf;
diff --git a/jtg js/node_modules/@types/lodash/fp/lastIndexOfFrom.d.ts b/jtg js/node_modules/@types/lodash/fp/lastIndexOfFrom.d.ts
new file mode 100644
index 0000000..7a2f23e
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/lastIndexOfFrom.d.ts	
@@ -0,0 +1,2 @@
+import { lastIndexOfFrom } from "../fp";
+export = lastIndexOfFrom;
diff --git a/jtg js/node_modules/@types/lodash/fp/lowerCase.d.ts b/jtg js/node_modules/@types/lodash/fp/lowerCase.d.ts
new file mode 100644
index 0000000..1a5360f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/lowerCase.d.ts	
@@ -0,0 +1,2 @@
+import { lowerCase } from "../fp";
+export = lowerCase;
diff --git a/jtg js/node_modules/@types/lodash/fp/lowerFirst.d.ts b/jtg js/node_modules/@types/lodash/fp/lowerFirst.d.ts
new file mode 100644
index 0000000..23ce925
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/lowerFirst.d.ts	
@@ -0,0 +1,2 @@
+import { lowerFirst } from "../fp";
+export = lowerFirst;
diff --git a/jtg js/node_modules/@types/lodash/fp/lt.d.ts b/jtg js/node_modules/@types/lodash/fp/lt.d.ts
new file mode 100644
index 0000000..a309bdc
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/lt.d.ts	
@@ -0,0 +1,2 @@
+import { lt } from "../fp";
+export = lt;
diff --git a/jtg js/node_modules/@types/lodash/fp/lte.d.ts b/jtg js/node_modules/@types/lodash/fp/lte.d.ts
new file mode 100644
index 0000000..0d4af2c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/lte.d.ts	
@@ -0,0 +1,2 @@
+import { lte } from "../fp";
+export = lte;
diff --git a/jtg js/node_modules/@types/lodash/fp/map.d.ts b/jtg js/node_modules/@types/lodash/fp/map.d.ts
new file mode 100644
index 0000000..17d014c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/map.d.ts	
@@ -0,0 +1,2 @@
+import { map } from "../fp";
+export = map;
diff --git a/jtg js/node_modules/@types/lodash/fp/mapKeys.d.ts b/jtg js/node_modules/@types/lodash/fp/mapKeys.d.ts
new file mode 100644
index 0000000..acc6d75
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/mapKeys.d.ts	
@@ -0,0 +1,2 @@
+import { mapKeys } from "../fp";
+export = mapKeys;
diff --git a/jtg js/node_modules/@types/lodash/fp/mapValues.d.ts b/jtg js/node_modules/@types/lodash/fp/mapValues.d.ts
new file mode 100644
index 0000000..abef821
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/mapValues.d.ts	
@@ -0,0 +1,2 @@
+import { mapValues } from "../fp";
+export = mapValues;
diff --git a/jtg js/node_modules/@types/lodash/fp/matches.d.ts b/jtg js/node_modules/@types/lodash/fp/matches.d.ts
new file mode 100644
index 0000000..e9796de
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/matches.d.ts	
@@ -0,0 +1,2 @@
+import { matches } from "../fp";
+export = matches;
diff --git a/jtg js/node_modules/@types/lodash/fp/matchesProperty.d.ts b/jtg js/node_modules/@types/lodash/fp/matchesProperty.d.ts
new file mode 100644
index 0000000..81db8f7
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/matchesProperty.d.ts	
@@ -0,0 +1,2 @@
+import { matchesProperty } from "../fp";
+export = matchesProperty;
diff --git a/jtg js/node_modules/@types/lodash/fp/max.d.ts b/jtg js/node_modules/@types/lodash/fp/max.d.ts
new file mode 100644
index 0000000..7b08dc5
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/max.d.ts	
@@ -0,0 +1,2 @@
+import { max } from "../fp";
+export = max;
diff --git a/jtg js/node_modules/@types/lodash/fp/maxBy.d.ts b/jtg js/node_modules/@types/lodash/fp/maxBy.d.ts
new file mode 100644
index 0000000..68f30dd
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/maxBy.d.ts	
@@ -0,0 +1,2 @@
+import { maxBy } from "../fp";
+export = maxBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/mean.d.ts b/jtg js/node_modules/@types/lodash/fp/mean.d.ts
new file mode 100644
index 0000000..a0b7e22
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/mean.d.ts	
@@ -0,0 +1,2 @@
+import { mean } from "../fp";
+export = mean;
diff --git a/jtg js/node_modules/@types/lodash/fp/meanBy.d.ts b/jtg js/node_modules/@types/lodash/fp/meanBy.d.ts
new file mode 100644
index 0000000..d76afd7
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/meanBy.d.ts	
@@ -0,0 +1,2 @@
+import { meanBy } from "../fp";
+export = meanBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/memoize.d.ts b/jtg js/node_modules/@types/lodash/fp/memoize.d.ts
new file mode 100644
index 0000000..a60b79c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/memoize.d.ts	
@@ -0,0 +1,2 @@
+import { memoize } from "../fp";
+export = memoize;
diff --git a/jtg js/node_modules/@types/lodash/fp/merge.d.ts b/jtg js/node_modules/@types/lodash/fp/merge.d.ts
new file mode 100644
index 0000000..f80117b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/merge.d.ts	
@@ -0,0 +1,2 @@
+import { merge } from "../fp";
+export = merge;
diff --git a/jtg js/node_modules/@types/lodash/fp/mergeAll.d.ts b/jtg js/node_modules/@types/lodash/fp/mergeAll.d.ts
new file mode 100644
index 0000000..6b462d8
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/mergeAll.d.ts	
@@ -0,0 +1,2 @@
+import { mergeAll } from "../fp";
+export = mergeAll;
diff --git a/jtg js/node_modules/@types/lodash/fp/mergeAllWith.d.ts b/jtg js/node_modules/@types/lodash/fp/mergeAllWith.d.ts
new file mode 100644
index 0000000..3d2f7f2
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/mergeAllWith.d.ts	
@@ -0,0 +1,2 @@
+import { mergeAllWith } from "../fp";
+export = mergeAllWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/mergeWith.d.ts b/jtg js/node_modules/@types/lodash/fp/mergeWith.d.ts
new file mode 100644
index 0000000..d1f541e
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/mergeWith.d.ts	
@@ -0,0 +1,2 @@
+import { mergeWith } from "../fp";
+export = mergeWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/method.d.ts b/jtg js/node_modules/@types/lodash/fp/method.d.ts
new file mode 100644
index 0000000..f9f2ee8
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/method.d.ts	
@@ -0,0 +1,2 @@
+import { method } from "../fp";
+export = method;
diff --git a/jtg js/node_modules/@types/lodash/fp/methodOf.d.ts b/jtg js/node_modules/@types/lodash/fp/methodOf.d.ts
new file mode 100644
index 0000000..a9e0e4f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/methodOf.d.ts	
@@ -0,0 +1,2 @@
+import { methodOf } from "../fp";
+export = methodOf;
diff --git a/jtg js/node_modules/@types/lodash/fp/min.d.ts b/jtg js/node_modules/@types/lodash/fp/min.d.ts
new file mode 100644
index 0000000..7c80ab0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/min.d.ts	
@@ -0,0 +1,2 @@
+import { min } from "../fp";
+export = min;
diff --git a/jtg js/node_modules/@types/lodash/fp/minBy.d.ts b/jtg js/node_modules/@types/lodash/fp/minBy.d.ts
new file mode 100644
index 0000000..020a8f5
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/minBy.d.ts	
@@ -0,0 +1,2 @@
+import { minBy } from "../fp";
+export = minBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/multiply.d.ts b/jtg js/node_modules/@types/lodash/fp/multiply.d.ts
new file mode 100644
index 0000000..b3e5f3a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/multiply.d.ts	
@@ -0,0 +1,2 @@
+import { multiply } from "../fp";
+export = multiply;
diff --git a/jtg js/node_modules/@types/lodash/fp/nAry.d.ts b/jtg js/node_modules/@types/lodash/fp/nAry.d.ts
new file mode 100644
index 0000000..882e4a3
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/nAry.d.ts	
@@ -0,0 +1,2 @@
+import { nAry } from "../fp";
+export = nAry;
diff --git a/jtg js/node_modules/@types/lodash/fp/negate.d.ts b/jtg js/node_modules/@types/lodash/fp/negate.d.ts
new file mode 100644
index 0000000..a7693c1
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/negate.d.ts	
@@ -0,0 +1,2 @@
+import { negate } from "../fp";
+export = negate;
diff --git a/jtg js/node_modules/@types/lodash/fp/noConflict.d.ts b/jtg js/node_modules/@types/lodash/fp/noConflict.d.ts
new file mode 100644
index 0000000..7694f5a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/noConflict.d.ts	
@@ -0,0 +1,2 @@
+import { noConflict } from "../fp";
+export = noConflict;
diff --git a/jtg js/node_modules/@types/lodash/fp/noop.d.ts b/jtg js/node_modules/@types/lodash/fp/noop.d.ts
new file mode 100644
index 0000000..5b6a27b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/noop.d.ts	
@@ -0,0 +1,2 @@
+import { noop } from "../fp";
+export = noop;
diff --git a/jtg js/node_modules/@types/lodash/fp/now.d.ts b/jtg js/node_modules/@types/lodash/fp/now.d.ts
new file mode 100644
index 0000000..fdbbd2b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/now.d.ts	
@@ -0,0 +1,2 @@
+import { now } from "../fp";
+export = now;
diff --git a/jtg js/node_modules/@types/lodash/fp/nth.d.ts b/jtg js/node_modules/@types/lodash/fp/nth.d.ts
new file mode 100644
index 0000000..e3987e1
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/nth.d.ts	
@@ -0,0 +1,2 @@
+import { nth } from "../fp";
+export = nth;
diff --git a/jtg js/node_modules/@types/lodash/fp/nthArg.d.ts b/jtg js/node_modules/@types/lodash/fp/nthArg.d.ts
new file mode 100644
index 0000000..216c9bb
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/nthArg.d.ts	
@@ -0,0 +1,2 @@
+import { nthArg } from "../fp";
+export = nthArg;
diff --git a/jtg js/node_modules/@types/lodash/fp/omit.d.ts b/jtg js/node_modules/@types/lodash/fp/omit.d.ts
new file mode 100644
index 0000000..1cd1b7f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/omit.d.ts	
@@ -0,0 +1,2 @@
+import { omit } from "../fp";
+export = omit;
diff --git a/jtg js/node_modules/@types/lodash/fp/omitAll.d.ts b/jtg js/node_modules/@types/lodash/fp/omitAll.d.ts
new file mode 100644
index 0000000..dab5cfa
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/omitAll.d.ts	
@@ -0,0 +1,2 @@
+import { omitAll } from "../fp";
+export = omitAll;
diff --git a/jtg js/node_modules/@types/lodash/fp/omitBy.d.ts b/jtg js/node_modules/@types/lodash/fp/omitBy.d.ts
new file mode 100644
index 0000000..8be4f5b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/omitBy.d.ts	
@@ -0,0 +1,2 @@
+import { omitBy } from "../fp";
+export = omitBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/once.d.ts b/jtg js/node_modules/@types/lodash/fp/once.d.ts
new file mode 100644
index 0000000..24d859c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/once.d.ts	
@@ -0,0 +1,2 @@
+import { once } from "../fp";
+export = once;
diff --git a/jtg js/node_modules/@types/lodash/fp/orderBy.d.ts b/jtg js/node_modules/@types/lodash/fp/orderBy.d.ts
new file mode 100644
index 0000000..9443fcf
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/orderBy.d.ts	
@@ -0,0 +1,2 @@
+import { orderBy } from "../fp";
+export = orderBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/over.d.ts b/jtg js/node_modules/@types/lodash/fp/over.d.ts
new file mode 100644
index 0000000..1bd2502
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/over.d.ts	
@@ -0,0 +1,2 @@
+import { over } from "../fp";
+export = over;
diff --git a/jtg js/node_modules/@types/lodash/fp/overArgs.d.ts b/jtg js/node_modules/@types/lodash/fp/overArgs.d.ts
new file mode 100644
index 0000000..c054c92
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/overArgs.d.ts	
@@ -0,0 +1,2 @@
+import { overArgs } from "../fp";
+export = overArgs;
diff --git a/jtg js/node_modules/@types/lodash/fp/overEvery.d.ts b/jtg js/node_modules/@types/lodash/fp/overEvery.d.ts
new file mode 100644
index 0000000..1cf8b40
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/overEvery.d.ts	
@@ -0,0 +1,2 @@
+import { overEvery } from "../fp";
+export = overEvery;
diff --git a/jtg js/node_modules/@types/lodash/fp/overSome.d.ts b/jtg js/node_modules/@types/lodash/fp/overSome.d.ts
new file mode 100644
index 0000000..6b098b7
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/overSome.d.ts	
@@ -0,0 +1,2 @@
+import { overSome } from "../fp";
+export = overSome;
diff --git a/jtg js/node_modules/@types/lodash/fp/pad.d.ts b/jtg js/node_modules/@types/lodash/fp/pad.d.ts
new file mode 100644
index 0000000..a551977
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/pad.d.ts	
@@ -0,0 +1,2 @@
+import { pad } from "../fp";
+export = pad;
diff --git a/jtg js/node_modules/@types/lodash/fp/padChars.d.ts b/jtg js/node_modules/@types/lodash/fp/padChars.d.ts
new file mode 100644
index 0000000..74d1aab
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/padChars.d.ts	
@@ -0,0 +1,2 @@
+import { padChars } from "../fp";
+export = padChars;
diff --git a/jtg js/node_modules/@types/lodash/fp/padCharsEnd.d.ts b/jtg js/node_modules/@types/lodash/fp/padCharsEnd.d.ts
new file mode 100644
index 0000000..3a468dc
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/padCharsEnd.d.ts	
@@ -0,0 +1,2 @@
+import { padCharsEnd } from "../fp";
+export = padCharsEnd;
diff --git a/jtg js/node_modules/@types/lodash/fp/padCharsStart.d.ts b/jtg js/node_modules/@types/lodash/fp/padCharsStart.d.ts
new file mode 100644
index 0000000..a225235
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/padCharsStart.d.ts	
@@ -0,0 +1,2 @@
+import { padCharsStart } from "../fp";
+export = padCharsStart;
diff --git a/jtg js/node_modules/@types/lodash/fp/padEnd.d.ts b/jtg js/node_modules/@types/lodash/fp/padEnd.d.ts
new file mode 100644
index 0000000..5c4e4d8
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/padEnd.d.ts	
@@ -0,0 +1,2 @@
+import { padEnd } from "../fp";
+export = padEnd;
diff --git a/jtg js/node_modules/@types/lodash/fp/padStart.d.ts b/jtg js/node_modules/@types/lodash/fp/padStart.d.ts
new file mode 100644
index 0000000..a4fca5d
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/padStart.d.ts	
@@ -0,0 +1,2 @@
+import { padStart } from "../fp";
+export = padStart;
diff --git a/jtg js/node_modules/@types/lodash/fp/parseInt.d.ts b/jtg js/node_modules/@types/lodash/fp/parseInt.d.ts
new file mode 100644
index 0000000..47aff97
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/parseInt.d.ts	
@@ -0,0 +1,2 @@
+import { parseInt } from "../fp";
+export = parseInt;
diff --git a/jtg js/node_modules/@types/lodash/fp/partial.d.ts b/jtg js/node_modules/@types/lodash/fp/partial.d.ts
new file mode 100644
index 0000000..f5ebd72
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/partial.d.ts	
@@ -0,0 +1,2 @@
+import { partial } from "../fp";
+export = partial;
diff --git a/jtg js/node_modules/@types/lodash/fp/partialRight.d.ts b/jtg js/node_modules/@types/lodash/fp/partialRight.d.ts
new file mode 100644
index 0000000..bc0fa1b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/partialRight.d.ts	
@@ -0,0 +1,2 @@
+import { partialRight } from "../fp";
+export = partialRight;
diff --git a/jtg js/node_modules/@types/lodash/fp/partition.d.ts b/jtg js/node_modules/@types/lodash/fp/partition.d.ts
new file mode 100644
index 0000000..6ad41cd
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/partition.d.ts	
@@ -0,0 +1,2 @@
+import { partition } from "../fp";
+export = partition;
diff --git a/jtg js/node_modules/@types/lodash/fp/path.d.ts b/jtg js/node_modules/@types/lodash/fp/path.d.ts
new file mode 100644
index 0000000..db86d60
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/path.d.ts	
@@ -0,0 +1,2 @@
+import { path } from "../fp";
+export = path;
diff --git a/jtg js/node_modules/@types/lodash/fp/pathEq.d.ts b/jtg js/node_modules/@types/lodash/fp/pathEq.d.ts
new file mode 100644
index 0000000..9f32875
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/pathEq.d.ts	
@@ -0,0 +1,2 @@
+import { pathEq } from "../fp";
+export = pathEq;
diff --git a/jtg js/node_modules/@types/lodash/fp/pathOr.d.ts b/jtg js/node_modules/@types/lodash/fp/pathOr.d.ts
new file mode 100644
index 0000000..6cad6b1
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/pathOr.d.ts	
@@ -0,0 +1,2 @@
+import { pathOr } from "../fp";
+export = pathOr;
diff --git a/jtg js/node_modules/@types/lodash/fp/paths.d.ts b/jtg js/node_modules/@types/lodash/fp/paths.d.ts
new file mode 100644
index 0000000..1e6eb89
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/paths.d.ts	
@@ -0,0 +1,2 @@
+import { paths } from "../fp";
+export = paths;
diff --git a/jtg js/node_modules/@types/lodash/fp/pick.d.ts b/jtg js/node_modules/@types/lodash/fp/pick.d.ts
new file mode 100644
index 0000000..4772eca
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/pick.d.ts	
@@ -0,0 +1,2 @@
+import { pick } from "../fp";
+export = pick;
diff --git a/jtg js/node_modules/@types/lodash/fp/pickAll.d.ts b/jtg js/node_modules/@types/lodash/fp/pickAll.d.ts
new file mode 100644
index 0000000..38d2e3f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/pickAll.d.ts	
@@ -0,0 +1,2 @@
+import { pickAll } from "../fp";
+export = pickAll;
diff --git a/jtg js/node_modules/@types/lodash/fp/pickBy.d.ts b/jtg js/node_modules/@types/lodash/fp/pickBy.d.ts
new file mode 100644
index 0000000..0b19262
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/pickBy.d.ts	
@@ -0,0 +1,2 @@
+import { pickBy } from "../fp";
+export = pickBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/pipe.d.ts b/jtg js/node_modules/@types/lodash/fp/pipe.d.ts
new file mode 100644
index 0000000..a53a048
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/pipe.d.ts	
@@ -0,0 +1,2 @@
+import { pipe } from "../fp";
+export = pipe;
diff --git a/jtg js/node_modules/@types/lodash/fp/placeholder.d.ts b/jtg js/node_modules/@types/lodash/fp/placeholder.d.ts
new file mode 100644
index 0000000..ddaed8e
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/placeholder.d.ts	
@@ -0,0 +1,3 @@
+import _ = require("../index");
+declare const placeholder: _.__;
+export = placeholder;
diff --git a/jtg js/node_modules/@types/lodash/fp/pluck.d.ts b/jtg js/node_modules/@types/lodash/fp/pluck.d.ts
new file mode 100644
index 0000000..c5c916f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/pluck.d.ts	
@@ -0,0 +1,2 @@
+import { pluck } from "../fp";
+export = pluck;
diff --git a/jtg js/node_modules/@types/lodash/fp/prop.d.ts b/jtg js/node_modules/@types/lodash/fp/prop.d.ts
new file mode 100644
index 0000000..f2061e7
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/prop.d.ts	
@@ -0,0 +1,2 @@
+import { prop } from "../fp";
+export = prop;
diff --git a/jtg js/node_modules/@types/lodash/fp/propEq.d.ts b/jtg js/node_modules/@types/lodash/fp/propEq.d.ts
new file mode 100644
index 0000000..5e3f4b4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/propEq.d.ts	
@@ -0,0 +1,2 @@
+import { propEq } from "../fp";
+export = propEq;
diff --git a/jtg js/node_modules/@types/lodash/fp/propOr.d.ts b/jtg js/node_modules/@types/lodash/fp/propOr.d.ts
new file mode 100644
index 0000000..feabcf6
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/propOr.d.ts	
@@ -0,0 +1,2 @@
+import { propOr } from "../fp";
+export = propOr;
diff --git a/jtg js/node_modules/@types/lodash/fp/property.d.ts b/jtg js/node_modules/@types/lodash/fp/property.d.ts
new file mode 100644
index 0000000..aaa6c25
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/property.d.ts	
@@ -0,0 +1,2 @@
+import { property } from "../fp";
+export = property;
diff --git a/jtg js/node_modules/@types/lodash/fp/propertyOf.d.ts b/jtg js/node_modules/@types/lodash/fp/propertyOf.d.ts
new file mode 100644
index 0000000..a4d5513
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/propertyOf.d.ts	
@@ -0,0 +1,2 @@
+import { propertyOf } from "../fp";
+export = propertyOf;
diff --git a/jtg js/node_modules/@types/lodash/fp/props.d.ts b/jtg js/node_modules/@types/lodash/fp/props.d.ts
new file mode 100644
index 0000000..46addba
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/props.d.ts	
@@ -0,0 +1,2 @@
+import { props } from "../fp";
+export = props;
diff --git a/jtg js/node_modules/@types/lodash/fp/pull.d.ts b/jtg js/node_modules/@types/lodash/fp/pull.d.ts
new file mode 100644
index 0000000..801cf33
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/pull.d.ts	
@@ -0,0 +1,2 @@
+import { pull } from "../fp";
+export = pull;
diff --git a/jtg js/node_modules/@types/lodash/fp/pullAll.d.ts b/jtg js/node_modules/@types/lodash/fp/pullAll.d.ts
new file mode 100644
index 0000000..042fe89
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/pullAll.d.ts	
@@ -0,0 +1,2 @@
+import { pullAll } from "../fp";
+export = pullAll;
diff --git a/jtg js/node_modules/@types/lodash/fp/pullAllBy.d.ts b/jtg js/node_modules/@types/lodash/fp/pullAllBy.d.ts
new file mode 100644
index 0000000..5e5de1f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/pullAllBy.d.ts	
@@ -0,0 +1,2 @@
+import { pullAllBy } from "../fp";
+export = pullAllBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/pullAllWith.d.ts b/jtg js/node_modules/@types/lodash/fp/pullAllWith.d.ts
new file mode 100644
index 0000000..0c448bf
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/pullAllWith.d.ts	
@@ -0,0 +1,2 @@
+import { pullAllWith } from "../fp";
+export = pullAllWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/pullAt.d.ts b/jtg js/node_modules/@types/lodash/fp/pullAt.d.ts
new file mode 100644
index 0000000..4bdffd9
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/pullAt.d.ts	
@@ -0,0 +1,2 @@
+import { pullAt } from "../fp";
+export = pullAt;
diff --git a/jtg js/node_modules/@types/lodash/fp/random.d.ts b/jtg js/node_modules/@types/lodash/fp/random.d.ts
new file mode 100644
index 0000000..a69555c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/random.d.ts	
@@ -0,0 +1,2 @@
+import { random } from "../fp";
+export = random;
diff --git a/jtg js/node_modules/@types/lodash/fp/range.d.ts b/jtg js/node_modules/@types/lodash/fp/range.d.ts
new file mode 100644
index 0000000..ace50ce
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/range.d.ts	
@@ -0,0 +1,2 @@
+import { range } from "../fp";
+export = range;
diff --git a/jtg js/node_modules/@types/lodash/fp/rangeRight.d.ts b/jtg js/node_modules/@types/lodash/fp/rangeRight.d.ts
new file mode 100644
index 0000000..20c8bae
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/rangeRight.d.ts	
@@ -0,0 +1,2 @@
+import { rangeRight } from "../fp";
+export = rangeRight;
diff --git a/jtg js/node_modules/@types/lodash/fp/rangeStep.d.ts b/jtg js/node_modules/@types/lodash/fp/rangeStep.d.ts
new file mode 100644
index 0000000..e5f4c89
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/rangeStep.d.ts	
@@ -0,0 +1,2 @@
+import { rangeStep } from "../fp";
+export = rangeStep;
diff --git a/jtg js/node_modules/@types/lodash/fp/rangeStepRight.d.ts b/jtg js/node_modules/@types/lodash/fp/rangeStepRight.d.ts
new file mode 100644
index 0000000..6c7add4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/rangeStepRight.d.ts	
@@ -0,0 +1,2 @@
+import { rangeStepRight } from "../fp";
+export = rangeStepRight;
diff --git a/jtg js/node_modules/@types/lodash/fp/rearg.d.ts b/jtg js/node_modules/@types/lodash/fp/rearg.d.ts
new file mode 100644
index 0000000..5c407d1
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/rearg.d.ts	
@@ -0,0 +1,2 @@
+import { rearg } from "../fp";
+export = rearg;
diff --git a/jtg js/node_modules/@types/lodash/fp/reduce.d.ts b/jtg js/node_modules/@types/lodash/fp/reduce.d.ts
new file mode 100644
index 0000000..e262f39
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/reduce.d.ts	
@@ -0,0 +1,2 @@
+import { reduce } from "../fp";
+export = reduce;
diff --git a/jtg js/node_modules/@types/lodash/fp/reduceRight.d.ts b/jtg js/node_modules/@types/lodash/fp/reduceRight.d.ts
new file mode 100644
index 0000000..fa54fa3
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/reduceRight.d.ts	
@@ -0,0 +1,2 @@
+import { reduceRight } from "../fp";
+export = reduceRight;
diff --git a/jtg js/node_modules/@types/lodash/fp/reject.d.ts b/jtg js/node_modules/@types/lodash/fp/reject.d.ts
new file mode 100644
index 0000000..d0a12af
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/reject.d.ts	
@@ -0,0 +1,2 @@
+import { reject } from "../fp";
+export = reject;
diff --git a/jtg js/node_modules/@types/lodash/fp/remove.d.ts b/jtg js/node_modules/@types/lodash/fp/remove.d.ts
new file mode 100644
index 0000000..e0da9b1
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/remove.d.ts	
@@ -0,0 +1,2 @@
+import { remove } from "../fp";
+export = remove;
diff --git a/jtg js/node_modules/@types/lodash/fp/repeat.d.ts b/jtg js/node_modules/@types/lodash/fp/repeat.d.ts
new file mode 100644
index 0000000..1f757a2
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/repeat.d.ts	
@@ -0,0 +1,2 @@
+import { repeat } from "../fp";
+export = repeat;
diff --git a/jtg js/node_modules/@types/lodash/fp/replace.d.ts b/jtg js/node_modules/@types/lodash/fp/replace.d.ts
new file mode 100644
index 0000000..c7a75d1
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/replace.d.ts	
@@ -0,0 +1,2 @@
+import { replace } from "../fp";
+export = replace;
diff --git a/jtg js/node_modules/@types/lodash/fp/rest.d.ts b/jtg js/node_modules/@types/lodash/fp/rest.d.ts
new file mode 100644
index 0000000..b059d67
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/rest.d.ts	
@@ -0,0 +1,2 @@
+import { rest } from "../fp";
+export = rest;
diff --git a/jtg js/node_modules/@types/lodash/fp/restFrom.d.ts b/jtg js/node_modules/@types/lodash/fp/restFrom.d.ts
new file mode 100644
index 0000000..218edbd
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/restFrom.d.ts	
@@ -0,0 +1,2 @@
+import { restFrom } from "../fp";
+export = restFrom;
diff --git a/jtg js/node_modules/@types/lodash/fp/result.d.ts b/jtg js/node_modules/@types/lodash/fp/result.d.ts
new file mode 100644
index 0000000..5a919dd
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/result.d.ts	
@@ -0,0 +1,2 @@
+import { result } from "../fp";
+export = result;
diff --git a/jtg js/node_modules/@types/lodash/fp/reverse.d.ts b/jtg js/node_modules/@types/lodash/fp/reverse.d.ts
new file mode 100644
index 0000000..f754d6a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/reverse.d.ts	
@@ -0,0 +1,2 @@
+import { reverse } from "../fp";
+export = reverse;
diff --git a/jtg js/node_modules/@types/lodash/fp/round.d.ts b/jtg js/node_modules/@types/lodash/fp/round.d.ts
new file mode 100644
index 0000000..02f4e6f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/round.d.ts	
@@ -0,0 +1,2 @@
+import { round } from "../fp";
+export = round;
diff --git a/jtg js/node_modules/@types/lodash/fp/runInContext.d.ts b/jtg js/node_modules/@types/lodash/fp/runInContext.d.ts
new file mode 100644
index 0000000..6041db7
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/runInContext.d.ts	
@@ -0,0 +1,2 @@
+import { runInContext } from "../fp";
+export = runInContext;
diff --git a/jtg js/node_modules/@types/lodash/fp/sample.d.ts b/jtg js/node_modules/@types/lodash/fp/sample.d.ts
new file mode 100644
index 0000000..f2fcf1a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/sample.d.ts	
@@ -0,0 +1,2 @@
+import { sample } from "../fp";
+export = sample;
diff --git a/jtg js/node_modules/@types/lodash/fp/sampleSize.d.ts b/jtg js/node_modules/@types/lodash/fp/sampleSize.d.ts
new file mode 100644
index 0000000..41a3cab
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/sampleSize.d.ts	
@@ -0,0 +1,2 @@
+import { sampleSize } from "../fp";
+export = sampleSize;
diff --git a/jtg js/node_modules/@types/lodash/fp/set.d.ts b/jtg js/node_modules/@types/lodash/fp/set.d.ts
new file mode 100644
index 0000000..57960cb
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/set.d.ts	
@@ -0,0 +1,2 @@
+import { set } from "../fp";
+export = set;
diff --git a/jtg js/node_modules/@types/lodash/fp/setWith.d.ts b/jtg js/node_modules/@types/lodash/fp/setWith.d.ts
new file mode 100644
index 0000000..800a494
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/setWith.d.ts	
@@ -0,0 +1,2 @@
+import { setWith } from "../fp";
+export = setWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/shuffle.d.ts b/jtg js/node_modules/@types/lodash/fp/shuffle.d.ts
new file mode 100644
index 0000000..7f07282
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/shuffle.d.ts	
@@ -0,0 +1,2 @@
+import { shuffle } from "../fp";
+export = shuffle;
diff --git a/jtg js/node_modules/@types/lodash/fp/size.d.ts b/jtg js/node_modules/@types/lodash/fp/size.d.ts
new file mode 100644
index 0000000..657c8b7
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/size.d.ts	
@@ -0,0 +1,2 @@
+import { size } from "../fp";
+export = size;
diff --git a/jtg js/node_modules/@types/lodash/fp/slice.d.ts b/jtg js/node_modules/@types/lodash/fp/slice.d.ts
new file mode 100644
index 0000000..fabbbe0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/slice.d.ts	
@@ -0,0 +1,2 @@
+import { slice } from "../fp";
+export = slice;
diff --git a/jtg js/node_modules/@types/lodash/fp/snakeCase.d.ts b/jtg js/node_modules/@types/lodash/fp/snakeCase.d.ts
new file mode 100644
index 0000000..a06ac45
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/snakeCase.d.ts	
@@ -0,0 +1,2 @@
+import { snakeCase } from "../fp";
+export = snakeCase;
diff --git a/jtg js/node_modules/@types/lodash/fp/some.d.ts b/jtg js/node_modules/@types/lodash/fp/some.d.ts
new file mode 100644
index 0000000..870b231
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/some.d.ts	
@@ -0,0 +1,2 @@
+import { some } from "../fp";
+export = some;
diff --git a/jtg js/node_modules/@types/lodash/fp/sortBy.d.ts b/jtg js/node_modules/@types/lodash/fp/sortBy.d.ts
new file mode 100644
index 0000000..72c5799
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/sortBy.d.ts	
@@ -0,0 +1,2 @@
+import { sortBy } from "../fp";
+export = sortBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/sortedIndex.d.ts b/jtg js/node_modules/@types/lodash/fp/sortedIndex.d.ts
new file mode 100644
index 0000000..35b57fe
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/sortedIndex.d.ts	
@@ -0,0 +1,2 @@
+import { sortedIndex } from "../fp";
+export = sortedIndex;
diff --git a/jtg js/node_modules/@types/lodash/fp/sortedIndexBy.d.ts b/jtg js/node_modules/@types/lodash/fp/sortedIndexBy.d.ts
new file mode 100644
index 0000000..f6968df
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/sortedIndexBy.d.ts	
@@ -0,0 +1,2 @@
+import { sortedIndexBy } from "../fp";
+export = sortedIndexBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/sortedIndexOf.d.ts b/jtg js/node_modules/@types/lodash/fp/sortedIndexOf.d.ts
new file mode 100644
index 0000000..beeb6db
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/sortedIndexOf.d.ts	
@@ -0,0 +1,2 @@
+import { sortedIndexOf } from "../fp";
+export = sortedIndexOf;
diff --git a/jtg js/node_modules/@types/lodash/fp/sortedLastIndex.d.ts b/jtg js/node_modules/@types/lodash/fp/sortedLastIndex.d.ts
new file mode 100644
index 0000000..eea77a0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/sortedLastIndex.d.ts	
@@ -0,0 +1,2 @@
+import { sortedLastIndex } from "../fp";
+export = sortedLastIndex;
diff --git a/jtg js/node_modules/@types/lodash/fp/sortedLastIndexBy.d.ts b/jtg js/node_modules/@types/lodash/fp/sortedLastIndexBy.d.ts
new file mode 100644
index 0000000..6c8e4ee
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/sortedLastIndexBy.d.ts	
@@ -0,0 +1,2 @@
+import { sortedLastIndexBy } from "../fp";
+export = sortedLastIndexBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/sortedLastIndexOf.d.ts b/jtg js/node_modules/@types/lodash/fp/sortedLastIndexOf.d.ts
new file mode 100644
index 0000000..a02caf3
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/sortedLastIndexOf.d.ts	
@@ -0,0 +1,2 @@
+import { sortedLastIndexOf } from "../fp";
+export = sortedLastIndexOf;
diff --git a/jtg js/node_modules/@types/lodash/fp/sortedUniq.d.ts b/jtg js/node_modules/@types/lodash/fp/sortedUniq.d.ts
new file mode 100644
index 0000000..03d8e69
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/sortedUniq.d.ts	
@@ -0,0 +1,2 @@
+import { sortedUniq } from "../fp";
+export = sortedUniq;
diff --git a/jtg js/node_modules/@types/lodash/fp/sortedUniqBy.d.ts b/jtg js/node_modules/@types/lodash/fp/sortedUniqBy.d.ts
new file mode 100644
index 0000000..466981a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/sortedUniqBy.d.ts	
@@ -0,0 +1,2 @@
+import { sortedUniqBy } from "../fp";
+export = sortedUniqBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/split.d.ts b/jtg js/node_modules/@types/lodash/fp/split.d.ts
new file mode 100644
index 0000000..8274d40
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/split.d.ts	
@@ -0,0 +1,2 @@
+import { split } from "../fp";
+export = split;
diff --git a/jtg js/node_modules/@types/lodash/fp/spread.d.ts b/jtg js/node_modules/@types/lodash/fp/spread.d.ts
new file mode 100644
index 0000000..44eb90c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/spread.d.ts	
@@ -0,0 +1,2 @@
+import { spread } from "../fp";
+export = spread;
diff --git a/jtg js/node_modules/@types/lodash/fp/spreadFrom.d.ts b/jtg js/node_modules/@types/lodash/fp/spreadFrom.d.ts
new file mode 100644
index 0000000..7eb840b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/spreadFrom.d.ts	
@@ -0,0 +1,2 @@
+import { spreadFrom } from "../fp";
+export = spreadFrom;
diff --git a/jtg js/node_modules/@types/lodash/fp/startCase.d.ts b/jtg js/node_modules/@types/lodash/fp/startCase.d.ts
new file mode 100644
index 0000000..4f580aa
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/startCase.d.ts	
@@ -0,0 +1,2 @@
+import { startCase } from "../fp";
+export = startCase;
diff --git a/jtg js/node_modules/@types/lodash/fp/startsWith.d.ts b/jtg js/node_modules/@types/lodash/fp/startsWith.d.ts
new file mode 100644
index 0000000..f84397d
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/startsWith.d.ts	
@@ -0,0 +1,2 @@
+import { startsWith } from "../fp";
+export = startsWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/stubArray.d.ts b/jtg js/node_modules/@types/lodash/fp/stubArray.d.ts
new file mode 100644
index 0000000..8ff910e
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/stubArray.d.ts	
@@ -0,0 +1,2 @@
+import { stubArray } from "../fp";
+export = stubArray;
diff --git a/jtg js/node_modules/@types/lodash/fp/stubFalse.d.ts b/jtg js/node_modules/@types/lodash/fp/stubFalse.d.ts
new file mode 100644
index 0000000..4cc0414
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/stubFalse.d.ts	
@@ -0,0 +1,2 @@
+import { stubFalse } from "../fp";
+export = stubFalse;
diff --git a/jtg js/node_modules/@types/lodash/fp/stubObject.d.ts b/jtg js/node_modules/@types/lodash/fp/stubObject.d.ts
new file mode 100644
index 0000000..d7c8269
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/stubObject.d.ts	
@@ -0,0 +1,2 @@
+import { stubObject } from "../fp";
+export = stubObject;
diff --git a/jtg js/node_modules/@types/lodash/fp/stubString.d.ts b/jtg js/node_modules/@types/lodash/fp/stubString.d.ts
new file mode 100644
index 0000000..cbfa449
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/stubString.d.ts	
@@ -0,0 +1,2 @@
+import { stubString } from "../fp";
+export = stubString;
diff --git a/jtg js/node_modules/@types/lodash/fp/stubTrue.d.ts b/jtg js/node_modules/@types/lodash/fp/stubTrue.d.ts
new file mode 100644
index 0000000..0ed7e5b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/stubTrue.d.ts	
@@ -0,0 +1,2 @@
+import { stubTrue } from "../fp";
+export = stubTrue;
diff --git a/jtg js/node_modules/@types/lodash/fp/subtract.d.ts b/jtg js/node_modules/@types/lodash/fp/subtract.d.ts
new file mode 100644
index 0000000..201301b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/subtract.d.ts	
@@ -0,0 +1,2 @@
+import { subtract } from "../fp";
+export = subtract;
diff --git a/jtg js/node_modules/@types/lodash/fp/sum.d.ts b/jtg js/node_modules/@types/lodash/fp/sum.d.ts
new file mode 100644
index 0000000..6d7d020
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/sum.d.ts	
@@ -0,0 +1,2 @@
+import { sum } from "../fp";
+export = sum;
diff --git a/jtg js/node_modules/@types/lodash/fp/sumBy.d.ts b/jtg js/node_modules/@types/lodash/fp/sumBy.d.ts
new file mode 100644
index 0000000..3f44c3f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/sumBy.d.ts	
@@ -0,0 +1,2 @@
+import { sumBy } from "../fp";
+export = sumBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/symmetricDifference.d.ts b/jtg js/node_modules/@types/lodash/fp/symmetricDifference.d.ts
new file mode 100644
index 0000000..cba1d1f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/symmetricDifference.d.ts	
@@ -0,0 +1,2 @@
+import { symmetricDifference } from "../fp";
+export = symmetricDifference;
diff --git a/jtg js/node_modules/@types/lodash/fp/symmetricDifferenceBy.d.ts b/jtg js/node_modules/@types/lodash/fp/symmetricDifferenceBy.d.ts
new file mode 100644
index 0000000..8e9316c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/symmetricDifferenceBy.d.ts	
@@ -0,0 +1,2 @@
+import { symmetricDifferenceBy } from "../fp";
+export = symmetricDifferenceBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/symmetricDifferenceWith.d.ts b/jtg js/node_modules/@types/lodash/fp/symmetricDifferenceWith.d.ts
new file mode 100644
index 0000000..864ec01
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/symmetricDifferenceWith.d.ts	
@@ -0,0 +1,2 @@
+import { symmetricDifferenceWith } from "../fp";
+export = symmetricDifferenceWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/tail.d.ts b/jtg js/node_modules/@types/lodash/fp/tail.d.ts
new file mode 100644
index 0000000..df9bcdc
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/tail.d.ts	
@@ -0,0 +1,2 @@
+import { tail } from "../fp";
+export = tail;
diff --git a/jtg js/node_modules/@types/lodash/fp/take.d.ts b/jtg js/node_modules/@types/lodash/fp/take.d.ts
new file mode 100644
index 0000000..ab46aca
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/take.d.ts	
@@ -0,0 +1,2 @@
+import { take } from "../fp";
+export = take;
diff --git a/jtg js/node_modules/@types/lodash/fp/takeLast.d.ts b/jtg js/node_modules/@types/lodash/fp/takeLast.d.ts
new file mode 100644
index 0000000..027dcda
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/takeLast.d.ts	
@@ -0,0 +1,2 @@
+import { takeLast } from "../fp";
+export = takeLast;
diff --git a/jtg js/node_modules/@types/lodash/fp/takeLastWhile.d.ts b/jtg js/node_modules/@types/lodash/fp/takeLastWhile.d.ts
new file mode 100644
index 0000000..c6729c3
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/takeLastWhile.d.ts	
@@ -0,0 +1,2 @@
+import { takeLastWhile } from "../fp";
+export = takeLastWhile;
diff --git a/jtg js/node_modules/@types/lodash/fp/takeRight.d.ts b/jtg js/node_modules/@types/lodash/fp/takeRight.d.ts
new file mode 100644
index 0000000..162c516
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/takeRight.d.ts	
@@ -0,0 +1,2 @@
+import { takeRight } from "../fp";
+export = takeRight;
diff --git a/jtg js/node_modules/@types/lodash/fp/takeRightWhile.d.ts b/jtg js/node_modules/@types/lodash/fp/takeRightWhile.d.ts
new file mode 100644
index 0000000..b23f7a4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/takeRightWhile.d.ts	
@@ -0,0 +1,2 @@
+import { takeRightWhile } from "../fp";
+export = takeRightWhile;
diff --git a/jtg js/node_modules/@types/lodash/fp/takeWhile.d.ts b/jtg js/node_modules/@types/lodash/fp/takeWhile.d.ts
new file mode 100644
index 0000000..b8cb517
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/takeWhile.d.ts	
@@ -0,0 +1,2 @@
+import { takeWhile } from "../fp";
+export = takeWhile;
diff --git a/jtg js/node_modules/@types/lodash/fp/tap.d.ts b/jtg js/node_modules/@types/lodash/fp/tap.d.ts
new file mode 100644
index 0000000..8ffbbd7
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/tap.d.ts	
@@ -0,0 +1,2 @@
+import { tap } from "../fp";
+export = tap;
diff --git a/jtg js/node_modules/@types/lodash/fp/template.d.ts b/jtg js/node_modules/@types/lodash/fp/template.d.ts
new file mode 100644
index 0000000..3a37ed1
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/template.d.ts	
@@ -0,0 +1,2 @@
+import { template } from "../fp";
+export = template;
diff --git a/jtg js/node_modules/@types/lodash/fp/throttle.d.ts b/jtg js/node_modules/@types/lodash/fp/throttle.d.ts
new file mode 100644
index 0000000..24d8b7f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/throttle.d.ts	
@@ -0,0 +1,2 @@
+import { throttle } from "../fp";
+export = throttle;
diff --git a/jtg js/node_modules/@types/lodash/fp/thru.d.ts b/jtg js/node_modules/@types/lodash/fp/thru.d.ts
new file mode 100644
index 0000000..b972582
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/thru.d.ts	
@@ -0,0 +1,2 @@
+import { thru } from "../fp";
+export = thru;
diff --git a/jtg js/node_modules/@types/lodash/fp/times.d.ts b/jtg js/node_modules/@types/lodash/fp/times.d.ts
new file mode 100644
index 0000000..3d9f0c6
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/times.d.ts	
@@ -0,0 +1,2 @@
+import { times } from "../fp";
+export = times;
diff --git a/jtg js/node_modules/@types/lodash/fp/toArray.d.ts b/jtg js/node_modules/@types/lodash/fp/toArray.d.ts
new file mode 100644
index 0000000..4b18ce6
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/toArray.d.ts	
@@ -0,0 +1,2 @@
+import { toArray } from "../fp";
+export = toArray;
diff --git a/jtg js/node_modules/@types/lodash/fp/toFinite.d.ts b/jtg js/node_modules/@types/lodash/fp/toFinite.d.ts
new file mode 100644
index 0000000..1d41996
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/toFinite.d.ts	
@@ -0,0 +1,2 @@
+import { toFinite } from "../fp";
+export = toFinite;
diff --git a/jtg js/node_modules/@types/lodash/fp/toInteger.d.ts b/jtg js/node_modules/@types/lodash/fp/toInteger.d.ts
new file mode 100644
index 0000000..46ccaf9
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/toInteger.d.ts	
@@ -0,0 +1,2 @@
+import { toInteger } from "../fp";
+export = toInteger;
diff --git a/jtg js/node_modules/@types/lodash/fp/toLength.d.ts b/jtg js/node_modules/@types/lodash/fp/toLength.d.ts
new file mode 100644
index 0000000..bb62924
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/toLength.d.ts	
@@ -0,0 +1,2 @@
+import { toLength } from "../fp";
+export = toLength;
diff --git a/jtg js/node_modules/@types/lodash/fp/toLower.d.ts b/jtg js/node_modules/@types/lodash/fp/toLower.d.ts
new file mode 100644
index 0000000..64e6e36
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/toLower.d.ts	
@@ -0,0 +1,2 @@
+import { toLower } from "../fp";
+export = toLower;
diff --git a/jtg js/node_modules/@types/lodash/fp/toNumber.d.ts b/jtg js/node_modules/@types/lodash/fp/toNumber.d.ts
new file mode 100644
index 0000000..262b91c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/toNumber.d.ts	
@@ -0,0 +1,2 @@
+import { toNumber } from "../fp";
+export = toNumber;
diff --git a/jtg js/node_modules/@types/lodash/fp/toPairs.d.ts b/jtg js/node_modules/@types/lodash/fp/toPairs.d.ts
new file mode 100644
index 0000000..89334fc
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/toPairs.d.ts	
@@ -0,0 +1,2 @@
+import { toPairs } from "../fp";
+export = toPairs;
diff --git a/jtg js/node_modules/@types/lodash/fp/toPairsIn.d.ts b/jtg js/node_modules/@types/lodash/fp/toPairsIn.d.ts
new file mode 100644
index 0000000..278ff0b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/toPairsIn.d.ts	
@@ -0,0 +1,2 @@
+import { toPairsIn } from "../fp";
+export = toPairsIn;
diff --git a/jtg js/node_modules/@types/lodash/fp/toPath.d.ts b/jtg js/node_modules/@types/lodash/fp/toPath.d.ts
new file mode 100644
index 0000000..9f2287c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/toPath.d.ts	
@@ -0,0 +1,2 @@
+import { toPath } from "../fp";
+export = toPath;
diff --git a/jtg js/node_modules/@types/lodash/fp/toPlainObject.d.ts b/jtg js/node_modules/@types/lodash/fp/toPlainObject.d.ts
new file mode 100644
index 0000000..22fa070
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/toPlainObject.d.ts	
@@ -0,0 +1,2 @@
+import { toPlainObject } from "../fp";
+export = toPlainObject;
diff --git a/jtg js/node_modules/@types/lodash/fp/toSafeInteger.d.ts b/jtg js/node_modules/@types/lodash/fp/toSafeInteger.d.ts
new file mode 100644
index 0000000..2f85078
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/toSafeInteger.d.ts	
@@ -0,0 +1,2 @@
+import { toSafeInteger } from "../fp";
+export = toSafeInteger;
diff --git a/jtg js/node_modules/@types/lodash/fp/toString.d.ts b/jtg js/node_modules/@types/lodash/fp/toString.d.ts
new file mode 100644
index 0000000..ee6703c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/toString.d.ts	
@@ -0,0 +1,2 @@
+import { toString } from "../fp";
+export = toString;
diff --git a/jtg js/node_modules/@types/lodash/fp/toUpper.d.ts b/jtg js/node_modules/@types/lodash/fp/toUpper.d.ts
new file mode 100644
index 0000000..6bf21c1
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/toUpper.d.ts	
@@ -0,0 +1,2 @@
+import { toUpper } from "../fp";
+export = toUpper;
diff --git a/jtg js/node_modules/@types/lodash/fp/transform.d.ts b/jtg js/node_modules/@types/lodash/fp/transform.d.ts
new file mode 100644
index 0000000..ab0653c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/transform.d.ts	
@@ -0,0 +1,2 @@
+import { transform } from "../fp";
+export = transform;
diff --git a/jtg js/node_modules/@types/lodash/fp/trim.d.ts b/jtg js/node_modules/@types/lodash/fp/trim.d.ts
new file mode 100644
index 0000000..f0f9b90
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/trim.d.ts	
@@ -0,0 +1,2 @@
+import { trim } from "../fp";
+export = trim;
diff --git a/jtg js/node_modules/@types/lodash/fp/trimChars.d.ts b/jtg js/node_modules/@types/lodash/fp/trimChars.d.ts
new file mode 100644
index 0000000..929a493
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/trimChars.d.ts	
@@ -0,0 +1,2 @@
+import { trimChars } from "../fp";
+export = trimChars;
diff --git a/jtg js/node_modules/@types/lodash/fp/trimCharsEnd.d.ts b/jtg js/node_modules/@types/lodash/fp/trimCharsEnd.d.ts
new file mode 100644
index 0000000..2f5609a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/trimCharsEnd.d.ts	
@@ -0,0 +1,2 @@
+import { trimCharsEnd } from "../fp";
+export = trimCharsEnd;
diff --git a/jtg js/node_modules/@types/lodash/fp/trimCharsStart.d.ts b/jtg js/node_modules/@types/lodash/fp/trimCharsStart.d.ts
new file mode 100644
index 0000000..fb998f7
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/trimCharsStart.d.ts	
@@ -0,0 +1,2 @@
+import { trimCharsStart } from "../fp";
+export = trimCharsStart;
diff --git a/jtg js/node_modules/@types/lodash/fp/trimEnd.d.ts b/jtg js/node_modules/@types/lodash/fp/trimEnd.d.ts
new file mode 100644
index 0000000..b666494
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/trimEnd.d.ts	
@@ -0,0 +1,2 @@
+import { trimEnd } from "../fp";
+export = trimEnd;
diff --git a/jtg js/node_modules/@types/lodash/fp/trimStart.d.ts b/jtg js/node_modules/@types/lodash/fp/trimStart.d.ts
new file mode 100644
index 0000000..988227c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/trimStart.d.ts	
@@ -0,0 +1,2 @@
+import { trimStart } from "../fp";
+export = trimStart;
diff --git a/jtg js/node_modules/@types/lodash/fp/truncate.d.ts b/jtg js/node_modules/@types/lodash/fp/truncate.d.ts
new file mode 100644
index 0000000..d38b7b1
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/truncate.d.ts	
@@ -0,0 +1,2 @@
+import { truncate } from "../fp";
+export = truncate;
diff --git a/jtg js/node_modules/@types/lodash/fp/unapply.d.ts b/jtg js/node_modules/@types/lodash/fp/unapply.d.ts
new file mode 100644
index 0000000..c59b6b2
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/unapply.d.ts	
@@ -0,0 +1,2 @@
+import { unapply } from "../fp";
+export = unapply;
diff --git a/jtg js/node_modules/@types/lodash/fp/unary.d.ts b/jtg js/node_modules/@types/lodash/fp/unary.d.ts
new file mode 100644
index 0000000..02e3195
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/unary.d.ts	
@@ -0,0 +1,2 @@
+import { unary } from "../fp";
+export = unary;
diff --git a/jtg js/node_modules/@types/lodash/fp/unescape.d.ts b/jtg js/node_modules/@types/lodash/fp/unescape.d.ts
new file mode 100644
index 0000000..efcccf2
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/unescape.d.ts	
@@ -0,0 +1,2 @@
+import { unescape } from "../fp";
+export = unescape;
diff --git a/jtg js/node_modules/@types/lodash/fp/union.d.ts b/jtg js/node_modules/@types/lodash/fp/union.d.ts
new file mode 100644
index 0000000..8e098ee
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/union.d.ts	
@@ -0,0 +1,2 @@
+import { union } from "../fp";
+export = union;
diff --git a/jtg js/node_modules/@types/lodash/fp/unionBy.d.ts b/jtg js/node_modules/@types/lodash/fp/unionBy.d.ts
new file mode 100644
index 0000000..f3882c6
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/unionBy.d.ts	
@@ -0,0 +1,2 @@
+import { unionBy } from "../fp";
+export = unionBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/unionWith.d.ts b/jtg js/node_modules/@types/lodash/fp/unionWith.d.ts
new file mode 100644
index 0000000..46e19fd
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/unionWith.d.ts	
@@ -0,0 +1,2 @@
+import { unionWith } from "../fp";
+export = unionWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/uniq.d.ts b/jtg js/node_modules/@types/lodash/fp/uniq.d.ts
new file mode 100644
index 0000000..877d0d9
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/uniq.d.ts	
@@ -0,0 +1,2 @@
+import { uniq } from "../fp";
+export = uniq;
diff --git a/jtg js/node_modules/@types/lodash/fp/uniqBy.d.ts b/jtg js/node_modules/@types/lodash/fp/uniqBy.d.ts
new file mode 100644
index 0000000..0e6522d
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/uniqBy.d.ts	
@@ -0,0 +1,2 @@
+import { uniqBy } from "../fp";
+export = uniqBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/uniqWith.d.ts b/jtg js/node_modules/@types/lodash/fp/uniqWith.d.ts
new file mode 100644
index 0000000..165f45f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/uniqWith.d.ts	
@@ -0,0 +1,2 @@
+import { uniqWith } from "../fp";
+export = uniqWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/uniqueId.d.ts b/jtg js/node_modules/@types/lodash/fp/uniqueId.d.ts
new file mode 100644
index 0000000..57736d9
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/uniqueId.d.ts	
@@ -0,0 +1,2 @@
+import { uniqueId } from "../fp";
+export = uniqueId;
diff --git a/jtg js/node_modules/@types/lodash/fp/unnest.d.ts b/jtg js/node_modules/@types/lodash/fp/unnest.d.ts
new file mode 100644
index 0000000..852e9a1
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/unnest.d.ts	
@@ -0,0 +1,2 @@
+import { unnest } from "../fp";
+export = unnest;
diff --git a/jtg js/node_modules/@types/lodash/fp/unset.d.ts b/jtg js/node_modules/@types/lodash/fp/unset.d.ts
new file mode 100644
index 0000000..3e99247
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/unset.d.ts	
@@ -0,0 +1,2 @@
+import { unset } from "../fp";
+export = unset;
diff --git a/jtg js/node_modules/@types/lodash/fp/unzip.d.ts b/jtg js/node_modules/@types/lodash/fp/unzip.d.ts
new file mode 100644
index 0000000..ba9d4cd
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/unzip.d.ts	
@@ -0,0 +1,2 @@
+import { unzip } from "../fp";
+export = unzip;
diff --git a/jtg js/node_modules/@types/lodash/fp/unzipWith.d.ts b/jtg js/node_modules/@types/lodash/fp/unzipWith.d.ts
new file mode 100644
index 0000000..599eadb
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/unzipWith.d.ts	
@@ -0,0 +1,2 @@
+import { unzipWith } from "../fp";
+export = unzipWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/update.d.ts b/jtg js/node_modules/@types/lodash/fp/update.d.ts
new file mode 100644
index 0000000..76dfe48
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/update.d.ts	
@@ -0,0 +1,2 @@
+import { update } from "../fp";
+export = update;
diff --git a/jtg js/node_modules/@types/lodash/fp/updateWith.d.ts b/jtg js/node_modules/@types/lodash/fp/updateWith.d.ts
new file mode 100644
index 0000000..6d6331d
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/updateWith.d.ts	
@@ -0,0 +1,2 @@
+import { updateWith } from "../fp";
+export = updateWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/upperCase.d.ts b/jtg js/node_modules/@types/lodash/fp/upperCase.d.ts
new file mode 100644
index 0000000..10aadb2
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/upperCase.d.ts	
@@ -0,0 +1,2 @@
+import { upperCase } from "../fp";
+export = upperCase;
diff --git a/jtg js/node_modules/@types/lodash/fp/upperFirst.d.ts b/jtg js/node_modules/@types/lodash/fp/upperFirst.d.ts
new file mode 100644
index 0000000..e2c9adf
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/upperFirst.d.ts	
@@ -0,0 +1,2 @@
+import { upperFirst } from "../fp";
+export = upperFirst;
diff --git a/jtg js/node_modules/@types/lodash/fp/useWith.d.ts b/jtg js/node_modules/@types/lodash/fp/useWith.d.ts
new file mode 100644
index 0000000..991905a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/useWith.d.ts	
@@ -0,0 +1,2 @@
+import { useWith } from "../fp";
+export = useWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/values.d.ts b/jtg js/node_modules/@types/lodash/fp/values.d.ts
new file mode 100644
index 0000000..75ec6fb
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/values.d.ts	
@@ -0,0 +1,2 @@
+import { values } from "../fp";
+export = values;
diff --git a/jtg js/node_modules/@types/lodash/fp/valuesIn.d.ts b/jtg js/node_modules/@types/lodash/fp/valuesIn.d.ts
new file mode 100644
index 0000000..6f4f3b4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/valuesIn.d.ts	
@@ -0,0 +1,2 @@
+import { valuesIn } from "../fp";
+export = valuesIn;
diff --git a/jtg js/node_modules/@types/lodash/fp/where.d.ts b/jtg js/node_modules/@types/lodash/fp/where.d.ts
new file mode 100644
index 0000000..41e21ec
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/where.d.ts	
@@ -0,0 +1,2 @@
+import { where } from "../fp";
+export = where;
diff --git a/jtg js/node_modules/@types/lodash/fp/whereEq.d.ts b/jtg js/node_modules/@types/lodash/fp/whereEq.d.ts
new file mode 100644
index 0000000..893316d
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/whereEq.d.ts	
@@ -0,0 +1,2 @@
+import { whereEq } from "../fp";
+export = whereEq;
diff --git a/jtg js/node_modules/@types/lodash/fp/without.d.ts b/jtg js/node_modules/@types/lodash/fp/without.d.ts
new file mode 100644
index 0000000..600890a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/without.d.ts	
@@ -0,0 +1,2 @@
+import { without } from "../fp";
+export = without;
diff --git a/jtg js/node_modules/@types/lodash/fp/words.d.ts b/jtg js/node_modules/@types/lodash/fp/words.d.ts
new file mode 100644
index 0000000..2b06b26
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/words.d.ts	
@@ -0,0 +1,2 @@
+import { words } from "../fp";
+export = words;
diff --git a/jtg js/node_modules/@types/lodash/fp/wrap.d.ts b/jtg js/node_modules/@types/lodash/fp/wrap.d.ts
new file mode 100644
index 0000000..d9c2a28
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/wrap.d.ts	
@@ -0,0 +1,2 @@
+import { wrap } from "../fp";
+export = wrap;
diff --git a/jtg js/node_modules/@types/lodash/fp/xor.d.ts b/jtg js/node_modules/@types/lodash/fp/xor.d.ts
new file mode 100644
index 0000000..ac69bde
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/xor.d.ts	
@@ -0,0 +1,2 @@
+import { xor } from "../fp";
+export = xor;
diff --git a/jtg js/node_modules/@types/lodash/fp/xorBy.d.ts b/jtg js/node_modules/@types/lodash/fp/xorBy.d.ts
new file mode 100644
index 0000000..1232972
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/xorBy.d.ts	
@@ -0,0 +1,2 @@
+import { xorBy } from "../fp";
+export = xorBy;
diff --git a/jtg js/node_modules/@types/lodash/fp/xorWith.d.ts b/jtg js/node_modules/@types/lodash/fp/xorWith.d.ts
new file mode 100644
index 0000000..ec93e40
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/xorWith.d.ts	
@@ -0,0 +1,2 @@
+import { xorWith } from "../fp";
+export = xorWith;
diff --git a/jtg js/node_modules/@types/lodash/fp/zip.d.ts b/jtg js/node_modules/@types/lodash/fp/zip.d.ts
new file mode 100644
index 0000000..2a83e73
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/zip.d.ts	
@@ -0,0 +1,2 @@
+import { zip } from "../fp";
+export = zip;
diff --git a/jtg js/node_modules/@types/lodash/fp/zipAll.d.ts b/jtg js/node_modules/@types/lodash/fp/zipAll.d.ts
new file mode 100644
index 0000000..af0b3ed
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/zipAll.d.ts	
@@ -0,0 +1,2 @@
+import { zipAll } from "../fp";
+export = zipAll;
diff --git a/jtg js/node_modules/@types/lodash/fp/zipObj.d.ts b/jtg js/node_modules/@types/lodash/fp/zipObj.d.ts
new file mode 100644
index 0000000..4f4c19a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/zipObj.d.ts	
@@ -0,0 +1,2 @@
+import { zipObj } from "../fp";
+export = zipObj;
diff --git a/jtg js/node_modules/@types/lodash/fp/zipObject.d.ts b/jtg js/node_modules/@types/lodash/fp/zipObject.d.ts
new file mode 100644
index 0000000..f302d7b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/zipObject.d.ts	
@@ -0,0 +1,2 @@
+import { zipObject } from "../fp";
+export = zipObject;
diff --git a/jtg js/node_modules/@types/lodash/fp/zipObjectDeep.d.ts b/jtg js/node_modules/@types/lodash/fp/zipObjectDeep.d.ts
new file mode 100644
index 0000000..6010634
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/zipObjectDeep.d.ts	
@@ -0,0 +1,2 @@
+import { zipObjectDeep } from "../fp";
+export = zipObjectDeep;
diff --git a/jtg js/node_modules/@types/lodash/fp/zipWith.d.ts b/jtg js/node_modules/@types/lodash/fp/zipWith.d.ts
new file mode 100644
index 0000000..9faaf3c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fp/zipWith.d.ts	
@@ -0,0 +1,2 @@
+import { zipWith } from "../fp";
+export = zipWith;
diff --git a/jtg js/node_modules/@types/lodash/fromPairs.d.ts b/jtg js/node_modules/@types/lodash/fromPairs.d.ts
new file mode 100644
index 0000000..1c2006c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/fromPairs.d.ts	
@@ -0,0 +1,2 @@
+import { fromPairs } from "./index";
+export = fromPairs;
diff --git a/jtg js/node_modules/@types/lodash/functions.d.ts b/jtg js/node_modules/@types/lodash/functions.d.ts
new file mode 100644
index 0000000..8698336
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/functions.d.ts	
@@ -0,0 +1,2 @@
+import { functions } from "./index";
+export = functions;
diff --git a/jtg js/node_modules/@types/lodash/functionsIn.d.ts b/jtg js/node_modules/@types/lodash/functionsIn.d.ts
new file mode 100644
index 0000000..9f72a78
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/functionsIn.d.ts	
@@ -0,0 +1,2 @@
+import { functionsIn } from "./index";
+export = functionsIn;
diff --git a/jtg js/node_modules/@types/lodash/get.d.ts b/jtg js/node_modules/@types/lodash/get.d.ts
new file mode 100644
index 0000000..5ea7a5a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/get.d.ts	
@@ -0,0 +1,2 @@
+import { get } from "./index";
+export = get;
diff --git a/jtg js/node_modules/@types/lodash/groupBy.d.ts b/jtg js/node_modules/@types/lodash/groupBy.d.ts
new file mode 100644
index 0000000..ef49718
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/groupBy.d.ts	
@@ -0,0 +1,2 @@
+import { groupBy } from "./index";
+export = groupBy;
diff --git a/jtg js/node_modules/@types/lodash/gt.d.ts b/jtg js/node_modules/@types/lodash/gt.d.ts
new file mode 100644
index 0000000..860134f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/gt.d.ts	
@@ -0,0 +1,2 @@
+import { gt } from "./index";
+export = gt;
diff --git a/jtg js/node_modules/@types/lodash/gte.d.ts b/jtg js/node_modules/@types/lodash/gte.d.ts
new file mode 100644
index 0000000..994e882
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/gte.d.ts	
@@ -0,0 +1,2 @@
+import { gte } from "./index";
+export = gte;
diff --git a/jtg js/node_modules/@types/lodash/has.d.ts b/jtg js/node_modules/@types/lodash/has.d.ts
new file mode 100644
index 0000000..fff1468
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/has.d.ts	
@@ -0,0 +1,2 @@
+import { has } from "./index";
+export = has;
diff --git a/jtg js/node_modules/@types/lodash/hasIn.d.ts b/jtg js/node_modules/@types/lodash/hasIn.d.ts
new file mode 100644
index 0000000..a898071
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/hasIn.d.ts	
@@ -0,0 +1,2 @@
+import { hasIn } from "./index";
+export = hasIn;
diff --git a/jtg js/node_modules/@types/lodash/head.d.ts b/jtg js/node_modules/@types/lodash/head.d.ts
new file mode 100644
index 0000000..0e16da1
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/head.d.ts	
@@ -0,0 +1,2 @@
+import { head } from "./index";
+export = head;
diff --git a/jtg js/node_modules/@types/lodash/identity.d.ts b/jtg js/node_modules/@types/lodash/identity.d.ts
new file mode 100644
index 0000000..6814a16
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/identity.d.ts	
@@ -0,0 +1,2 @@
+import { identity } from "./index";
+export = identity;
diff --git a/jtg js/node_modules/@types/lodash/inRange.d.ts b/jtg js/node_modules/@types/lodash/inRange.d.ts
new file mode 100644
index 0000000..d9c57c0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/inRange.d.ts	
@@ -0,0 +1,2 @@
+import { inRange } from "./index";
+export = inRange;
diff --git a/jtg js/node_modules/@types/lodash/includes.d.ts b/jtg js/node_modules/@types/lodash/includes.d.ts
new file mode 100644
index 0000000..4edd226
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/includes.d.ts	
@@ -0,0 +1,2 @@
+import { includes } from "./index";
+export = includes;
diff --git a/jtg js/node_modules/@types/lodash/index.d.ts b/jtg js/node_modules/@types/lodash/index.d.ts
new file mode 100644
index 0000000..67e9c8f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/index.d.ts	
@@ -0,0 +1,47 @@
+// Type definitions for Lo-Dash 4.14
+// Project: http://lodash.com/
+// Definitions by: Brian Zengel <https://github.com/bczengel>,
+//                 Ilya Mochalov <https://github.com/chrootsu>,
+//                 Stepan Mikhaylyuk <https://github.com/stepancar>,
+//                 AJ Richardson <https://github.com/aj-r>,
+//                 Junyoung Clare Jang <https://github.com/ailrun>,
+//                 e-cloud <https://github.com/e-cloud>,
+//                 Georgii Dolzhykov <https://github.com/thorn0>,
+//                 Jack Moore <https://github.com/jtmthf>,
+//                 Dominique Rau <https://github.com/DomiR>
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+// TypeScript Version: 2.2
+
+/// <reference path="./common/common.d.ts" />
+/// <reference path="./common/array.d.ts" />
+/// <reference path="./common/collection.d.ts" />
+/// <reference path="./common/date.d.ts" />
+/// <reference path="./common/function.d.ts" />
+/// <reference path="./common/lang.d.ts" />
+/// <reference path="./common/math.d.ts" />
+/// <reference path="./common/number.d.ts" />
+/// <reference path="./common/object.d.ts" />
+/// <reference path="./common/seq.d.ts" />
+/// <reference path="./common/string.d.ts" />
+/// <reference path="./common/util.d.ts" />
+
+export = _;
+export as namespace _;
+
+declare const _: _.LoDashStatic;
+declare namespace _ {
+    // tslint:disable-next-line no-empty-interface (This will be augmented)
+    interface LoDashStatic {}
+}
+
+// Backward compatibility with --target es5
+declare global {
+    // tslint:disable-next-line:no-empty-interface
+    interface Set<T> { }
+    // tslint:disable-next-line:no-empty-interface
+    interface Map<K, V> { }
+    // tslint:disable-next-line:no-empty-interface
+    interface WeakSet<T> { }
+    // tslint:disable-next-line:no-empty-interface
+    interface WeakMap<K extends object, V> { }
+}
diff --git a/jtg js/node_modules/@types/lodash/indexOf.d.ts b/jtg js/node_modules/@types/lodash/indexOf.d.ts
new file mode 100644
index 0000000..50b8f70
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/indexOf.d.ts	
@@ -0,0 +1,2 @@
+import { indexOf } from "./index";
+export = indexOf;
diff --git a/jtg js/node_modules/@types/lodash/initial.d.ts b/jtg js/node_modules/@types/lodash/initial.d.ts
new file mode 100644
index 0000000..3ce64eb
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/initial.d.ts	
@@ -0,0 +1,2 @@
+import { initial } from "./index";
+export = initial;
diff --git a/jtg js/node_modules/@types/lodash/intersection.d.ts b/jtg js/node_modules/@types/lodash/intersection.d.ts
new file mode 100644
index 0000000..1fbe4e5
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/intersection.d.ts	
@@ -0,0 +1,2 @@
+import { intersection } from "./index";
+export = intersection;
diff --git a/jtg js/node_modules/@types/lodash/intersectionBy.d.ts b/jtg js/node_modules/@types/lodash/intersectionBy.d.ts
new file mode 100644
index 0000000..b4885da
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/intersectionBy.d.ts	
@@ -0,0 +1,2 @@
+import { intersectionBy } from "./index";
+export = intersectionBy;
diff --git a/jtg js/node_modules/@types/lodash/intersectionWith.d.ts b/jtg js/node_modules/@types/lodash/intersectionWith.d.ts
new file mode 100644
index 0000000..bacccd0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/intersectionWith.d.ts	
@@ -0,0 +1,2 @@
+import { intersectionWith } from "./index";
+export = intersectionWith;
diff --git a/jtg js/node_modules/@types/lodash/invert.d.ts b/jtg js/node_modules/@types/lodash/invert.d.ts
new file mode 100644
index 0000000..2287ea1
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/invert.d.ts	
@@ -0,0 +1,2 @@
+import { invert } from "./index";
+export = invert;
diff --git a/jtg js/node_modules/@types/lodash/invertBy.d.ts b/jtg js/node_modules/@types/lodash/invertBy.d.ts
new file mode 100644
index 0000000..5951600
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/invertBy.d.ts	
@@ -0,0 +1,2 @@
+import { invertBy } from "./index";
+export = invertBy;
diff --git a/jtg js/node_modules/@types/lodash/invoke.d.ts b/jtg js/node_modules/@types/lodash/invoke.d.ts
new file mode 100644
index 0000000..eea6b38
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/invoke.d.ts	
@@ -0,0 +1,2 @@
+import { invoke } from "./index";
+export = invoke;
diff --git a/jtg js/node_modules/@types/lodash/invokeMap.d.ts b/jtg js/node_modules/@types/lodash/invokeMap.d.ts
new file mode 100644
index 0000000..814cf05
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/invokeMap.d.ts	
@@ -0,0 +1,2 @@
+import { invokeMap } from "./index";
+export = invokeMap;
diff --git a/jtg js/node_modules/@types/lodash/isArguments.d.ts b/jtg js/node_modules/@types/lodash/isArguments.d.ts
new file mode 100644
index 0000000..5b22572
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isArguments.d.ts	
@@ -0,0 +1,2 @@
+import { isArguments } from "./index";
+export = isArguments;
diff --git a/jtg js/node_modules/@types/lodash/isArray.d.ts b/jtg js/node_modules/@types/lodash/isArray.d.ts
new file mode 100644
index 0000000..a35ab5a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isArray.d.ts	
@@ -0,0 +1,2 @@
+import { isArray } from "./index";
+export = isArray;
diff --git a/jtg js/node_modules/@types/lodash/isArrayBuffer.d.ts b/jtg js/node_modules/@types/lodash/isArrayBuffer.d.ts
new file mode 100644
index 0000000..ec7c68c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isArrayBuffer.d.ts	
@@ -0,0 +1,2 @@
+import { isArrayBuffer } from "./index";
+export = isArrayBuffer;
diff --git a/jtg js/node_modules/@types/lodash/isArrayLike.d.ts b/jtg js/node_modules/@types/lodash/isArrayLike.d.ts
new file mode 100644
index 0000000..aa95c77
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isArrayLike.d.ts	
@@ -0,0 +1,2 @@
+import { isArrayLike } from "./index";
+export = isArrayLike;
diff --git a/jtg js/node_modules/@types/lodash/isArrayLikeObject.d.ts b/jtg js/node_modules/@types/lodash/isArrayLikeObject.d.ts
new file mode 100644
index 0000000..736c91d
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isArrayLikeObject.d.ts	
@@ -0,0 +1,2 @@
+import { isArrayLikeObject } from "./index";
+export = isArrayLikeObject;
diff --git a/jtg js/node_modules/@types/lodash/isBoolean.d.ts b/jtg js/node_modules/@types/lodash/isBoolean.d.ts
new file mode 100644
index 0000000..96c306d
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isBoolean.d.ts	
@@ -0,0 +1,2 @@
+import { isBoolean } from "./index";
+export = isBoolean;
diff --git a/jtg js/node_modules/@types/lodash/isBuffer.d.ts b/jtg js/node_modules/@types/lodash/isBuffer.d.ts
new file mode 100644
index 0000000..b22d782
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isBuffer.d.ts	
@@ -0,0 +1,2 @@
+import { isBuffer } from "./index";
+export = isBuffer;
diff --git a/jtg js/node_modules/@types/lodash/isDate.d.ts b/jtg js/node_modules/@types/lodash/isDate.d.ts
new file mode 100644
index 0000000..1269a69
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isDate.d.ts	
@@ -0,0 +1,2 @@
+import { isDate } from "./index";
+export = isDate;
diff --git a/jtg js/node_modules/@types/lodash/isElement.d.ts b/jtg js/node_modules/@types/lodash/isElement.d.ts
new file mode 100644
index 0000000..e4510cd
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isElement.d.ts	
@@ -0,0 +1,2 @@
+import { isElement } from "./index";
+export = isElement;
diff --git a/jtg js/node_modules/@types/lodash/isEmpty.d.ts b/jtg js/node_modules/@types/lodash/isEmpty.d.ts
new file mode 100644
index 0000000..9e71bfa
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isEmpty.d.ts	
@@ -0,0 +1,2 @@
+import { isEmpty } from "./index";
+export = isEmpty;
diff --git a/jtg js/node_modules/@types/lodash/isEqual.d.ts b/jtg js/node_modules/@types/lodash/isEqual.d.ts
new file mode 100644
index 0000000..1e065fa
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isEqual.d.ts	
@@ -0,0 +1,2 @@
+import { isEqual } from "./index";
+export = isEqual;
diff --git a/jtg js/node_modules/@types/lodash/isEqualWith.d.ts b/jtg js/node_modules/@types/lodash/isEqualWith.d.ts
new file mode 100644
index 0000000..e14d005
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isEqualWith.d.ts	
@@ -0,0 +1,2 @@
+import { isEqualWith } from "./index";
+export = isEqualWith;
diff --git a/jtg js/node_modules/@types/lodash/isError.d.ts b/jtg js/node_modules/@types/lodash/isError.d.ts
new file mode 100644
index 0000000..d9d5785
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isError.d.ts	
@@ -0,0 +1,2 @@
+import { isError } from "./index";
+export = isError;
diff --git a/jtg js/node_modules/@types/lodash/isFinite.d.ts b/jtg js/node_modules/@types/lodash/isFinite.d.ts
new file mode 100644
index 0000000..7aba1dc
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isFinite.d.ts	
@@ -0,0 +1,2 @@
+import { isFinite } from "./index";
+export = isFinite;
diff --git a/jtg js/node_modules/@types/lodash/isFunction.d.ts b/jtg js/node_modules/@types/lodash/isFunction.d.ts
new file mode 100644
index 0000000..0a22d6c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isFunction.d.ts	
@@ -0,0 +1,2 @@
+import { isFunction } from "./index";
+export = isFunction;
diff --git a/jtg js/node_modules/@types/lodash/isInteger.d.ts b/jtg js/node_modules/@types/lodash/isInteger.d.ts
new file mode 100644
index 0000000..40d33d3
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isInteger.d.ts	
@@ -0,0 +1,2 @@
+import { isInteger } from "./index";
+export = isInteger;
diff --git a/jtg js/node_modules/@types/lodash/isLength.d.ts b/jtg js/node_modules/@types/lodash/isLength.d.ts
new file mode 100644
index 0000000..ee5a933
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isLength.d.ts	
@@ -0,0 +1,2 @@
+import { isLength } from "./index";
+export = isLength;
diff --git a/jtg js/node_modules/@types/lodash/isMap.d.ts b/jtg js/node_modules/@types/lodash/isMap.d.ts
new file mode 100644
index 0000000..441c538
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isMap.d.ts	
@@ -0,0 +1,2 @@
+import { isMap } from "./index";
+export = isMap;
diff --git a/jtg js/node_modules/@types/lodash/isMatch.d.ts b/jtg js/node_modules/@types/lodash/isMatch.d.ts
new file mode 100644
index 0000000..69d194a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isMatch.d.ts	
@@ -0,0 +1,2 @@
+import { isMatch } from "./index";
+export = isMatch;
diff --git a/jtg js/node_modules/@types/lodash/isMatchWith.d.ts b/jtg js/node_modules/@types/lodash/isMatchWith.d.ts
new file mode 100644
index 0000000..932310a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isMatchWith.d.ts	
@@ -0,0 +1,2 @@
+import { isMatchWith } from "./index";
+export = isMatchWith;
diff --git a/jtg js/node_modules/@types/lodash/isNaN.d.ts b/jtg js/node_modules/@types/lodash/isNaN.d.ts
new file mode 100644
index 0000000..970702b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isNaN.d.ts	
@@ -0,0 +1,2 @@
+import { isNaN } from "./index";
+export = isNaN;
diff --git a/jtg js/node_modules/@types/lodash/isNative.d.ts b/jtg js/node_modules/@types/lodash/isNative.d.ts
new file mode 100644
index 0000000..3174f8a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isNative.d.ts	
@@ -0,0 +1,2 @@
+import { isNative } from "./index";
+export = isNative;
diff --git a/jtg js/node_modules/@types/lodash/isNil.d.ts b/jtg js/node_modules/@types/lodash/isNil.d.ts
new file mode 100644
index 0000000..9e15819
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isNil.d.ts	
@@ -0,0 +1,2 @@
+import { isNil } from "./index";
+export = isNil;
diff --git a/jtg js/node_modules/@types/lodash/isNull.d.ts b/jtg js/node_modules/@types/lodash/isNull.d.ts
new file mode 100644
index 0000000..e572c45
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isNull.d.ts	
@@ -0,0 +1,2 @@
+import { isNull } from "./index";
+export = isNull;
diff --git a/jtg js/node_modules/@types/lodash/isNumber.d.ts b/jtg js/node_modules/@types/lodash/isNumber.d.ts
new file mode 100644
index 0000000..91c8359
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isNumber.d.ts	
@@ -0,0 +1,2 @@
+import { isNumber } from "./index";
+export = isNumber;
diff --git a/jtg js/node_modules/@types/lodash/isObject.d.ts b/jtg js/node_modules/@types/lodash/isObject.d.ts
new file mode 100644
index 0000000..9a43544
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isObject.d.ts	
@@ -0,0 +1,2 @@
+import { isObject } from "./index";
+export = isObject;
diff --git a/jtg js/node_modules/@types/lodash/isObjectLike.d.ts b/jtg js/node_modules/@types/lodash/isObjectLike.d.ts
new file mode 100644
index 0000000..a17d39c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isObjectLike.d.ts	
@@ -0,0 +1,2 @@
+import { isObjectLike } from "./index";
+export = isObjectLike;
diff --git a/jtg js/node_modules/@types/lodash/isPlainObject.d.ts b/jtg js/node_modules/@types/lodash/isPlainObject.d.ts
new file mode 100644
index 0000000..4df85e2
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isPlainObject.d.ts	
@@ -0,0 +1,2 @@
+import { isPlainObject } from "./index";
+export = isPlainObject;
diff --git a/jtg js/node_modules/@types/lodash/isRegExp.d.ts b/jtg js/node_modules/@types/lodash/isRegExp.d.ts
new file mode 100644
index 0000000..ed206d9
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isRegExp.d.ts	
@@ -0,0 +1,2 @@
+import { isRegExp } from "./index";
+export = isRegExp;
diff --git a/jtg js/node_modules/@types/lodash/isSafeInteger.d.ts b/jtg js/node_modules/@types/lodash/isSafeInteger.d.ts
new file mode 100644
index 0000000..6bc6083
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isSafeInteger.d.ts	
@@ -0,0 +1,2 @@
+import { isSafeInteger } from "./index";
+export = isSafeInteger;
diff --git a/jtg js/node_modules/@types/lodash/isSet.d.ts b/jtg js/node_modules/@types/lodash/isSet.d.ts
new file mode 100644
index 0000000..7967b50
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isSet.d.ts	
@@ -0,0 +1,2 @@
+import { isSet } from "./index";
+export = isSet;
diff --git a/jtg js/node_modules/@types/lodash/isString.d.ts b/jtg js/node_modules/@types/lodash/isString.d.ts
new file mode 100644
index 0000000..757802e
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isString.d.ts	
@@ -0,0 +1,2 @@
+import { isString } from "./index";
+export = isString;
diff --git a/jtg js/node_modules/@types/lodash/isSymbol.d.ts b/jtg js/node_modules/@types/lodash/isSymbol.d.ts
new file mode 100644
index 0000000..e28b2b0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isSymbol.d.ts	
@@ -0,0 +1,2 @@
+import { isSymbol } from "./index";
+export = isSymbol;
diff --git a/jtg js/node_modules/@types/lodash/isTypedArray.d.ts b/jtg js/node_modules/@types/lodash/isTypedArray.d.ts
new file mode 100644
index 0000000..7f32601
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isTypedArray.d.ts	
@@ -0,0 +1,2 @@
+import { isTypedArray } from "./index";
+export = isTypedArray;
diff --git a/jtg js/node_modules/@types/lodash/isUndefined.d.ts b/jtg js/node_modules/@types/lodash/isUndefined.d.ts
new file mode 100644
index 0000000..7a5c64f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isUndefined.d.ts	
@@ -0,0 +1,2 @@
+import { isUndefined } from "./index";
+export = isUndefined;
diff --git a/jtg js/node_modules/@types/lodash/isWeakMap.d.ts b/jtg js/node_modules/@types/lodash/isWeakMap.d.ts
new file mode 100644
index 0000000..b0609da
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isWeakMap.d.ts	
@@ -0,0 +1,2 @@
+import { isWeakMap } from "./index";
+export = isWeakMap;
diff --git a/jtg js/node_modules/@types/lodash/isWeakSet.d.ts b/jtg js/node_modules/@types/lodash/isWeakSet.d.ts
new file mode 100644
index 0000000..6beda3d
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/isWeakSet.d.ts	
@@ -0,0 +1,2 @@
+import { isWeakSet } from "./index";
+export = isWeakSet;
diff --git a/jtg js/node_modules/@types/lodash/iteratee.d.ts b/jtg js/node_modules/@types/lodash/iteratee.d.ts
new file mode 100644
index 0000000..493b39c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/iteratee.d.ts	
@@ -0,0 +1,2 @@
+import { iteratee } from "./index";
+export = iteratee;
diff --git a/jtg js/node_modules/@types/lodash/join.d.ts b/jtg js/node_modules/@types/lodash/join.d.ts
new file mode 100644
index 0000000..b2c5fb4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/join.d.ts	
@@ -0,0 +1,2 @@
+import { join } from "./index";
+export = join;
diff --git a/jtg js/node_modules/@types/lodash/kebabCase.d.ts b/jtg js/node_modules/@types/lodash/kebabCase.d.ts
new file mode 100644
index 0000000..c088ef7
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/kebabCase.d.ts	
@@ -0,0 +1,2 @@
+import { kebabCase } from "./index";
+export = kebabCase;
diff --git a/jtg js/node_modules/@types/lodash/keyBy.d.ts b/jtg js/node_modules/@types/lodash/keyBy.d.ts
new file mode 100644
index 0000000..664a722
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/keyBy.d.ts	
@@ -0,0 +1,2 @@
+import { keyBy } from "./index";
+export = keyBy;
diff --git a/jtg js/node_modules/@types/lodash/keys.d.ts b/jtg js/node_modules/@types/lodash/keys.d.ts
new file mode 100644
index 0000000..7eb29a0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/keys.d.ts	
@@ -0,0 +1,2 @@
+import { keys } from "./index";
+export = keys;
diff --git a/jtg js/node_modules/@types/lodash/keysIn.d.ts b/jtg js/node_modules/@types/lodash/keysIn.d.ts
new file mode 100644
index 0000000..c9eeee6
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/keysIn.d.ts	
@@ -0,0 +1,2 @@
+import { keysIn } from "./index";
+export = keysIn;
diff --git a/jtg js/node_modules/@types/lodash/last.d.ts b/jtg js/node_modules/@types/lodash/last.d.ts
new file mode 100644
index 0000000..cfdeb75
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/last.d.ts	
@@ -0,0 +1,2 @@
+import { last } from "./index";
+export = last;
diff --git a/jtg js/node_modules/@types/lodash/lastIndexOf.d.ts b/jtg js/node_modules/@types/lodash/lastIndexOf.d.ts
new file mode 100644
index 0000000..979d80d
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/lastIndexOf.d.ts	
@@ -0,0 +1,2 @@
+import { lastIndexOf } from "./index";
+export = lastIndexOf;
diff --git a/jtg js/node_modules/@types/lodash/lowerCase.d.ts b/jtg js/node_modules/@types/lodash/lowerCase.d.ts
new file mode 100644
index 0000000..475297d
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/lowerCase.d.ts	
@@ -0,0 +1,2 @@
+import { lowerCase } from "./index";
+export = lowerCase;
diff --git a/jtg js/node_modules/@types/lodash/lowerFirst.d.ts b/jtg js/node_modules/@types/lodash/lowerFirst.d.ts
new file mode 100644
index 0000000..0836228
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/lowerFirst.d.ts	
@@ -0,0 +1,2 @@
+import { lowerFirst } from "./index";
+export = lowerFirst;
diff --git a/jtg js/node_modules/@types/lodash/lt.d.ts b/jtg js/node_modules/@types/lodash/lt.d.ts
new file mode 100644
index 0000000..92cd4e2
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/lt.d.ts	
@@ -0,0 +1,2 @@
+import { lt } from "./index";
+export = lt;
diff --git a/jtg js/node_modules/@types/lodash/lte.d.ts b/jtg js/node_modules/@types/lodash/lte.d.ts
new file mode 100644
index 0000000..7c80f37
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/lte.d.ts	
@@ -0,0 +1,2 @@
+import { lte } from "./index";
+export = lte;
diff --git a/jtg js/node_modules/@types/lodash/map.d.ts b/jtg js/node_modules/@types/lodash/map.d.ts
new file mode 100644
index 0000000..2f783cb
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/map.d.ts	
@@ -0,0 +1,2 @@
+import { map } from "./index";
+export = map;
diff --git a/jtg js/node_modules/@types/lodash/mapKeys.d.ts b/jtg js/node_modules/@types/lodash/mapKeys.d.ts
new file mode 100644
index 0000000..7c7e1b5
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/mapKeys.d.ts	
@@ -0,0 +1,2 @@
+import { mapKeys } from "./index";
+export = mapKeys;
diff --git a/jtg js/node_modules/@types/lodash/mapValues.d.ts b/jtg js/node_modules/@types/lodash/mapValues.d.ts
new file mode 100644
index 0000000..3e87ea6
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/mapValues.d.ts	
@@ -0,0 +1,2 @@
+import { mapValues } from "./index";
+export = mapValues;
diff --git a/jtg js/node_modules/@types/lodash/matches.d.ts b/jtg js/node_modules/@types/lodash/matches.d.ts
new file mode 100644
index 0000000..5bb3cc2
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/matches.d.ts	
@@ -0,0 +1,2 @@
+import { matches } from "./index";
+export = matches;
diff --git a/jtg js/node_modules/@types/lodash/matchesProperty.d.ts b/jtg js/node_modules/@types/lodash/matchesProperty.d.ts
new file mode 100644
index 0000000..7378498
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/matchesProperty.d.ts	
@@ -0,0 +1,2 @@
+import { matchesProperty } from "./index";
+export = matchesProperty;
diff --git a/jtg js/node_modules/@types/lodash/max.d.ts b/jtg js/node_modules/@types/lodash/max.d.ts
new file mode 100644
index 0000000..36d0646
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/max.d.ts	
@@ -0,0 +1,2 @@
+import { max } from "./index";
+export = max;
diff --git a/jtg js/node_modules/@types/lodash/maxBy.d.ts b/jtg js/node_modules/@types/lodash/maxBy.d.ts
new file mode 100644
index 0000000..d483d95
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/maxBy.d.ts	
@@ -0,0 +1,2 @@
+import { maxBy } from "./index";
+export = maxBy;
diff --git a/jtg js/node_modules/@types/lodash/mean.d.ts b/jtg js/node_modules/@types/lodash/mean.d.ts
new file mode 100644
index 0000000..983ad77
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/mean.d.ts	
@@ -0,0 +1,2 @@
+import { mean } from "./index";
+export = mean;
diff --git a/jtg js/node_modules/@types/lodash/meanBy.d.ts b/jtg js/node_modules/@types/lodash/meanBy.d.ts
new file mode 100644
index 0000000..67aebbb
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/meanBy.d.ts	
@@ -0,0 +1,2 @@
+import { meanBy } from "./index";
+export = meanBy;
diff --git a/jtg js/node_modules/@types/lodash/memoize.d.ts b/jtg js/node_modules/@types/lodash/memoize.d.ts
new file mode 100644
index 0000000..6ff535b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/memoize.d.ts	
@@ -0,0 +1,2 @@
+import { memoize } from "./index";
+export = memoize;
diff --git a/jtg js/node_modules/@types/lodash/merge.d.ts b/jtg js/node_modules/@types/lodash/merge.d.ts
new file mode 100644
index 0000000..eb8bd95
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/merge.d.ts	
@@ -0,0 +1,2 @@
+import { merge } from "./index";
+export = merge;
diff --git a/jtg js/node_modules/@types/lodash/mergeWith.d.ts b/jtg js/node_modules/@types/lodash/mergeWith.d.ts
new file mode 100644
index 0000000..a58dd90
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/mergeWith.d.ts	
@@ -0,0 +1,2 @@
+import { mergeWith } from "./index";
+export = mergeWith;
diff --git a/jtg js/node_modules/@types/lodash/method.d.ts b/jtg js/node_modules/@types/lodash/method.d.ts
new file mode 100644
index 0000000..cc30588
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/method.d.ts	
@@ -0,0 +1,2 @@
+import { method } from "./index";
+export = method;
diff --git a/jtg js/node_modules/@types/lodash/methodOf.d.ts b/jtg js/node_modules/@types/lodash/methodOf.d.ts
new file mode 100644
index 0000000..af7f19a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/methodOf.d.ts	
@@ -0,0 +1,2 @@
+import { methodOf } from "./index";
+export = methodOf;
diff --git a/jtg js/node_modules/@types/lodash/min.d.ts b/jtg js/node_modules/@types/lodash/min.d.ts
new file mode 100644
index 0000000..e8ba597
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/min.d.ts	
@@ -0,0 +1,2 @@
+import { min } from "./index";
+export = min;
diff --git a/jtg js/node_modules/@types/lodash/minBy.d.ts b/jtg js/node_modules/@types/lodash/minBy.d.ts
new file mode 100644
index 0000000..74860f9
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/minBy.d.ts	
@@ -0,0 +1,2 @@
+import { minBy } from "./index";
+export = minBy;
diff --git a/jtg js/node_modules/@types/lodash/mixin.d.ts b/jtg js/node_modules/@types/lodash/mixin.d.ts
new file mode 100644
index 0000000..7984246
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/mixin.d.ts	
@@ -0,0 +1,2 @@
+import { mixin } from "./index";
+export = mixin;
diff --git a/jtg js/node_modules/@types/lodash/negate.d.ts b/jtg js/node_modules/@types/lodash/negate.d.ts
new file mode 100644
index 0000000..46d0596
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/negate.d.ts	
@@ -0,0 +1,2 @@
+import { negate } from "./index";
+export = negate;
diff --git a/jtg js/node_modules/@types/lodash/noConflict.d.ts b/jtg js/node_modules/@types/lodash/noConflict.d.ts
new file mode 100644
index 0000000..78b3c92
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/noConflict.d.ts	
@@ -0,0 +1,2 @@
+import { noConflict } from "./index";
+export = noConflict;
diff --git a/jtg js/node_modules/@types/lodash/noop.d.ts b/jtg js/node_modules/@types/lodash/noop.d.ts
new file mode 100644
index 0000000..bfaeb88
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/noop.d.ts	
@@ -0,0 +1,2 @@
+import { noop } from "./index";
+export = noop;
diff --git a/jtg js/node_modules/@types/lodash/now.d.ts b/jtg js/node_modules/@types/lodash/now.d.ts
new file mode 100644
index 0000000..00f807e
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/now.d.ts	
@@ -0,0 +1,2 @@
+import { now } from "./index";
+export = now;
diff --git a/jtg js/node_modules/@types/lodash/nth.d.ts b/jtg js/node_modules/@types/lodash/nth.d.ts
new file mode 100644
index 0000000..ce1013f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/nth.d.ts	
@@ -0,0 +1,2 @@
+import { nth } from "./index";
+export = nth;
diff --git a/jtg js/node_modules/@types/lodash/nthArg.d.ts b/jtg js/node_modules/@types/lodash/nthArg.d.ts
new file mode 100644
index 0000000..2729d70
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/nthArg.d.ts	
@@ -0,0 +1,2 @@
+import { nthArg } from "./index";
+export = nthArg;
diff --git a/jtg js/node_modules/@types/lodash/omit.d.ts b/jtg js/node_modules/@types/lodash/omit.d.ts
new file mode 100644
index 0000000..5868a07
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/omit.d.ts	
@@ -0,0 +1,2 @@
+import { omit } from "./index";
+export = omit;
diff --git a/jtg js/node_modules/@types/lodash/omitBy.d.ts b/jtg js/node_modules/@types/lodash/omitBy.d.ts
new file mode 100644
index 0000000..41bf6b4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/omitBy.d.ts	
@@ -0,0 +1,2 @@
+import { omitBy } from "./index";
+export = omitBy;
diff --git a/jtg js/node_modules/@types/lodash/once.d.ts b/jtg js/node_modules/@types/lodash/once.d.ts
new file mode 100644
index 0000000..4340e88
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/once.d.ts	
@@ -0,0 +1,2 @@
+import { once } from "./index";
+export = once;
diff --git a/jtg js/node_modules/@types/lodash/orderBy.d.ts b/jtg js/node_modules/@types/lodash/orderBy.d.ts
new file mode 100644
index 0000000..02320d5
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/orderBy.d.ts	
@@ -0,0 +1,2 @@
+import { orderBy } from "./index";
+export = orderBy;
diff --git a/jtg js/node_modules/@types/lodash/over.d.ts b/jtg js/node_modules/@types/lodash/over.d.ts
new file mode 100644
index 0000000..172c822
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/over.d.ts	
@@ -0,0 +1,2 @@
+import { over } from "./index";
+export = over;
diff --git a/jtg js/node_modules/@types/lodash/overArgs.d.ts b/jtg js/node_modules/@types/lodash/overArgs.d.ts
new file mode 100644
index 0000000..f8518f6
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/overArgs.d.ts	
@@ -0,0 +1,2 @@
+import { overArgs } from "./index";
+export = overArgs;
diff --git a/jtg js/node_modules/@types/lodash/overEvery.d.ts b/jtg js/node_modules/@types/lodash/overEvery.d.ts
new file mode 100644
index 0000000..b8328fb
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/overEvery.d.ts	
@@ -0,0 +1,2 @@
+import { overEvery } from "./index";
+export = overEvery;
diff --git a/jtg js/node_modules/@types/lodash/overSome.d.ts b/jtg js/node_modules/@types/lodash/overSome.d.ts
new file mode 100644
index 0000000..2f17258
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/overSome.d.ts	
@@ -0,0 +1,2 @@
+import { overSome } from "./index";
+export = overSome;
diff --git a/jtg js/node_modules/@types/lodash/package.json b/jtg js/node_modules/@types/lodash/package.json
new file mode 100644
index 0000000..4d92102
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/package.json	
@@ -0,0 +1,84 @@
+{
+  "_from": "@types/lodash",
+  "_id": "@types/lodash@4.14.110",
+  "_inBundle": false,
+  "_integrity": "sha1-+wdJj4QVKUfzDqCdiSB8oHEjRh4=",
+  "_location": "/@types/lodash",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "@types/lodash",
+    "name": "@types/lodash",
+    "escapedName": "@types%2flodash",
+    "scope": "@types",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "http://registry.npm.taobao.org/@types/lodash/download/@types/lodash-4.14.110.tgz",
+  "_shasum": "fb07498f84152947f30ea09d89207ca07123461e",
+  "_spec": "@types/lodash",
+  "_where": "Y:\\Downloads\\lodash-4.17.10",
+  "bugs": {
+    "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/issues"
+  },
+  "bundleDependencies": false,
+  "contributors": [
+    {
+      "name": "Brian Zengel",
+      "url": "https://github.com/bczengel"
+    },
+    {
+      "name": "Ilya Mochalov",
+      "url": "https://github.com/chrootsu"
+    },
+    {
+      "name": "Stepan Mikhaylyuk",
+      "url": "https://github.com/stepancar"
+    },
+    {
+      "name": "AJ Richardson",
+      "url": "https://github.com/aj-r"
+    },
+    {
+      "name": "Junyoung Clare Jang",
+      "url": "https://github.com/ailrun"
+    },
+    {
+      "name": "e-cloud",
+      "url": "https://github.com/e-cloud"
+    },
+    {
+      "name": "Georgii Dolzhykov",
+      "url": "https://github.com/thorn0"
+    },
+    {
+      "name": "Jack Moore",
+      "url": "https://github.com/jtmthf"
+    },
+    {
+      "name": "Dominique Rau",
+      "url": "https://github.com/DomiR"
+    }
+  ],
+  "dependencies": {},
+  "deprecated": false,
+  "description": "TypeScript definitions for Lo-Dash",
+  "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped#readme",
+  "license": "MIT",
+  "main": "",
+  "name": "@types/lodash",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/DefinitelyTyped/DefinitelyTyped.git"
+  },
+  "scripts": {},
+  "typeScriptVersion": "2.2",
+  "typesPublisherContentHash": "ddbd26faa38670a880f723bf4ae03db414e3aeaea656dff9a89414e0ed6fc685",
+  "version": "4.14.110"
+}
diff --git a/jtg js/node_modules/@types/lodash/pad.d.ts b/jtg js/node_modules/@types/lodash/pad.d.ts
new file mode 100644
index 0000000..552667a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/pad.d.ts	
@@ -0,0 +1,2 @@
+import { pad } from "./index";
+export = pad;
diff --git a/jtg js/node_modules/@types/lodash/padEnd.d.ts b/jtg js/node_modules/@types/lodash/padEnd.d.ts
new file mode 100644
index 0000000..c81a7b0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/padEnd.d.ts	
@@ -0,0 +1,2 @@
+import { padEnd } from "./index";
+export = padEnd;
diff --git a/jtg js/node_modules/@types/lodash/padStart.d.ts b/jtg js/node_modules/@types/lodash/padStart.d.ts
new file mode 100644
index 0000000..c119c35
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/padStart.d.ts	
@@ -0,0 +1,2 @@
+import { padStart } from "./index";
+export = padStart;
diff --git a/jtg js/node_modules/@types/lodash/parseInt.d.ts b/jtg js/node_modules/@types/lodash/parseInt.d.ts
new file mode 100644
index 0000000..de59e7b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/parseInt.d.ts	
@@ -0,0 +1,2 @@
+import { parseInt } from "./index";
+export = parseInt;
diff --git a/jtg js/node_modules/@types/lodash/partial.d.ts b/jtg js/node_modules/@types/lodash/partial.d.ts
new file mode 100644
index 0000000..d764f6e
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/partial.d.ts	
@@ -0,0 +1,2 @@
+import { partial } from "./index";
+export = partial;
diff --git a/jtg js/node_modules/@types/lodash/partialRight.d.ts b/jtg js/node_modules/@types/lodash/partialRight.d.ts
new file mode 100644
index 0000000..ed60160
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/partialRight.d.ts	
@@ -0,0 +1,2 @@
+import { partialRight } from "./index";
+export = partialRight;
diff --git a/jtg js/node_modules/@types/lodash/partition.d.ts b/jtg js/node_modules/@types/lodash/partition.d.ts
new file mode 100644
index 0000000..f26ab15
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/partition.d.ts	
@@ -0,0 +1,2 @@
+import { partition } from "./index";
+export = partition;
diff --git a/jtg js/node_modules/@types/lodash/pick.d.ts b/jtg js/node_modules/@types/lodash/pick.d.ts
new file mode 100644
index 0000000..6d346f8
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/pick.d.ts	
@@ -0,0 +1,2 @@
+import { pick } from "./index";
+export = pick;
diff --git a/jtg js/node_modules/@types/lodash/pickBy.d.ts b/jtg js/node_modules/@types/lodash/pickBy.d.ts
new file mode 100644
index 0000000..5285ead
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/pickBy.d.ts	
@@ -0,0 +1,2 @@
+import { pickBy } from "./index";
+export = pickBy;
diff --git a/jtg js/node_modules/@types/lodash/property.d.ts b/jtg js/node_modules/@types/lodash/property.d.ts
new file mode 100644
index 0000000..3ff96f0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/property.d.ts	
@@ -0,0 +1,2 @@
+import { property } from "./index";
+export = property;
diff --git a/jtg js/node_modules/@types/lodash/propertyOf.d.ts b/jtg js/node_modules/@types/lodash/propertyOf.d.ts
new file mode 100644
index 0000000..27c628f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/propertyOf.d.ts	
@@ -0,0 +1,2 @@
+import { propertyOf } from "./index";
+export = propertyOf;
diff --git a/jtg js/node_modules/@types/lodash/pull.d.ts b/jtg js/node_modules/@types/lodash/pull.d.ts
new file mode 100644
index 0000000..b496ebd
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/pull.d.ts	
@@ -0,0 +1,2 @@
+import { pull } from "./index";
+export = pull;
diff --git a/jtg js/node_modules/@types/lodash/pullAll.d.ts b/jtg js/node_modules/@types/lodash/pullAll.d.ts
new file mode 100644
index 0000000..22c81c4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/pullAll.d.ts	
@@ -0,0 +1,2 @@
+import { pullAll } from "./index";
+export = pullAll;
diff --git a/jtg js/node_modules/@types/lodash/pullAllBy.d.ts b/jtg js/node_modules/@types/lodash/pullAllBy.d.ts
new file mode 100644
index 0000000..e0629ce
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/pullAllBy.d.ts	
@@ -0,0 +1,2 @@
+import { pullAllBy } from "./index";
+export = pullAllBy;
diff --git a/jtg js/node_modules/@types/lodash/pullAllWith.d.ts b/jtg js/node_modules/@types/lodash/pullAllWith.d.ts
new file mode 100644
index 0000000..d3ce829
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/pullAllWith.d.ts	
@@ -0,0 +1,2 @@
+import { pullAllWith } from "./index";
+export = pullAllWith;
diff --git a/jtg js/node_modules/@types/lodash/pullAt.d.ts b/jtg js/node_modules/@types/lodash/pullAt.d.ts
new file mode 100644
index 0000000..47be382
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/pullAt.d.ts	
@@ -0,0 +1,2 @@
+import { pullAt } from "./index";
+export = pullAt;
diff --git a/jtg js/node_modules/@types/lodash/random.d.ts b/jtg js/node_modules/@types/lodash/random.d.ts
new file mode 100644
index 0000000..a68cc27
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/random.d.ts	
@@ -0,0 +1,2 @@
+import { random } from "./index";
+export = random;
diff --git a/jtg js/node_modules/@types/lodash/range.d.ts b/jtg js/node_modules/@types/lodash/range.d.ts
new file mode 100644
index 0000000..8f737ca
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/range.d.ts	
@@ -0,0 +1,2 @@
+import { range } from "./index";
+export = range;
diff --git a/jtg js/node_modules/@types/lodash/rangeRight.d.ts b/jtg js/node_modules/@types/lodash/rangeRight.d.ts
new file mode 100644
index 0000000..cabd0ed
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/rangeRight.d.ts	
@@ -0,0 +1,2 @@
+import { rangeRight } from "./index";
+export = rangeRight;
diff --git a/jtg js/node_modules/@types/lodash/rearg.d.ts b/jtg js/node_modules/@types/lodash/rearg.d.ts
new file mode 100644
index 0000000..7684e86
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/rearg.d.ts	
@@ -0,0 +1,2 @@
+import { rearg } from "./index";
+export = rearg;
diff --git a/jtg js/node_modules/@types/lodash/reduce.d.ts b/jtg js/node_modules/@types/lodash/reduce.d.ts
new file mode 100644
index 0000000..4765fcd
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/reduce.d.ts	
@@ -0,0 +1,2 @@
+import { reduce } from "./index";
+export = reduce;
diff --git a/jtg js/node_modules/@types/lodash/reduceRight.d.ts b/jtg js/node_modules/@types/lodash/reduceRight.d.ts
new file mode 100644
index 0000000..1cfdb5f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/reduceRight.d.ts	
@@ -0,0 +1,2 @@
+import { reduceRight } from "./index";
+export = reduceRight;
diff --git a/jtg js/node_modules/@types/lodash/reject.d.ts b/jtg js/node_modules/@types/lodash/reject.d.ts
new file mode 100644
index 0000000..aabc141
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/reject.d.ts	
@@ -0,0 +1,2 @@
+import { reject } from "./index";
+export = reject;
diff --git a/jtg js/node_modules/@types/lodash/remove.d.ts b/jtg js/node_modules/@types/lodash/remove.d.ts
new file mode 100644
index 0000000..dca4718
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/remove.d.ts	
@@ -0,0 +1,2 @@
+import { remove } from "./index";
+export = remove;
diff --git a/jtg js/node_modules/@types/lodash/repeat.d.ts b/jtg js/node_modules/@types/lodash/repeat.d.ts
new file mode 100644
index 0000000..ca3c7fc
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/repeat.d.ts	
@@ -0,0 +1,2 @@
+import { repeat } from "./index";
+export = repeat;
diff --git a/jtg js/node_modules/@types/lodash/replace.d.ts b/jtg js/node_modules/@types/lodash/replace.d.ts
new file mode 100644
index 0000000..7015411
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/replace.d.ts	
@@ -0,0 +1,2 @@
+import { replace } from "./index";
+export = replace;
diff --git a/jtg js/node_modules/@types/lodash/rest.d.ts b/jtg js/node_modules/@types/lodash/rest.d.ts
new file mode 100644
index 0000000..433a4fd
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/rest.d.ts	
@@ -0,0 +1,2 @@
+import { rest } from "./index";
+export = rest;
diff --git a/jtg js/node_modules/@types/lodash/result.d.ts b/jtg js/node_modules/@types/lodash/result.d.ts
new file mode 100644
index 0000000..6578642
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/result.d.ts	
@@ -0,0 +1,2 @@
+import { result } from "./index";
+export = result;
diff --git a/jtg js/node_modules/@types/lodash/reverse.d.ts b/jtg js/node_modules/@types/lodash/reverse.d.ts
new file mode 100644
index 0000000..ecef173
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/reverse.d.ts	
@@ -0,0 +1,2 @@
+import { reverse } from "./index";
+export = reverse;
diff --git a/jtg js/node_modules/@types/lodash/round.d.ts b/jtg js/node_modules/@types/lodash/round.d.ts
new file mode 100644
index 0000000..ed2c179
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/round.d.ts	
@@ -0,0 +1,2 @@
+import { round } from "./index";
+export = round;
diff --git a/jtg js/node_modules/@types/lodash/runInContext.d.ts b/jtg js/node_modules/@types/lodash/runInContext.d.ts
new file mode 100644
index 0000000..9ee01f3
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/runInContext.d.ts	
@@ -0,0 +1,2 @@
+import { runInContext } from "./index";
+export = runInContext;
diff --git a/jtg js/node_modules/@types/lodash/sample.d.ts b/jtg js/node_modules/@types/lodash/sample.d.ts
new file mode 100644
index 0000000..c225178
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/sample.d.ts	
@@ -0,0 +1,2 @@
+import { sample } from "./index";
+export = sample;
diff --git a/jtg js/node_modules/@types/lodash/sampleSize.d.ts b/jtg js/node_modules/@types/lodash/sampleSize.d.ts
new file mode 100644
index 0000000..0f1ed89
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/sampleSize.d.ts	
@@ -0,0 +1,2 @@
+import { sampleSize } from "./index";
+export = sampleSize;
diff --git a/jtg js/node_modules/@types/lodash/set.d.ts b/jtg js/node_modules/@types/lodash/set.d.ts
new file mode 100644
index 0000000..09d0c24
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/set.d.ts	
@@ -0,0 +1,2 @@
+import { set } from "./index";
+export = set;
diff --git a/jtg js/node_modules/@types/lodash/setWith.d.ts b/jtg js/node_modules/@types/lodash/setWith.d.ts
new file mode 100644
index 0000000..d4e319a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/setWith.d.ts	
@@ -0,0 +1,2 @@
+import { setWith } from "./index";
+export = setWith;
diff --git a/jtg js/node_modules/@types/lodash/shuffle.d.ts b/jtg js/node_modules/@types/lodash/shuffle.d.ts
new file mode 100644
index 0000000..ff96f88
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/shuffle.d.ts	
@@ -0,0 +1,2 @@
+import { shuffle } from "./index";
+export = shuffle;
diff --git a/jtg js/node_modules/@types/lodash/size.d.ts b/jtg js/node_modules/@types/lodash/size.d.ts
new file mode 100644
index 0000000..13d492f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/size.d.ts	
@@ -0,0 +1,2 @@
+import { size } from "./index";
+export = size;
diff --git a/jtg js/node_modules/@types/lodash/slice.d.ts b/jtg js/node_modules/@types/lodash/slice.d.ts
new file mode 100644
index 0000000..311d2fa
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/slice.d.ts	
@@ -0,0 +1,2 @@
+import { slice } from "./index";
+export = slice;
diff --git a/jtg js/node_modules/@types/lodash/snakeCase.d.ts b/jtg js/node_modules/@types/lodash/snakeCase.d.ts
new file mode 100644
index 0000000..8245a7d
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/snakeCase.d.ts	
@@ -0,0 +1,2 @@
+import { snakeCase } from "./index";
+export = snakeCase;
diff --git a/jtg js/node_modules/@types/lodash/some.d.ts b/jtg js/node_modules/@types/lodash/some.d.ts
new file mode 100644
index 0000000..90ef478
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/some.d.ts	
@@ -0,0 +1,2 @@
+import { some } from "./index";
+export = some;
diff --git a/jtg js/node_modules/@types/lodash/sortBy.d.ts b/jtg js/node_modules/@types/lodash/sortBy.d.ts
new file mode 100644
index 0000000..5f3d4f2
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/sortBy.d.ts	
@@ -0,0 +1,2 @@
+import { sortBy } from "./index";
+export = sortBy;
diff --git a/jtg js/node_modules/@types/lodash/sortedIndex.d.ts b/jtg js/node_modules/@types/lodash/sortedIndex.d.ts
new file mode 100644
index 0000000..c9c7911
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/sortedIndex.d.ts	
@@ -0,0 +1,2 @@
+import { sortedIndex } from "./index";
+export = sortedIndex;
diff --git a/jtg js/node_modules/@types/lodash/sortedIndexBy.d.ts b/jtg js/node_modules/@types/lodash/sortedIndexBy.d.ts
new file mode 100644
index 0000000..fdbedac
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/sortedIndexBy.d.ts	
@@ -0,0 +1,2 @@
+import { sortedIndexBy } from "./index";
+export = sortedIndexBy;
diff --git a/jtg js/node_modules/@types/lodash/sortedIndexOf.d.ts b/jtg js/node_modules/@types/lodash/sortedIndexOf.d.ts
new file mode 100644
index 0000000..a076c4a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/sortedIndexOf.d.ts	
@@ -0,0 +1,2 @@
+import { sortedIndexOf } from "./index";
+export = sortedIndexOf;
diff --git a/jtg js/node_modules/@types/lodash/sortedLastIndex.d.ts b/jtg js/node_modules/@types/lodash/sortedLastIndex.d.ts
new file mode 100644
index 0000000..808c2c0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/sortedLastIndex.d.ts	
@@ -0,0 +1,2 @@
+import { sortedLastIndex } from "./index";
+export = sortedLastIndex;
diff --git a/jtg js/node_modules/@types/lodash/sortedLastIndexBy.d.ts b/jtg js/node_modules/@types/lodash/sortedLastIndexBy.d.ts
new file mode 100644
index 0000000..9f23b9b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/sortedLastIndexBy.d.ts	
@@ -0,0 +1,2 @@
+import { sortedLastIndexBy } from "./index";
+export = sortedLastIndexBy;
diff --git a/jtg js/node_modules/@types/lodash/sortedLastIndexOf.d.ts b/jtg js/node_modules/@types/lodash/sortedLastIndexOf.d.ts
new file mode 100644
index 0000000..abdeba0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/sortedLastIndexOf.d.ts	
@@ -0,0 +1,2 @@
+import { sortedLastIndexOf } from "./index";
+export = sortedLastIndexOf;
diff --git a/jtg js/node_modules/@types/lodash/sortedUniq.d.ts b/jtg js/node_modules/@types/lodash/sortedUniq.d.ts
new file mode 100644
index 0000000..257d35a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/sortedUniq.d.ts	
@@ -0,0 +1,2 @@
+import { sortedUniq } from "./index";
+export = sortedUniq;
diff --git a/jtg js/node_modules/@types/lodash/sortedUniqBy.d.ts b/jtg js/node_modules/@types/lodash/sortedUniqBy.d.ts
new file mode 100644
index 0000000..316156e
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/sortedUniqBy.d.ts	
@@ -0,0 +1,2 @@
+import { sortedUniqBy } from "./index";
+export = sortedUniqBy;
diff --git a/jtg js/node_modules/@types/lodash/split.d.ts b/jtg js/node_modules/@types/lodash/split.d.ts
new file mode 100644
index 0000000..8879eb0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/split.d.ts	
@@ -0,0 +1,2 @@
+import { split } from "./index";
+export = split;
diff --git a/jtg js/node_modules/@types/lodash/spread.d.ts b/jtg js/node_modules/@types/lodash/spread.d.ts
new file mode 100644
index 0000000..4f816b2
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/spread.d.ts	
@@ -0,0 +1,2 @@
+import { spread } from "./index";
+export = spread;
diff --git a/jtg js/node_modules/@types/lodash/startCase.d.ts b/jtg js/node_modules/@types/lodash/startCase.d.ts
new file mode 100644
index 0000000..c201a11
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/startCase.d.ts	
@@ -0,0 +1,2 @@
+import { startCase } from "./index";
+export = startCase;
diff --git a/jtg js/node_modules/@types/lodash/startsWith.d.ts b/jtg js/node_modules/@types/lodash/startsWith.d.ts
new file mode 100644
index 0000000..a18b54f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/startsWith.d.ts	
@@ -0,0 +1,2 @@
+import { startsWith } from "./index";
+export = startsWith;
diff --git a/jtg js/node_modules/@types/lodash/subtract.d.ts b/jtg js/node_modules/@types/lodash/subtract.d.ts
new file mode 100644
index 0000000..6502fe2
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/subtract.d.ts	
@@ -0,0 +1,2 @@
+import { subtract } from "./index";
+export = subtract;
diff --git a/jtg js/node_modules/@types/lodash/sum.d.ts b/jtg js/node_modules/@types/lodash/sum.d.ts
new file mode 100644
index 0000000..4e01cb4
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/sum.d.ts	
@@ -0,0 +1,2 @@
+import { sum } from "./index";
+export = sum;
diff --git a/jtg js/node_modules/@types/lodash/sumBy.d.ts b/jtg js/node_modules/@types/lodash/sumBy.d.ts
new file mode 100644
index 0000000..92c4342
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/sumBy.d.ts	
@@ -0,0 +1,2 @@
+import { sumBy } from "./index";
+export = sumBy;
diff --git a/jtg js/node_modules/@types/lodash/tail.d.ts b/jtg js/node_modules/@types/lodash/tail.d.ts
new file mode 100644
index 0000000..2d80b44
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/tail.d.ts	
@@ -0,0 +1,2 @@
+import { tail } from "./index";
+export = tail;
diff --git a/jtg js/node_modules/@types/lodash/take.d.ts b/jtg js/node_modules/@types/lodash/take.d.ts
new file mode 100644
index 0000000..be99122
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/take.d.ts	
@@ -0,0 +1,2 @@
+import { take } from "./index";
+export = take;
diff --git a/jtg js/node_modules/@types/lodash/takeRight.d.ts b/jtg js/node_modules/@types/lodash/takeRight.d.ts
new file mode 100644
index 0000000..9d78866
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/takeRight.d.ts	
@@ -0,0 +1,2 @@
+import { takeRight } from "./index";
+export = takeRight;
diff --git a/jtg js/node_modules/@types/lodash/takeRightWhile.d.ts b/jtg js/node_modules/@types/lodash/takeRightWhile.d.ts
new file mode 100644
index 0000000..3b293de
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/takeRightWhile.d.ts	
@@ -0,0 +1,2 @@
+import { takeRightWhile } from "./index";
+export = takeRightWhile;
diff --git a/jtg js/node_modules/@types/lodash/takeWhile.d.ts b/jtg js/node_modules/@types/lodash/takeWhile.d.ts
new file mode 100644
index 0000000..088234a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/takeWhile.d.ts	
@@ -0,0 +1,2 @@
+import { takeWhile } from "./index";
+export = takeWhile;
diff --git a/jtg js/node_modules/@types/lodash/tap.d.ts b/jtg js/node_modules/@types/lodash/tap.d.ts
new file mode 100644
index 0000000..e15a13c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/tap.d.ts	
@@ -0,0 +1,2 @@
+import { tap } from "./index";
+export = tap;
diff --git a/jtg js/node_modules/@types/lodash/template.d.ts b/jtg js/node_modules/@types/lodash/template.d.ts
new file mode 100644
index 0000000..854e753
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/template.d.ts	
@@ -0,0 +1,2 @@
+import { template } from "./index";
+export = template;
diff --git a/jtg js/node_modules/@types/lodash/throttle.d.ts b/jtg js/node_modules/@types/lodash/throttle.d.ts
new file mode 100644
index 0000000..2650896
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/throttle.d.ts	
@@ -0,0 +1,2 @@
+import { throttle } from "./index";
+export = throttle;
diff --git a/jtg js/node_modules/@types/lodash/thru.d.ts b/jtg js/node_modules/@types/lodash/thru.d.ts
new file mode 100644
index 0000000..0447e12
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/thru.d.ts	
@@ -0,0 +1,2 @@
+import { thru } from "./index";
+export = thru;
diff --git a/jtg js/node_modules/@types/lodash/times.d.ts b/jtg js/node_modules/@types/lodash/times.d.ts
new file mode 100644
index 0000000..7fda4de
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/times.d.ts	
@@ -0,0 +1,2 @@
+import { times } from "./index";
+export = times;
diff --git a/jtg js/node_modules/@types/lodash/toArray.d.ts b/jtg js/node_modules/@types/lodash/toArray.d.ts
new file mode 100644
index 0000000..dd94c8a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/toArray.d.ts	
@@ -0,0 +1,2 @@
+import { toArray } from "./index";
+export = toArray;
diff --git a/jtg js/node_modules/@types/lodash/toFinite.d.ts b/jtg js/node_modules/@types/lodash/toFinite.d.ts
new file mode 100644
index 0000000..c575b47
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/toFinite.d.ts	
@@ -0,0 +1,2 @@
+import { toFinite } from "./index";
+export = toFinite;
diff --git a/jtg js/node_modules/@types/lodash/toInteger.d.ts b/jtg js/node_modules/@types/lodash/toInteger.d.ts
new file mode 100644
index 0000000..021a9c0
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/toInteger.d.ts	
@@ -0,0 +1,2 @@
+import { toInteger } from "./index";
+export = toInteger;
diff --git a/jtg js/node_modules/@types/lodash/toLength.d.ts b/jtg js/node_modules/@types/lodash/toLength.d.ts
new file mode 100644
index 0000000..41a4098
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/toLength.d.ts	
@@ -0,0 +1,2 @@
+import { toLength } from "./index";
+export = toLength;
diff --git a/jtg js/node_modules/@types/lodash/toLower.d.ts b/jtg js/node_modules/@types/lodash/toLower.d.ts
new file mode 100644
index 0000000..766c173
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/toLower.d.ts	
@@ -0,0 +1,2 @@
+import { toLower } from "./index";
+export = toLower;
diff --git a/jtg js/node_modules/@types/lodash/toNumber.d.ts b/jtg js/node_modules/@types/lodash/toNumber.d.ts
new file mode 100644
index 0000000..a6c5e1f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/toNumber.d.ts	
@@ -0,0 +1,2 @@
+import { toNumber } from "./index";
+export = toNumber;
diff --git a/jtg js/node_modules/@types/lodash/toPairs.d.ts b/jtg js/node_modules/@types/lodash/toPairs.d.ts
new file mode 100644
index 0000000..4a7846e
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/toPairs.d.ts	
@@ -0,0 +1,2 @@
+import { toPairs } from "./index";
+export = toPairs;
diff --git a/jtg js/node_modules/@types/lodash/toPairsIn.d.ts b/jtg js/node_modules/@types/lodash/toPairsIn.d.ts
new file mode 100644
index 0000000..82d71b3
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/toPairsIn.d.ts	
@@ -0,0 +1,2 @@
+import { toPairsIn } from "./index";
+export = toPairsIn;
diff --git a/jtg js/node_modules/@types/lodash/toPath.d.ts b/jtg js/node_modules/@types/lodash/toPath.d.ts
new file mode 100644
index 0000000..ff354e5
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/toPath.d.ts	
@@ -0,0 +1,2 @@
+import { toPath } from "./index";
+export = toPath;
diff --git a/jtg js/node_modules/@types/lodash/toPlainObject.d.ts b/jtg js/node_modules/@types/lodash/toPlainObject.d.ts
new file mode 100644
index 0000000..0561ab6
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/toPlainObject.d.ts	
@@ -0,0 +1,2 @@
+import { toPlainObject } from "./index";
+export = toPlainObject;
diff --git a/jtg js/node_modules/@types/lodash/toSafeInteger.d.ts b/jtg js/node_modules/@types/lodash/toSafeInteger.d.ts
new file mode 100644
index 0000000..6bb24d8
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/toSafeInteger.d.ts	
@@ -0,0 +1,2 @@
+import { toSafeInteger } from "./index";
+export = toSafeInteger;
diff --git a/jtg js/node_modules/@types/lodash/toString.d.ts b/jtg js/node_modules/@types/lodash/toString.d.ts
new file mode 100644
index 0000000..7765d10
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/toString.d.ts	
@@ -0,0 +1,2 @@
+import { toString } from "./index";
+export = toString;
diff --git a/jtg js/node_modules/@types/lodash/toUpper.d.ts b/jtg js/node_modules/@types/lodash/toUpper.d.ts
new file mode 100644
index 0000000..af43041
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/toUpper.d.ts	
@@ -0,0 +1,2 @@
+import { toUpper } from "./index";
+export = toUpper;
diff --git a/jtg js/node_modules/@types/lodash/transform.d.ts b/jtg js/node_modules/@types/lodash/transform.d.ts
new file mode 100644
index 0000000..05e6543
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/transform.d.ts	
@@ -0,0 +1,2 @@
+import { transform } from "./index";
+export = transform;
diff --git a/jtg js/node_modules/@types/lodash/trim.d.ts b/jtg js/node_modules/@types/lodash/trim.d.ts
new file mode 100644
index 0000000..7d0bf90
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/trim.d.ts	
@@ -0,0 +1,2 @@
+import { trim } from "./index";
+export = trim;
diff --git a/jtg js/node_modules/@types/lodash/trimEnd.d.ts b/jtg js/node_modules/@types/lodash/trimEnd.d.ts
new file mode 100644
index 0000000..b80c844
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/trimEnd.d.ts	
@@ -0,0 +1,2 @@
+import { trimEnd } from "./index";
+export = trimEnd;
diff --git a/jtg js/node_modules/@types/lodash/trimStart.d.ts b/jtg js/node_modules/@types/lodash/trimStart.d.ts
new file mode 100644
index 0000000..a040712
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/trimStart.d.ts	
@@ -0,0 +1,2 @@
+import { trimStart } from "./index";
+export = trimStart;
diff --git a/jtg js/node_modules/@types/lodash/truncate.d.ts b/jtg js/node_modules/@types/lodash/truncate.d.ts
new file mode 100644
index 0000000..0ae065b
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/truncate.d.ts	
@@ -0,0 +1,2 @@
+import { truncate } from "./index";
+export = truncate;
diff --git a/jtg js/node_modules/@types/lodash/unary.d.ts b/jtg js/node_modules/@types/lodash/unary.d.ts
new file mode 100644
index 0000000..4456997
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/unary.d.ts	
@@ -0,0 +1,2 @@
+import { unary } from "./index";
+export = unary;
diff --git a/jtg js/node_modules/@types/lodash/unescape.d.ts b/jtg js/node_modules/@types/lodash/unescape.d.ts
new file mode 100644
index 0000000..71ba85d
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/unescape.d.ts	
@@ -0,0 +1,2 @@
+import { unescape } from "./index";
+export = unescape;
diff --git a/jtg js/node_modules/@types/lodash/union.d.ts b/jtg js/node_modules/@types/lodash/union.d.ts
new file mode 100644
index 0000000..7b12e92
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/union.d.ts	
@@ -0,0 +1,2 @@
+import { union } from "./index";
+export = union;
diff --git a/jtg js/node_modules/@types/lodash/unionBy.d.ts b/jtg js/node_modules/@types/lodash/unionBy.d.ts
new file mode 100644
index 0000000..0cb1992
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/unionBy.d.ts	
@@ -0,0 +1,2 @@
+import { unionBy } from "./index";
+export = unionBy;
diff --git a/jtg js/node_modules/@types/lodash/unionWith.d.ts b/jtg js/node_modules/@types/lodash/unionWith.d.ts
new file mode 100644
index 0000000..9888092
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/unionWith.d.ts	
@@ -0,0 +1,2 @@
+import { unionWith } from "./index";
+export = unionWith;
diff --git a/jtg js/node_modules/@types/lodash/uniq.d.ts b/jtg js/node_modules/@types/lodash/uniq.d.ts
new file mode 100644
index 0000000..6c105ac
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/uniq.d.ts	
@@ -0,0 +1,2 @@
+import { uniq } from "./index";
+export = uniq;
diff --git a/jtg js/node_modules/@types/lodash/uniqBy.d.ts b/jtg js/node_modules/@types/lodash/uniqBy.d.ts
new file mode 100644
index 0000000..7101b0e
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/uniqBy.d.ts	
@@ -0,0 +1,2 @@
+import { uniqBy } from "./index";
+export = uniqBy;
diff --git a/jtg js/node_modules/@types/lodash/uniqWith.d.ts b/jtg js/node_modules/@types/lodash/uniqWith.d.ts
new file mode 100644
index 0000000..72c3f8f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/uniqWith.d.ts	
@@ -0,0 +1,2 @@
+import { uniqWith } from "./index";
+export = uniqWith;
diff --git a/jtg js/node_modules/@types/lodash/uniqueId.d.ts b/jtg js/node_modules/@types/lodash/uniqueId.d.ts
new file mode 100644
index 0000000..4ea55f9
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/uniqueId.d.ts	
@@ -0,0 +1,2 @@
+import { uniqueId } from "./index";
+export = uniqueId;
diff --git a/jtg js/node_modules/@types/lodash/unset.d.ts b/jtg js/node_modules/@types/lodash/unset.d.ts
new file mode 100644
index 0000000..1eac8dd
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/unset.d.ts	
@@ -0,0 +1,2 @@
+import { unset } from "./index";
+export = unset;
diff --git a/jtg js/node_modules/@types/lodash/unzip.d.ts b/jtg js/node_modules/@types/lodash/unzip.d.ts
new file mode 100644
index 0000000..7e320a2
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/unzip.d.ts	
@@ -0,0 +1,2 @@
+import { unzip } from "./index";
+export = unzip;
diff --git a/jtg js/node_modules/@types/lodash/unzipWith.d.ts b/jtg js/node_modules/@types/lodash/unzipWith.d.ts
new file mode 100644
index 0000000..2bf5394
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/unzipWith.d.ts	
@@ -0,0 +1,2 @@
+import { unzipWith } from "./index";
+export = unzipWith;
diff --git a/jtg js/node_modules/@types/lodash/update.d.ts b/jtg js/node_modules/@types/lodash/update.d.ts
new file mode 100644
index 0000000..d072c0f
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/update.d.ts	
@@ -0,0 +1,2 @@
+import { update } from "./index";
+export = update;
diff --git a/jtg js/node_modules/@types/lodash/updateWith.d.ts b/jtg js/node_modules/@types/lodash/updateWith.d.ts
new file mode 100644
index 0000000..4417542
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/updateWith.d.ts	
@@ -0,0 +1,2 @@
+import { updateWith } from "./index";
+export = updateWith;
diff --git a/jtg js/node_modules/@types/lodash/upperCase.d.ts b/jtg js/node_modules/@types/lodash/upperCase.d.ts
new file mode 100644
index 0000000..c33598a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/upperCase.d.ts	
@@ -0,0 +1,2 @@
+import { upperCase } from "./index";
+export = upperCase;
diff --git a/jtg js/node_modules/@types/lodash/upperFirst.d.ts b/jtg js/node_modules/@types/lodash/upperFirst.d.ts
new file mode 100644
index 0000000..1f1b2a7
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/upperFirst.d.ts	
@@ -0,0 +1,2 @@
+import { upperFirst } from "./index";
+export = upperFirst;
diff --git a/jtg js/node_modules/@types/lodash/values.d.ts b/jtg js/node_modules/@types/lodash/values.d.ts
new file mode 100644
index 0000000..2015ebf
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/values.d.ts	
@@ -0,0 +1,2 @@
+import { values } from "./index";
+export = values;
diff --git a/jtg js/node_modules/@types/lodash/valuesIn.d.ts b/jtg js/node_modules/@types/lodash/valuesIn.d.ts
new file mode 100644
index 0000000..6f8d6a3
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/valuesIn.d.ts	
@@ -0,0 +1,2 @@
+import { valuesIn } from "./index";
+export = valuesIn;
diff --git a/jtg js/node_modules/@types/lodash/without.d.ts b/jtg js/node_modules/@types/lodash/without.d.ts
new file mode 100644
index 0000000..bbdfe16
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/without.d.ts	
@@ -0,0 +1,2 @@
+import { without } from "./index";
+export = without;
diff --git a/jtg js/node_modules/@types/lodash/words.d.ts b/jtg js/node_modules/@types/lodash/words.d.ts
new file mode 100644
index 0000000..22da6cb
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/words.d.ts	
@@ -0,0 +1,2 @@
+import { words } from "./index";
+export = words;
diff --git a/jtg js/node_modules/@types/lodash/wrap.d.ts b/jtg js/node_modules/@types/lodash/wrap.d.ts
new file mode 100644
index 0000000..3c20f28
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/wrap.d.ts	
@@ -0,0 +1,2 @@
+import { wrap } from "./index";
+export = wrap;
diff --git a/jtg js/node_modules/@types/lodash/xor.d.ts b/jtg js/node_modules/@types/lodash/xor.d.ts
new file mode 100644
index 0000000..894735c
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/xor.d.ts	
@@ -0,0 +1,2 @@
+import { xor } from "./index";
+export = xor;
diff --git a/jtg js/node_modules/@types/lodash/xorBy.d.ts b/jtg js/node_modules/@types/lodash/xorBy.d.ts
new file mode 100644
index 0000000..6a08c6a
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/xorBy.d.ts	
@@ -0,0 +1,2 @@
+import { xorBy } from "./index";
+export = xorBy;
diff --git a/jtg js/node_modules/@types/lodash/xorWith.d.ts b/jtg js/node_modules/@types/lodash/xorWith.d.ts
new file mode 100644
index 0000000..7cdcaf3
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/xorWith.d.ts	
@@ -0,0 +1,2 @@
+import { xorWith } from "./index";
+export = xorWith;
diff --git a/jtg js/node_modules/@types/lodash/zip.d.ts b/jtg js/node_modules/@types/lodash/zip.d.ts
new file mode 100644
index 0000000..e7467cd
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/zip.d.ts	
@@ -0,0 +1,2 @@
+import { zip } from "./index";
+export = zip;
diff --git a/jtg js/node_modules/@types/lodash/zipObject.d.ts b/jtg js/node_modules/@types/lodash/zipObject.d.ts
new file mode 100644
index 0000000..ad049fd
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/zipObject.d.ts	
@@ -0,0 +1,2 @@
+import { zipObject } from "./index";
+export = zipObject;
diff --git a/jtg js/node_modules/@types/lodash/zipObjectDeep.d.ts b/jtg js/node_modules/@types/lodash/zipObjectDeep.d.ts
new file mode 100644
index 0000000..2a483e8
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/zipObjectDeep.d.ts	
@@ -0,0 +1,2 @@
+import { zipObjectDeep } from "./index";
+export = zipObjectDeep;
diff --git a/jtg js/node_modules/@types/lodash/zipWith.d.ts b/jtg js/node_modules/@types/lodash/zipWith.d.ts
new file mode 100644
index 0000000..4869374
--- /dev/null
+++ b/jtg js/node_modules/@types/lodash/zipWith.d.ts	
@@ -0,0 +1,2 @@
+import { zipWith } from "./index";
+export = zipWith;
diff --git a/jtg js/node_modules/@types/os/index.d.ts b/jtg js/node_modules/@types/os/index.d.ts
new file mode 100644
index 0000000..78b6d75
--- /dev/null
+++ b/jtg js/node_modules/@types/os/index.d.ts	
@@ -0,0 +1,77 @@
+declare namespace TopJsSystem {
+
+    export interface NetworkInterface {
+        name:string,
+        mac:string,
+        address:string,
+        netmask:string,
+    }
+
+    /**
+     * 获取操作系统位数;'x32'|'x64'
+     */
+    export function arch():string
+
+    /**
+     * 返回计算机主机名
+     */
+    export function hostname():string
+
+    /**
+     * 返回计算机网卡信息
+     */
+    export function networkInterfaces():Map<string, Array<NetworkInterface>>
+
+    /**
+     * 获取操作系统临时目录
+     */
+    export function tmpdir():string
+
+    /**
+     * 获取操作系统当前用户HOME目录;
+     */
+    export function homedir():string
+
+    /**
+     * 返回操作系统类型'windows'|'linux'|'mac'
+     */
+    export function type():string
+    
+
+    /**
+     * 获取操作系统内核类型
+     */
+    export function kernelType():string
+
+    /**
+     * 获取操作系统内核版本
+     */
+    export function kernelVersion():string
+
+    /**
+     * 获取操作系统版本
+     */
+    export function version():string
+
+    /**
+     * 获取操作系统名称
+     */
+    export function name():string
+
+    /**
+     * 获取操作系统名称2
+     */
+    export function prettyName():string
+
+    /**
+     * 获取操作系统时间
+     */
+    export function getNow():string
+
+    /**
+     * 获取操作系统日期
+     */
+    export function getToday():string
+}
+
+export = TopJsSystem;
diff --git a/jtg js/node_modules/@types/process/index.d.ts b/jtg js/node_modules/@types/process/index.d.ts
new file mode 100644
index 0000000..e47ab43
--- /dev/null
+++ b/jtg js/node_modules/@types/process/index.d.ts	
@@ -0,0 +1,172 @@
+declare namespace TopJsProcess {
+
+    export class ProcessStream {
+        /**
+         * 设置文件编码
+         * @param iEncoding 
+         */
+        setCodec(iEncoding:string):void
+
+        /**
+         * 获取设置的文件编码
+         */
+        codec():string
+
+        /**
+         * 设置自动检测Unicode
+         * @param iEnabled 
+         */
+        setAutoDetectUnicode(iEnabled:boolean):void
+
+        /**
+         * 是否自动检测Unicode
+         */
+        isAutoDetectUnicode():boolean
+
+        /**
+         * 设置是否每次在写入文件时自动刷新缓存至文件
+         * @param iAutoFlush 
+         */
+        setAutoFlush(iAutoFlush:boolean):void
+
+        /**
+         * 是否每次在写入文件时自动刷新缓存至文件
+         */
+        isAutoFlush():boolean
+
+        /**
+         * 是否读取到文件结尾
+         */
+        atEnd():boolean
+
+        /**
+         * 将文件读取位置重置
+         */
+        reset():void
+
+        /**
+         * 刷新缓存至文件
+         */
+        flush():void
+
+        /**
+         * 读取一行,iMaxLen为最大读取长度;iMaxLen=0表示不限制大小;
+         * @param iMaxLen 
+         */
+        readLine(iMaxLen:Number=0):string
+
+        /**
+         * 读取全部文件内容
+         */
+        readAll():string
+
+        /**
+         * 读取指定大小文本块
+         * @param iMaxLen 
+         */
+        read(iMaxLen:Number):string
+
+        /**
+         * 写入文件
+         * @param iText 
+         */
+        write(iText:string):void
+    }
+
+
+    /**
+     * 命令行参数
+     */
+    export var argv:Array<string>
+
+    /**
+     * 标准输出流
+     */
+    export var stdout:ProcessStream
+
+    /**
+     * 标准输入流
+     */
+    export var stdin:ProcessStream
+
+    /**
+     * 标准错误流
+     */
+    export var stderr:ProcessStream
+
+    /**
+     * 获取topjs执行文件路径
+     */
+    export function topjsBinPath():string
+
+    /**
+     * 获取当前进程PID号
+     */
+    export function pid():number
+    
+
+    /**
+     * 获取平台名称
+     */
+    export function platform():string
+
+    /**
+     * 获取当前执行的脚本文件路径;(不包含文件名)
+     */
+    export function evalFileDir():string
+
+    /**
+     * 获取当前执行的脚本文件名;
+     */
+    export function evalFileName():string
+
+    /**
+     * 获取当前执行的脚本文件除去后缀后的名称;
+     */
+    export function evalFileBaseName():string
+
+    /**
+     * 创建一个事件对象
+     */
+    export function createEvent():any
+
+    /**
+     * 获取环境变量
+     * @param iName 
+     */
+    export function getEnv(iName:string):string
+
+    /**
+     * 设置环境变量
+     * @param iName 
+     * @param iValue 
+     */
+    export function setEnv(iName:string, iValue:string):boolean
+    
+    /**
+     * 立即对进程进行垃圾回收;
+     */
+    export function gc():null
+
+    /**
+     * 退出
+     * @param iCode 
+     */
+    export function exit(iCode:Number):void
+
+    /**
+     * 开始事件主循环
+     */
+    export function mainLoop():void
+
+
+    /**
+     * 执行外部命令
+     * @param iCmd 
+     * @param iArgs 
+     */
+    export function exec(iCmd:string,iArgs:Array<string>):string
+
+}
+
+export = TopJsProcess;
diff --git a/jtg js/node_modules/@types/topcam.gencom/index.d.ts b/jtg js/node_modules/@types/topcam.gencom/index.d.ts
new file mode 100644
index 0000000..fdb7026
--- /dev/null
+++ b/jtg js/node_modules/@types/topcam.gencom/index.d.ts	
@@ -0,0 +1,1434 @@
+import { type } from "os";
+
+declare class TopCamGenCom {
+    constructor(p?:{cam_type?:'genesis'|'incam'='genesis', error_handle?:0|1=1});
+    /**
+     * 获取当前料号
+     * @returns 返回当前料号名
+     */
+    currentJob():string;
+
+    /**
+     * 获取当前工作层
+     * @returns 返回当前工作层名
+     */
+    getWorkLayer():string;
+
+    /**
+     * 获取当前影响层
+     * @returns 返回当前影响层
+     */
+    getAffectLayer(): string[];
+
+    /**
+     * 获取当前显示的层
+     * @returns 返回当前显示的层
+     */
+    getDispLayers():string[];
+
+    /**
+     * 获取所有`genesis`料号列表
+     * @returns 返回料号列表
+     */
+    getJobList():string[];
+
+    /**
+     * 获取当前`genesis`登录用户名
+     * @returns 返回当前登录用户名
+     */
+    getUserName():string;
+
+    /**
+     * 获取指定料号所在路径
+     * @returns 返回料号所在路径
+     * @example 
+     * var getJobPath = $.gen.getJobPath({job:jobname});
+     */
+    getJobPath(object:object):string;
+
+    /**
+     * 获取指定料号所属DB,暂不支持incam
+     * @returns 返回料号所属DB
+     * @example 
+     * var getJobDbName = $.gen.getJobDbName({job:jobname});
+     */
+    getJobDbName(object:object):string;
+
+    /**
+     * 判断料号是不是存在
+     * @returns 返回真 或者 假
+     * @example 
+     * var isJobExists = $.gen.isJobExists({job:jobname});
+     */
+    isJobExists(object:object):boolean;
+
+    /**
+     * 判断料号是不是被打开 
+     * @returns 返回真 或者 假
+     * @example 
+     * var isJobOpen = $.gen.isJobOpen({job:jobname});
+     */
+    isJobOpen(object:object):boolean;
+
+    /**
+     * 创建一个新料号 
+     * @returns 返回exists(料号存在) or 1(创建成功)
+     * @example 
+     * var createJob = $.gen.createJob({name:'aa',db:'genesis'});
+     */
+    createJob(p:{name:string,db:string}):string;
+
+    /**
+     * 打开一个存在的料号 
+     * @returns æ— 
+     * @example 
+     * $.gen.openJob({job:jobname});
+     */
+    openJob(p:{job:string,update_clipboard?: 'view_job'|''}):void;
+
+    /**
+     * 关闭一个打开的料号 
+     * @returns 真 或者 假
+     * @example 
+     * var closeJob = $.gen.closeJob({job:jobname});
+     */
+    closeJob(p:{job:string}):boolean;
+
+    /**
+     * 删除一个存在的料号,如果料号是打开的, 将自动关闭 
+     * @returns 真 或者 假
+     * @example 
+     * var deleteJob = $.gen.deleteJob({job:jobname});
+     */
+    deleteJob(p:{job:string}):boolean;
+
+    /**
+     * 删除一个存在的step,如果不存在将返回0 
+     * @returns 真 或者 假
+     * @example 
+     * var deleteStep = $.gen.deleteStep({job:jobname,step:stepname});
+     */
+    deleteStep(p:{job:string,step:string}):boolean;
+
+    /**
+     * 导入一个`odb++`料号 
+     * @returns 真 或者 假
+     * @example 
+     * var importJob = $.gen.importJob({db:'genesis',path:'/tmp/aaa.tgz',name:jobname,analyze_surfaces:'yes'});
+     */
+    importJob(p:{db:string,path:string,name:string,analyze_surfaces:string}):boolean;
+
+    /**
+     * 列举所有genesis中打开的料号 
+     * @returns 料号列表和打开的用户(数组或数组引用)
+     * @example 
+     * var listOpenJobs = $.gen.listOpenJobs();
+     */
+    listOpenJobs():T[];
+
+    /**
+     * 创建一个step 
+     * @returns 真 或者 假
+     * @example 
+     * var createStep = $.gen.createStep({job:jobname,name:stepname});
+     */
+    createStep(p:{job:string,name:string}):boolean;
+
+    /**
+     * 检查step是不是存在 
+     * @returns 真 或者 假
+     * @example 
+     * var isStepExists = $.gen.isStepExists({job:jobname,step:stepname});
+     */
+    isStepExists(p:{job:string,step:string}):boolean;
+
+    /**
+     * 取得指定料号所有step名字 
+     * @returns step列表
+     * @example 
+     * var getStepList = $.gen.getStepList({job:jobname});
+     */
+    getStepList(p:{job:string}):T[];
+
+    /**
+     * 打开一个step 
+     * @returns 真 或者 假
+     * @example 
+     * var openStep = $.gen.openStep({job:jobname,name:stepname});
+     */
+    openStep(p:{job:string,name:string,iconic?:'no'|'yes'}):boolean;
+
+    /**
+     * 设置当前工作group 
+     * @returns æ— 
+     * @example 
+     * $.gen.setGroup({group:group});
+     */
+    setGroup(p:{group:number}):void;
+
+    /**
+     * 取得指定料号的matrix信息 
+     * @returns matrix信息
+     * @example 
+     * var getMatrix = $.gen.getMatrix({job:jobname});
+     */
+    getMatrix(p:{job:string,type?:'hash'|'array'='hash',layer?:string}):object;
+
+    /**
+     * 在matrix中增加一个层 
+     * @param after将优先于before
+     * @returns æ— 
+     * @example 
+     * $.gen.matrixAddLayer({job:jobname,layer:name,type:'signal',context:'board',polarity:'positive',before:'l1'});
+     */
+    matrixAddLayer(p:{job:string,layer:string,type:string,context:string,polarity:string,row:number,after:string,before:string}):void;
+
+    /**
+     * 在matrix中移动指定的行(或者层)到相应的位置(ins_row,after,before) 
+     * @param row将优先于layer
+     * @param ins_row将优先于after,after将优先于before
+     * @returns æ— 
+     * @example 
+     * $.gen.matrixMoveRow({job:jobname,layer:name,before:'l1'});
+     */
+    matrixMoveRow(p:{job:string,layer:string,row:number,ins_row:number,after:string,before:string}):void;
+
+    /**
+     * 在matrix中增加一个Step  
+     * @param after将优先于before
+     * @returns æ— 
+     * @example 
+     * $.gen.matrixAddStep({job:jobname,step:step,before:'pcb'});
+     */
+    matrixAddStep(p:{job:string,layer:string,after:string,before:string}):void;
+
+    /**
+     * 在matrix中删除一个Step  
+     * @returns æ— 
+     * @example 
+     * $.gen.matrixDeleteStep({job:jobname,step:step});
+     */
+    matrixDeleteStep(p:{job:string,step:string}):void;
+
+    /**
+     * 在matrix中Copy一个Step  
+     * @param after将优先于before
+     * @returns æ— 
+     * @example 
+     * $.gen.matrixCopyStep({job:jobname,step:step,new_name:'net'});
+     */
+    matrixCopyStep(p:{job:string,step:string,new_name:string,after:string,before:string}):void;
+
+    /**
+     * 在matrix中Copy一个Layer  
+     * @param after将优先于before
+     * @returns æ— 
+     * @example 
+     * $.gen.matrixCopyLayer({job:jobname,layer:layer,new_name:'new_layer'});
+     */
+    matrixCopyLayer(p:{job:string,layer:string,new_name:string,after?:string,before?:string,type?:'signal'|'solder_mask',context?:'board'|'misc',polarity?:'positive'|'negative'}):void;
+
+    /**
+     * 打开指定料号的matrix编辑窗口
+     * @returns æ— 
+     * @example 
+     * $.gen.openMatrix({job:jobname});
+     */
+    openMatrix(p:{job:string}):void;
+
+    /**
+     * 刷新指定料号的matrix信息
+     * @returns æ— 
+     * @example 
+     * $.gen.matrixRefresh({job:jobname});
+     */
+    matrixRefresh(p:{job:string}):void;
+
+    /**
+     * 设定指定层的matrix信息
+     * @returns æ— 
+     * @example 
+     * $.gen.matrixLayerAttr({job:jobname,layer:layername,type:'drill'});
+     */
+    matrixLayerAttr(p:{job:string,layer?:string|T,type?:string,context?:string,polarity?:string}):void;
+
+    /**
+     * 设定钻孔层的开始与结束
+     * @returns æ— 
+     * @example 
+     * $.gen.matrixLayerDrill({job:jobname,layer:layername,start:startlayer,end:endlayer});
+     */
+    matrixLayerDrill(p:{job:string,layer:string,start:string,end:string}):void;
+
+    /**
+     * 根据matrix,计算出板子的层数
+     * @returns 层数
+     * @example 
+     * var getLayerCount = $.gen.getLayerCount({job:jobname});
+     */
+    getLayerCount(p:{job:string}):number;
+
+    /**
+     * 取得drill tool manage 中的所有钻孔信息
+     * @returns drill信息(array or hash)
+     * @example 
+     * var getTool = $.gen.getTool({job:jobname,step:step,layer:layer});
+     */
+    getTool(p:{job:string,step:string,layer:string,type?:'hash'|"array",hashkey?:'num'|"count",units?:'inch'|"mm"}):any;
+
+    /**
+     * 设置drill tool manage 中参数(只有当genesis ver > 9.1才有效)
+     * @returns æ— 
+     * @example 
+     * $.gen.toolSet({job:jobname,step:step,layer:layer,slots:'by_length'});
+     */
+    toolSet(p:{job:string,step:string,layer:string,thickness?:string,user_params?:string,slots?:'by_length'}):void;
+
+    /**
+     * 输出PostScript格式
+     * @returns æ— 
+     * @example 
+     * $.gen.outputPostScript({job:'demo',step:'pcb',layer:'drawing',dir_path:'d:/test/',layer_params:{angle:90,mirror:'yes',x_scale:1,yscale:1,..},outpu_params:{break_symbols:'yes',break_arc:'no',surface_mode:'fill',...}});
+     */
+    outputPostScript(p:{job:string,step:string,layer:string,dir_path:string,layer_params:object,output_params:object}):void;
+
+    /**
+     * 输出RS274X格式
+     * @returns æ— 
+     * @example 
+     * $.gen.outputRs274x({job:'demo',step:'pcb',layer:'drawing',dir_path:'d:/test/',layer_params:{angle:90,mirror:'yes',x_scale:1,yscale:1,..},outpu_params:{break_symbols:'yes',break_arc:'no',surface_mode:'fill',...}});
+     */
+    outputRs274x(p:{job:string,step:string,layer:string,dir_path:string,layer_params:object,output_params:object}):void;
+
+    /**
+     * 输出DXF格式
+     * @returns æ— 
+     * @example 
+     * $.gen.outputDxf({job:'demo',step:'pcb',layer:'drawing',dir_path:'d:/test/',layer_params:{angle:90,mirror:'yes',x_scale:1,yscale:1,..},outpu_params:{break_symbols:'yes',break_arc:'no',surface_mode:'fill',...}});
+     */
+    outputDxf(p:{job:string,step:string,layer:string,dir_path:string,layer_params:object,output_params:object}):void;
+
+    /**
+     * 检查层是否存在 
+     * @returns 存在返回1,不存在返回0
+     * @example 
+     * var isLayerExists = $.gen.isLayerExists({job:jobname,layer:layer});
+     */
+    isLayerExists(p:{job:string,layer:string}):boolean;    
+
+    /**
+     * 创建一个新层 
+     * @returns æ— 
+     * @example 
+     * $.gen.createLayer({job:'demo',layer:'drawing',conext:'board',type:'document'});
+     */
+    createLayer(p:{job:string,layer:string,conext?:'misc'|'board',type?:'signal'|'document',before?:string,after?:string,delete_exists ?:'no'|'yes'}):void;  
+
+    /**
+     * 在step上删除一层 
+     * @returns æ— 
+     * @example 
+     * $.gen.deleteLayer({job:'Job',layer:'tmp',step:'step'});
+     * $.gen.deleteLayer({job:'Job',layer:['tmp','tmp2']});
+     * $.gen.deleteLayer({job:'Job',layer:['~^tmp']});
+     */
+    deleteLayer(p:{job:string,layer:string}):void;  
+
+    /**
+     * 获取层图形范围 
+     * @returns {xmin:?, ymin:?,xmax:?,ymax:?,xsize:?,ysize:?}
+     * @example 
+     * var getLayerLimits = $.gen.getLayerLimits({job:'demo',step:'pcb',layer:'drawing',units:'mm'});
+     */
+    getLayerLimits(p:{job:string,step:string,layer:string,units?:'inch'|'mm'}):object;    
+
+    /**
+     * 获取Symbol范围 
+     * @returns {xmin:?, ymin:?,xmax:?,ymax:?,xsize:?,ysize:?}
+     * @example 
+     * var getSymbolLimits = $.gen.getSymbolLimits({job:'demo',symbol:'symbol1',units:'mm'});
+     */
+    getSymbolLimits(p:{job:string,symbol:string,units?:'inch'|'mm'}):object;    
+
+    /**
+     * 获取profile范围 
+     * @returns {xmin:?, ymin:?,xmax:?,ymax:?,xsize:?,ysize:?}
+     * @example 
+     * var getProfileLimits = $.gen.getProfileLimits({job:'demo',step:'pcb',units:'mm'});
+     */
+    getProfileLimits(p:{job:string,step:string,units?:'inch'|'mm'}):object;    
+
+    /**
+     * 设置影响层
+     * @returns æ— 
+     * @example 
+     * $.gen.affectedLayer({affected:'no',mode:'all'});
+     * $.gen.affectedLayer({affected:'yes',mode:'single',layer:['l1','l2','l3','l4'],clear_before:'yes'});
+     */
+    affectedLayer(p:{affected:'no'|'yes',mode:'all'|'single',layer:string,clear_before?:'yes'|'no'}):void;    
+
+    /**
+     * 获取选择的Feature总数 
+     * @returns 返回选择上的Feature总数
+     * @example 
+     * var getSelectCount = $.gen.getSelectCount();
+     */
+    getSelectCount():number; 
+
+    /**
+     * 将选择的Feature复制到另一层
+     * @returns æ— 
+     * @example 
+     * $.gen.selCopyOther({dest:'layer_name',target_layer:'temp',invert:'no',dx:0,dy:0,size:0});
+     */
+    selCopyOther(p:{dest:'affected_layers'|'layer_name',target_layer:string,invert:string,dx:number,dy:number,size:number}):void;    
+
+
+    /**
+     * 将选择的Feature移到另一层
+     * @returns æ— 
+     * @example 
+     * $.gen.selMoveOther({target_layer:'temp',invert:'no',dx:0,dy:0,size:0});
+     */
+    selMoveOther(p:{target_layer:string,invert:string,dx:number,dy:number,size:number}):void;
+    
+    /**
+     * 清除层显示
+     * @returns æ— 
+     * @example 
+     * $.gen.clearLayers();
+     */
+    clearLayers():void;
+    
+    /**
+     * 设置当前工作层
+     * @returns æ— 
+     * @example 
+     * $.gen.workLayer({name:'l1',display_number:2,clear_before:'yes'});
+     */
+    workLayer(p:{name:string,display_number:number,clear_before:'yes'|'no'}):void;
+
+    /**
+     * 放大缩小显示
+     * @returns æ— 
+     * @example 
+     * $.gen.zoomArea({x1:1,x2:1,y1:2,y2:3});
+     */
+    zoomArea(p:{x1:number,x2:number,y1:number,y2:number}):void;
+
+    /**
+     * 设置当前单位
+     * @returns æ— 
+     * @example 
+     * $.gen.units({type:'mm'});
+     */
+    units(p:{type:'inch'|'mm'}):void;
+
+    /**
+     * 通过选择过滤器进行选择Feature
+     * @returns æ— 
+     * @example 
+     * $.gen.selectByFilter({feat_types:'pad\;text',polarity:'positive',include_syms:'r100;r200',exclude_syms:'s200,s100',attribute:[{attribute:'.drill',option:'plated'}],profile:'all'});
+     */
+    selectByFilter(p:{feat_types:'text'|'pad\;text',polarity:'positive'|'positive\;negative',include_syms:string,exclude_syms:string,attribute: '.smd'|[{attribute:'.drill',option:'plated'}],profile:'all'|'in'|'out',area_rect?:{x1:?,y1:?,x2:?,y2:?},filter_name?:string,operation?:string,area_type?:string}):void;
+
+    /**
+     * 通过选择过滤器进行高亮Feature
+     * @returns æ— 
+     * @example 
+     * $.gen.highlightByFilter({feat_types:'pad\;text',polarity:'positive',include_syms:'r100;r200',exclude_syms:'s200,s100',attribute:[{attribute:'.drill',option:'plated'}],profile:'all'});
+     */
+    highlightByFilter(p:{feat_types:'text'|'pad\;text',polarity:'positive'|'positive\;negative',include_syms:string,exclude_syms:string,attribute: '.smd'|[{attribute:'.drill',option:'plated'}],profile:'all'|'in'|'out',filter_name?:string}):void;
+
+    /**
+     * 参考选择
+     * @returns æ— 
+     * @example 
+     * $.gen.selRefFeat({layers:'l2',use:'filter',mode:'touch',f_types:'line\;arc',polarity:'positive',filter:{feat_types:'pad\;text'polarity:'positive',include_syms:'r100;r200',exclude_syms:'s200,s100',attribute:[{attribute:'.drill',option:'plated'}],}});
+     */
+    selRefFeat(p:{layers:string,use:'filter'|'select',mode:'touch'|'disjoint'|'cover'|'include',f_types:'pad'|'line\;arc',polarity:'positive'|'positive;\negative',filter:object}):void;
+
+    /**
+     * 设置选择过滤器
+     * @returns æ— 
+     * @example 
+     * $.gen.filterSet({feat_types:'pad\;text',polarity:'positive',include_syms:'r100;r200',exclude_syms:'s200,s100',attribute:[{attribute:'.drill',option:'plated'}],profile:'all'});
+     */
+    filterSet(p:{feat_types:'text'|'pad\;text',polarity:'positive'|'positive\;negative',dcode:?,include_syms:string,exclude_syms:string,attribute: '.smd'|[{attribute:'.drill',option:'plated'}],profile:'all'|'in'|'out',filter_name?:string}):void;
+
+    /**
+     * check in ,check out 料号
+     * @returns 如果mode:'test',返回checkout的用户
+     * @example 
+     * var checkInout = $.gen.checkInout({job:'demo',mode:'test'});
+     */
+    checkInout(p:{job:string,mode:'in'|'out'|'test',type?:'job'}):string;    
+
+    /**
+     * 保存料号
+     * @returns æ— 
+     * @example 
+     * $.gen.saveJob({job:'demo'});
+     */
+    saveJob(p:{job:string,override?:'no'|'yes'}):void;    
+
+    /**
+     * 复制料号
+     * @returns æ— 
+     * @example 
+     * $.gen.copyJob({source_job:'demo',dest_job:'demo1',dest_database:'genesis'});
+     */
+    copyJob(p:{source_job:string,dest_job:string,dest_database:string}):void;   
+
+    /**
+     * 复制层
+     * @returns æ— 
+     * @example 
+     * $.gen.copyLayer({source_job:'org_job',source_step:'org',source_layer:'l1',dest_layer:'org_l1'});
+     */
+    copyLayer(p:{source_job:string,source_step:string,source_layer:string,dest_layer:string,mode?:'replace'|'append',invert?:'no'|'yes'}):void;   
+
+    /**
+     * 获取料号的checklist
+     * @returns 返回checklist名称列表;['check1','check2']
+     * @example 
+     * var getChecklist = $.gen.getChecklist({job:'demo1',step:'pcb'});
+     */
+    getChecklist(p:{job:string,step:string}):t[];    
+
+    /**
+     * 从Lib中复制checklist
+     * @returns æ— 
+     * @example 
+     * $.gen.chklistFromLib({chklist:'pcb_check'});
+     */
+    chklistFromLib(p:{chklist:string}):void;   
+
+    /**
+     * 创建checklist
+     * @returns object
+     * @example 
+     * var createChklist = $.gen.createChklist({chklist:'drill_check_tmp',items:[drill_check : {name:'drill_check',nact:1,action:'valor_analysis_drill',erf:'SRC',params:{pp_layer:?}},]});
+     */
+    createChklist(p:{chklist:string,items:Array[]}):object;    
+
+    /**
+     * 检查checklist是否存在
+     * @returns 存在返回1,不存在返回0
+     * @example 
+     * var isChklistExists = $.gen.isChklistExists({job:'demo1',step:'pcb',chklist:'pcb_check'});
+     */
+    isChklistExists(p:{job:string,step:string,chklist:string}):boolean;    
+
+    /**
+     * 显示checklist
+     * @returns 存在返回1,不存在返回0
+     * @example 
+     * var chklistShow = $.gen.chklistShow({chklist:'pcb_check'});
+     */
+    chklistShow(p:{chklist:string}):boolean;  
+
+    /**
+     * 运行checklist
+     * @returns 存在返回1,不存在返回0
+     * @example 
+     * var chklistRun = $.gen.chklistRun({chklist:'pcb_check'});
+     */
+    chklistRun(p:{chklist:string,nact?:'a'|'1...n',area?:'profile'|'local'|'global'}):boolean;  
+
+    /**
+     * 获取checklist运行结果
+     * @returns 返回结果列表,如(  )
+     * @example 
+     * var getCheckMeas = $.gen.getCheckMeas({job:'demo',step:'pcb',chklist:'pcb_check',nact:2});
+     */
+    getCheckMeas(p:{job:string,step:string,chklist:string,nact:number,units?:'inch'|'mm',category?:?,severity?:?,layer?:?}):object;  
+
+    /**
+     * 运行单个dfm功能
+     * @returns æ— 
+     * @example 
+     * $.gen.runSingleDfm({chklist:'valor_dfm_nfpr',params:{pp_layer : map_layer,pp_delete : 'Duplicate',},area : 'global',show : 'no',show_res:'no'});
+     */
+    runSingleDfm(p:{chklist:string,show?:'no'|'yes',area?:'profile'|'global'|'local',erf?:'Mil',params?:object,show_res?:'no'|'yes'}):void;   
+
+    /**
+     * 计算铜面积
+     * @returns 返回hash{area:?,percent:?}
+     * @example 
+     * var copperArea = $.gen.copperArea({layer1:layer});
+     */
+    copperArea(p:{layer1:string,layer2?:'',drills?:'no',drills_source?:'matrix',thickness?:0,resolution_value?:1,x_boxes?:3,y_boxes?:3,area?:'no',x1?:0,x2?:0,y1?:0,y2?:0,dist_map?:'yes',f_type?:'all',out_file?:'',out_layer?:'first'}):object;  
+
+    /**
+     * 计算曝光面积
+     * @returns 返回hash{area:?,percent:?}
+     * @example 
+     * var exposedArea = $.gen.exposedArea({layer1:layer,mask1:mask});
+     */
+    exposedArea(p:{layer1:string,mask1:string,consider_route:'yes'|'no',layer2?:'',mask1?:'',drills?:'no',drills_source?:'matrix',thickness?:0,resolution_value?:1,x_boxes?:3,y_boxes?:3,area?:'no',dist_map?:'yes',f_type?:'all'}):object;  
+
+
+    /**
+     * 把选择到的元素转成surface
+     * @returns æ— 
+     * @example 
+     * $.gen.selContourize();
+     */
+    selContourize(p:{accuracy?:0,break_to_islands?:'yes',clean_hole_size?:0,clean_hole_mode?:'x_and_y'}):void;   
+
+    /**
+     * 窗口显示回到原始位置
+     * @returns æ— 
+     * @example 
+     * $.gen.zoomHome();
+     */
+    zoomHome():void;   
+
+    /**
+     * 设置step尺寸
+     * @returns æ— 
+     * @example 
+     * $.gen.panelSize({width:18,height:24});
+     */
+    panelSize(p:{width:number,height:number}):void;   
+
+    /**
+     * 拼版填铜
+     * @returns æ— 
+     * @example 
+     * $.gen.srFill({layer:layer});
+     */
+    srFill(p:{layer:string,dest:'layer_name'|'affected_layers',polarity?:'positive'|'negative',type?:'solid'|'pattern',origin_type?:'datum'|'limits'}):void;   
+
+    /**
+     * 加一个pad到指定位置
+     * @returns æ— 
+     * @example 
+     * $.gen.addPad({x:0,y:0,symbol:'r100'});
+     */
+    addPad(p:{x:number,y:number,symbol:string,polarity?:?,angle?:?,mirror?:?,nx?:?,ny?:?,dx?:?,dy?:?,xscale?:?,yscale?:?,attributes?:?}):void;   
+
+    /**
+     * 加一根线到指定位置
+     * @returns æ— 
+     * @example 
+     * $.gen.addLine({xs:0,ys:0,xe:1,ye:1,symbol:'r100'});
+     */
+    addLine(p:{xs:number,ys:number,xe:number,ye:number,symbo:string,polarity?:?,attributes?:?}):void;   
+
+    /**
+     * 加弧到指定位置
+     * @returns æ— 
+     * @example 
+     * $.gen.addArc({xc:0.7,yc:0.7,xs:0,ys:0,xe:1,ye:1,symbo:'r100'});
+     */
+    addArc(p:{xc:number,yc:number,xs:number,ys:number,xe:number,ye:number,symbo:string,polarity?:?,attributes?:?}):void;   
+
+    /**
+     * 元素坐标转换(不调用genesis命令)(mirror,shift,rotation)
+     * @returns 返回{x:?,y:?}
+     * @example 
+     * var transCoordinate = $.gen.transCoordinate({x:0,y:0,cx:1,cy:1,mirror:'yes'});
+     */
+    transCoordinate(p:{x:number,y:number,cx:number,cy:number,angle:0|90|180|270,mirror?:'no'|'yes',shiftx?:0,shifty?:0}):object;  
+
+    /**
+     * 加text到指定位置
+     * @returns æ— 
+     * @example 
+     * $.gen.addText({xc:0.7,yc:0.7,xs:0,ys:0,xe:1,ye:1,symbo:'r100'});
+     */
+    addText(p:{x:number,y:number,text:string,x_size:number,y_size:number,anchor:'center'|'s'|'w'|'n'|'e'|'se'|'ne'|'sw'|'nw',w_factor?:?,line_width?:'unit: mil'}):void;   
+
+    /**
+     * 添加一个长方形的块
+     * @returns æ— 
+     * @example 
+     * $.gen.addRectangle({x1:0,y1:0,x2:1,y2:1});
+     */
+    addRectangle(p:{x1:number,y1:number,x2:number,y2:number,type?:'surface'|'line',symbol?:'line',polarity?:'positive'|'negative',attributes?:'no'|'yes'}):void;   
+
+    /**
+     * 添加Surface
+     * @returns æ— 
+     * @example 
+     * $.gen.addPolygon({items:[{x:,y:},{xc:,yc:,xe:,ye:,cw:'yes'|'no'}],polarity:'positive',attributes:[]});
+     */
+    addPolygon(p:{items:[{x:number,y:number},{xc:number,yc:number,xe:number,ye:number,cw:'yes'|'no'}],type?:'surface'|'line',symbol?:'line',polarity?:'positive'|'negative',attributes?:'no'|'yes'}):void;   
+
+    /**
+     * 对选择的物件进行填充
+     * @returns æ— 
+     * @example 
+     * $.gen.selFill();
+     */
+    selFill():void;  
+
+    /**
+     * 做反选动作
+     * @returns æ— 
+     * @example 
+     * $.gen.selReverse();
+     */
+    selReverse():void;  
+
+    /**
+     * 删除选中的物件,如果一个都没有选择将删除所有的
+     * @returns æ— 
+     * @example 
+     * $.gen.selDelete();
+     */
+    selDelete():void;  
+
+    /**
+     * panel拼版
+     * @returns æ— 
+     * @example 
+     * $.gen.panelSR({line:1,step:'pcb',x:1,y:1,nx:2,ny:2,dx:3.6,dy:1.8});
+     */
+    panelSR(p:{line:number,step:string,x:number,y:number,nx:number,ny:number,dx:number,dy:number,angle:?,mirror:?}):void;  
+
+    /**
+     * flatten all information to defined layer如果传了job和step参数,如果没有拼版,则自动调用copy_layer功能
+     * @returns æ— 
+     * @example 
+     * $.gen.flattenLayer({source_layer:'comp',target_layer:'test'});
+     * $.gen.flattenLayer({job:'test',step:'pcb',source_layer:'comp',target_layer:'test'});
+     */
+    flattenLayer(p:{source_layer:'comp',target_layer:'test',job?:string,step?:string}):void;  
+
+    /**
+     * 取得指定symbol上的所有元素信息
+     * @returns [{type:'line',xs:0,ys:0,xe:0,ye:0,symbol:'r5',polarity:'positive'},
+     *            {type:'pad',x:0,y:0,symbol:'r5',polarity:'positive',mirror:'yes',angle:0}]
+     * @example 
+     * var getSymbolFeatures = $.gen.getSymbolFeatures({job:job,symbol:symbol});
+     */
+    getSymbolFeatures(p:{job:string,symbol:string,units:'inch'|'mm'}):t[];  
+
+    /**
+     * 取得指定层上的元素信息
+     * @returns [{type:'line',xs:0,ys:0,xe:0,ye:0,symbol:'r5',polarity:'positive'},
+     *            {type:'pad',x:0,y:0,symbol:'r5',polarity:'positive',mirror:'yes',angle:0}]
+     * @example 
+     * var getFeatures = $.gen.getFeatures({job:job,step:step,layer:layer});
+     */
+    getFeatures(p:{job:string,step:string,layer:string,options:''|'select'|'break_sr',units:'inch'|'mm',surface:0|1}):t[];  
+
+    /**
+     * 拷贝step到指定的job
+     * @returns æ— 
+     * @example 
+     * $.gen.copyStep({source_job:job,source_name:step,dest_job:job1,dest_name:name1});
+     */
+    copyStep(p:{source_job:string,source_name:string,dest_job:string,dest_name:string}):void;   
+
+    /**
+     * 更改选择到的symbol
+     * @returns æ— 
+     * @example 
+     * $.gen.selChangeSym({symbol:'r22.5'});
+     */
+    selChangeSym(p:{symbol:string,reset_angle?:'no'|'yes'}):void;   
+
+    /**
+     * 选择属于同一网络的元素(board)
+     * @returns æ— 
+     * @example 
+     * $.gen.selBoardNetFeat({x:1,y:1});
+     */
+    selBoardNetFeat(p:{x:number,y:number,operation?:'select'|'unselect',tol?:'8.947inch'}):void;  
+
+    /**
+     * 显示层
+     * @returns æ— 
+     * @example 
+     * $.gen.displayLayer({name:'l2',number:2});
+     */
+    displayLayer(p:{name:'l2',number?:1,display?:'yes'|'no'}):void;  
+
+    /**
+     * 获取NcSet列表
+     * @returns 返回NcSet名称列表
+     * @example 
+     * var getNcsetsList = $.gen.getNcsetsList({job:'demo',step:'panel',layer:'drill'});
+     */
+    getNcsetsList(p:{job:string,step:string,layer:string}):t[];  
+
+    /**
+     * 获取NcReg参数
+     * @returns 返回NcReg参数
+     * @example 
+     * var getNcsetReg = $.gen.getNcsetReg({job:'demo',step:'panel',layer:'drill',name:'set1'});
+     */
+    getNcsetReg(p:{job:string,step:string,layer:string,name:string}):object;  
+
+    /**
+     * 将选择的对像创建为一个step
+     * @returns æ— 
+     * @example 
+     * $.gen.selCreateStep({step:'pcb1',delete:'yes'});
+     */
+    selCreateStep(p:{step:string,x_datum?:0,y_datum?:0,delete?:'no'|'yes'}):void;  
+
+    /**
+     * 将选择对象以Step and Repeat方式移动
+     * @returns æ— 
+     * @example 
+     * $.gen.selMoveRepeat({dest_step:'panel',delete_orig:'yes'});
+     */
+    selMoveRepeat(p:{dest_step:string,x_repeats?:0,y_repeats?:0,delete_orig?:'yes'|'no'}):void;  
+
+    /**
+     * 创建一个新symbol
+     * @returns æ— 
+     * @example 
+     * $.gen.createSymbol({job:'demo',name:'symbol1'});
+     */
+    createSymbol(p:{job:string,name:string}):void;  
+
+    /**
+     * 检查symbol是否存在
+     * @returns 存在返回1,不存在返回0
+     * @example 
+     * var isSymbolExists = $.gen.isSymbolExists({job:'demo',symbol:'symbol1'});
+     */
+    isSymbolExists(p:{job:string,symbol:string}):boolean;  
+
+    /**
+     * 打开symbol编辑窗口
+     * @returns æ— 
+     * @example 
+     * $.gen.openSymbol({job:'demo',name:'symbol1'});
+     */
+    openSymbol(p:{job:string,name:string,iconic?:'no'|'yes'}):void;   
+
+    /**
+     * 关闭symbol编辑窗口
+     * @returns æ— 
+     * @example 
+     * $.gen.closeSymbol({);
+     */
+    closeSymbol():void;   
+
+    /**
+     * 获取checklist属性
+     * @returns 返回属性值;如果attr为一个字符串,则返回一个单值;如果attr为数组,则返回以属性名为key的hash
+     * @example 
+     * var getCheckAttr = $.gen.getCheckAttr({job:'demo',step:'pcb',checklist:'chklist1',attr:'min_via',nact:1,units:'mm'});
+     * //--> getCheckAttr = 0.12
+     * var getCheckAttr = $.gen.getCheckAttr({job:'demo',step:'pcb',checklist:'chklist1',attr:['min_via','min_spacing'],nact:1,units:'mm'});
+     * //--> getCheckAttr = {min_via:0.12,min_spacing:0.3}
+     */
+    getCheckAttr(p:{job:string,step:string,checklist:string,attr:string|Array[],nact:number,units?:'inch'|'mm'}):number|object;  
+
+    /**
+     * 获取profile的描述字符
+     * @returns 返回profile描述字符
+     * @example 
+     * var getProfile = $.gen.getProfile({job:'demo',step:'pcb',units:'mm'});
+     */
+    getProfile(p:{job:string,step:string,units?:'inch'|'mm'}):string;  
+
+    /**
+     * 清除高亮显示
+     * @returns æ— 
+     * @example 
+     * $.gen.clearHighlight();
+     */
+    clearHighlight():void;   
+
+    /**
+     * 选择打散
+     * @returns æ— 
+     * @example 
+     * $.gen.selBreak();
+     */
+    selBreak():void;   
+
+    /**
+     * 获取当前使用的单位    
+     * @returns 返回'inch'或'mm'
+     * @example 
+     * var getUnits = $.gen.getUnits();
+     */
+    getUnits():string;  
+
+    /**
+     * 获取层symbol列表
+     * @returns 返回层symbol列表
+     * @example 
+     * var getLayerSymsHist = $.gen.getLayerSymsHist({job:'demo',step:'panel',layer:'l2',options:'break_sr',units:'mm'});
+     */
+    getLayerSymsHist(p:{job:string,step:string,layer:string,options?:'undef'|'break_sr',units?:'inch'|'mm'}):object;  
+
+    /**
+     * 获取Symbol symbol列表
+     * @returns 返回层Symbol symbol列表
+     * @example 
+     * var getSymbolSymsHist = $.gen.getSymbolSymsHist({job:'demo',symbol:'struct1',units:'mm'});
+     */
+    getSymbolSymsHist(p:{job:string,symbol:string,units?:'inch'|'mm'}):object;  
+
+    /**
+     * 打开netlist窗口
+     * @returns æ— 
+     * @example 
+     * $.gen.netlistPageOpen();
+     */
+    netlistPageOpen(p:{set?:'no'|'yes'}):void;   
+
+
+    /**
+     * 重新计算netlist数据
+     * @returns æ— 
+     * @example 
+     * $.gen.netlistRecalc({job:'demo',step:'pcb',type:'cur_cad',display:'top'});
+     */
+    netlistRecalc(p:{job:string,step:string,type:'cad'|'ref'|'cur'|'cur_cad',display:'top'|'bottom'}):void;   
+
+    /**
+     * 比较netlist
+     * @returns 返回{full_report:'',shorted:1,broken:9,extra:3, missing:0,[possible_shorted:0],[possible_broken:0]}
+     * @example 
+     * var netlistCompare = $.gen.netlistCompare({job1:'demo',step1:'net',type1:'ref',job2:'demo',step2:'pcb',type2:'cur'});
+     */
+    netlistCompare(p:{job1:string,step1:string,type1:'cad'|'ref'|'cur'|'cur_cad',job2:string,step2:string,type2:'cad'|'ref'|'cur'|'cur_cad',display?:'yes'|'no'}):object; 
+
+    /**
+     * 关闭netlist窗口
+     * @returns æ— 
+     * @example 
+     * $.gen.netlistPageClose();
+     */
+    netlistPageClose():void;   
+
+    /**
+     * 清除选择的数据
+     * @returns æ— 
+     * @example 
+     * $.gen.selClearFeature();
+     */
+    selClearFeature():void;   
+
+    /**
+     * 获取Step and Repeat范围
+     * @returns 返回{xmin:,ymin:,xmax:,ymax:,xsize:,ysize:}
+     * @example 
+     * var getSRLimits = $.gen.getSRLimits({job:'demo',step:'panel'});
+     * var getSRLimits = $.gen.getSRLimits({job:'demo',step:'panel',include_step:'^(pcb|array)'});
+     */
+    getSRLimits(p:{job:string,step:string,include_step?:string,units?:'inch'|'mm'}):object; 
+
+    /**
+     * 获取Active范围
+     * @returns 返回{xmin:,ymin:,xmax:,ymax:,xsize:,ysize:}
+     * @example 
+     * var getActiveArea = $.gen.getActiveArea({job:'demo',step:'panel'});
+     */
+    getActiveArea(p:{job:string,step:string,units?:'inch'|'mm'}):object; 
+
+    /**
+     * 设定checklist参数
+     * @returns æ— 
+     * @example 
+     * $.gen.chklistCupd({chklist:'chk1',nact:2,params:{pp_layer:'l1;l2'}});
+     */
+    chklistCupd(p:{chklist:string,nact?:number,params:object,mode?:'regular'}):void;   
+
+    /**
+     * 获取checklist ERF 范围
+     * @returns 返回{
+                        p2p : [1,5,7],
+                        p2l : [2,5,6],
+                    }
+     * @example 
+     * var getChklistRange = $.gen.getChklistRange({job:'demo',step:'pcb',chklist:'pcb_check',nact:2});
+     */
+    getChklistRange(p:{job:string,step:string,chklist:string,nact:number,units?:'inch'|'mm'}):object; 
+
+    /**
+     * 设置checklist ERF 范围
+     * @returns æ— 
+     * @example 
+     * $.gen.chklistErfRange({job:'demo',step:'pcb',chklist:'pcb_check',nact:2,range:{p2p:[1,2,5],p2l:[4,5,6]},default_range:[0,0,0]});
+     */
+    chklistErfRange(p:{job:string,step:string,chklist:string,nact:number,range:object,default_range:[]}):void;   
+
+    /**
+     * 设置checklist ERF
+     * @returns æ— 
+     * @example 
+     * $.gen.chklistErf({chklist:'pcb_check',nact:2,erf:'STD mm'});
+     */
+    chklistErf(p:{chklist:string,nact:number,erf:string}):void; 
+
+    /**
+     * 重读checklist ERF
+     * @returns æ— 
+     * @example 
+     * $.gen.chklistRereadErf({chklist:'pcb_check',nact:2});
+     */
+    chklistRereadErf(p:{chklist:string,nact:number}):void; 
+
+    /**
+     * 选择checklist条目
+     * @returns æ— 
+     * @example 
+     * $.gen.chklistSelectAct({job:Job,step:Step,chklist:'pcb_check',nact:2,select:'yes',clear_before:'yes'});
+     */
+    chklistSelectAct(p:{job:string,step:string,chklist:string,nact:number,select:'yes'|'no',clear_before:'yes'|'no',nact_count:number}):void; 
+  
+    /**
+     * 选择所有checklist条目
+     * @returns æ— 
+     * @example 
+     * $.gen.chklistSelectAll({job:Job,step:Step,chklist:'pcb_check',select:'yes'});
+     */
+    chklistSelectAll(p:{job:string,step:string,chklist:string,select:'yes'|'no',nact_count:number}):void; 
+
+    /**
+     * 获取checklist条目总数
+     * @returns checklist条目总数
+     * @example 
+     * var getChklistActCount = $.gen.getChklistActCount({job:Job,step:Step,chklist:'pcb_check'});
+     */
+    getChklistActCount(p:{job:string,step:string,chklist:string}):number; 
+
+    /**
+     * chklist生成层
+     * @returns æ— 
+     * @example 
+     * $.gen.chklistCreateLyrs({chklist:'pcb_check',severity:0,suffix:'_tmp'});
+     */
+    chklistCreateLyrs(p:{chklist:string,severity:0|1|2|3,suffix:string}):void; 
+
+    /**
+     * 获取step范围
+     * @returns 返回{xmin:,ymin:,xmax:,ymax:,xsize:,ysize:}
+     * @example 
+     * var getStepLimits = $.gen.getStepLimits({job:'demo',step:'panel'});
+     */
+    getStepLimits(p:{job:string,step:string,units?:'inch'|'mm'}):object; 
+
+    /**
+     * 移动选择数据
+     * @returns æ— 
+     * @example 
+     * $.gen.selMove({dx:2,dy:2});
+     */
+    selMove(p:{dx:number,dy:number}):void;   
+
+    /**
+     * 替换
+     * @returns æ— 
+     * @example 
+     * $.gen.selSubstitute({mode:'substitute',symbol:'r100',tol:2.5});
+     */
+    selSubstitute(p:{mode?:'select'|'substitute',symbol:string,tol:number,x_datum:number,y_datum:number,dcode:number}):void;   
+
+    /**
+     * 变形
+     * @returns æ— 
+     * @example 
+     * $.gen.selTransform({});
+     */
+    selTransform(p:{mode?:'anchor'|'axis',oper:string,x_anchor:0,y_anchor:0,duplicate?:'no'|'yes',angle?:0,x_scale?:1,y_scale?:1,x_offset?:0,y_offset?:0}):void;   
+
+    /**
+     * 获取排版数据
+     * @returns 返回[{step:,xa:,ya:,dx:,dy:,nx:,ny:,angle:,mirror:,xmin:,ymin:,xmax:,ymax:,xsize:,ysize:}]
+     * @example 
+     * var getSR1 = $.gen.getSR1({job:'demo',step:'panel'});
+     */
+    getSR1(p:{job:string,step:string,units?:'inch'|'mm'}):t[]; 
+
+    /**
+     * 获取打散后的排版数据
+     * @returns 返回[{step:,xa:,ya:,angle:,mirror:,xmin:,ymin:,xmax:,ymax:,xsize:,ysize:}]
+     * @example 
+     * var getRepeat = $.gen.getRepeat({job:'demo',step:'panel'});
+     */
+    getRepeat(p:{job:string,step:string,units?:'inch'|'mm'}):t[]; 
+
+    /**
+     * 获取某个step内所有用到的step名称列表
+     * @returns 返回['step1','step2',...]
+     * @example 
+     * var getSubSteps = $.gen.getSubSteps({job:'demo',step:'panel'});
+     */
+    getSubSteps(p:{job:string,step:string}):t[]; 
+
+    /**
+     * 获取Datum点
+     * @returns 返回{x:?,y:?}
+     * @example 
+     * var getDatum = $.gen.getDatum({job:'demo',step:'panel'});
+     */
+    getDatum(p:{job:string,step:string,units?:'inch'|'mm'}):object; 
+
+    /**
+     * 获取Step属性
+     * @returns 返回属性值;如果attr为一个字符串,则返回一个单值;如果attr为数组,则返回以属性名为key的hash,如果attr没有定义,则返回所有属性
+     * @example 
+     * var getStepAttr = $.gen.getStepAttr({job:'demo',step:'pcb',attr:'attr1'});
+     * //--> getStepAttr = 0.12
+     * var getStepAttr = $.gen.getStepAttr({job:'demo',step:'pcb',attr:['attr1','attr2']});
+     * //--> getStepAttr = {attr1:0.12,attr2:0.3}
+     */
+    getStepAttr(p:{job:string,step:string,attr:'name'|['name1','name2']|'undef '}):number|object;  
+
+    /**
+     * 获取料号属性
+     * @returns 返回属性值;如果attr为一个字符串,则返回一个单值;如果attr为数组,则返回以属性名为key的hash,如果attr没有定义,则返回所有属性
+     * @example 
+     * var getJobAttr = $.gen.getJobAttr({job:'demo',attr:'attr1'});
+     * //--> getJobAttr = 0.12
+     * var getJobAttr = $.gen.getJobAttr({job:'demo',attr:['attr1','attr2']});
+     * //--> getJobAttr = {attr1:0.12,attr2:0.3}
+     */
+    getJobAttr(p:{job:string,attr:'name'|['name1','name2']|'undef '}):number|object;  
+
+    /**
+     * 设置料号属性
+     * @returns æ— 
+     * @example 
+     * $.gen.setJobAttr({job:'demo',attr:{name:2}});
+     */
+    setJobAttr(p:{job:string,attr:{},units?:'inch'|'mm'}):void;   
+
+    /**
+     * 获取绘底光绘参数
+     * @returns 返回{polarity:?,
+                    stretch_x:?,
+                    stretch_y:?,
+                    shift_x:?,
+                    shift_y:?,
+                    mirror_x:?,
+                    mirror_y:?,
+                    resolution:?,
+                    swap:?}
+     * @example 
+     * var getLPD = $.gen.getLPD({job:'demo',step:'panel',layer:'l2'});
+     */
+    getLPD(p:{job:string,step:string,layer:string}):object;  
+
+    /**
+     * 获取绘底片光绘所有参数
+     * @returns 返回{ lp7008 :{polarity:?,
+                                stretch_x:?,
+                                stretch_y:?,
+                                shift_x:?,
+                                shift_y:?,
+                                mirror_x:?,
+                                mirror_y:?,
+                                resolution:?,
+                                swap:?},
+        }
+     * @example 
+     * var getLPM = $.gen.getLPM({job:'demo',step:'panel',layer:'l2'});
+     */
+    getLPM(p:{job:string,step:string,layer:string,device?:string}):object;  
+
+    /**
+     * 设置当前属性
+     * @returns æ— 
+     * @example 
+     * $.gen.setCurrentAttribute({attribute:'.smd'});
+     * $.gen.setCurrentAttribute({attribute:['.smd','.bga']);
+     * $.gen.setCurrentAttribute({attribute:'.drill',option:'plated'});
+     * $.gen.setCurrentAttribute({attribute:['.smd',{attribute:'.drill',option:'plated'});
+     */
+    setCurrentAttribute(p:{attribute:[]|{}|''}):void;   
+
+    /**
+     * 重置当前属性
+     * @returns æ— 
+     * @example 
+     * $.gen.attributeReset();
+     */
+    attributeReset():void;   
+
+    /**
+     * 为选择的数据添加属性
+     * @returns æ— 
+     * @example 
+     * $.gen.selAddAttr({attribute:'.smd'});
+     * $.gen.selAddAttr({attribute:['.smd','.bga']);
+     * $.gen.selAddAttr({attribute:'.drill',option:'plated'});
+     * $.gen.selAddAttr({attribute:['.smd',{attribute:'.drill',option:'plated'});
+     */
+    selAddAttr(p:{attribute:[]|{}|''}):void;   
+
+    /**
+     * 设置Datum点
+     * @returns æ— 
+     * @example 
+     * $.gen.setDatum({x:0,y:0});
+     */
+    setDatum(p:{x:number,y:number}):void;  
+
+    /**
+     * 以layer net方式选择
+     * @returns æ— 
+     * @example 
+     * $.gen.selNetFeat({x:1,y:1});
+     */
+    selNetFeat(p:{x:number,y:number,operation?:'select'|'unselect',tol:'float'}):void;  
+
+    /**
+     * 获取原点座标
+     * @returns 返回 {x:?,y:?}
+     * @example 
+     * var getOrigin = $.gen.getOrigin();
+     */
+    getOrigin():object;  
+
+    /**
+     * 设置原点
+     * @returns æ— 
+     * @example 
+     * $.gen.origin({x:0,y:0});
+     */
+    origin(p:{x:number,y:number,push_in_stack?:0|1}):void;  
+
+    /**
+     * 显示check显示结果
+     * @returns æ— 
+     * @example 
+     * $.gen.chklistResShow({chklist:'chk1',nact:2});
+     */
+    chklistResShow(p:{chklist:string,nact?:number,x:0,y:0,w:0,h:0}):void;  
+
+    /**
+     * 关闭check list
+     * @returns æ— 
+     * @example 
+     * $.gen.chklistClose({chklist:'chk1'});
+     */
+    chklistClose(p:{chklist:string,mode?:'hide'}):void;  
+
+    /**
+     * 获取genesis database 列表
+     * @returns 返回 {'db1':'/gen_db/db2','db2':'/gen_db/db1',..}
+     * @example 
+     * var getDbList = $.gen.getDbList();
+     */
+    getDbList():object;  
+
+    /**
+     * 获取层属性
+     * @returns 返回属性值;如果attr为一个字符串,则返回一个单值;如果attr为数组,则返回以属性名为key的hash,如果attr没有定义,则返回所有属性
+     * @example 
+     * var getLayerAttr = $.gen.getLayerAttr({job:'demo',step:'pcb',layer:'l2',attr:'attr1'});
+     * //--> getLayerAttr = 0.12
+     * var getLayerAttr = $.gen.getLayerAttr({job:'demo',step:'pcb',layer:'l2',attr:['attr1','attr2']});
+     * //--> getLayerAttr = {attr1:0.12,attr2:0.3}
+     */
+    getLayerAttr(p:{job:string,step:string,layer:string,attr:'name'|['name1','name2']|'undef '}):number|object;  
+
+    /**
+     * 料号是否修改
+     * @returns 更改返回1,没有更改返回0
+     * @example 
+     * var isJobChanged = $.gen.isJobChanged({job:'demo'});
+     */
+    isJobChanged(p:{job:string}):boolean;  
+
+    /**
+     * Step是否修改
+     * @returns 更改返回1,没有更改返回0
+     * @example 
+     * var isStepChanged = $.gen.isStepChanged({job:'demo',step:'pcb'});
+     */
+    isStepChanged(p:{job:string,step:string}):boolean;  
+
+    /**
+     * 层是否修改
+     * @returns 更改返回1,没有更改返回0
+     * @example 
+     * var isLayerChanged = $.gen.isLayerChanged({job:'demo',step:'pcb',layer:'map'});
+     */
+    isLayerChanged(p:{job:string,step:string,layer:string}):boolean;  
+
+    /**
+     * 矩形选择
+     * @returns æ— 
+     * @example 
+     * $.gen.selectRectangle({x1:1,y1:1,x2:2,y2:3});
+     */
+    selectRectangle(p:{x1:number,y1:number,x2:number,y2:number}):void;  
+
+    /**
+     * 更改层名
+     * @returns æ— 
+     * @example 
+     * $.gen.renameLayer({job:'demo',layer:'top.art',new_name:'l1'});
+     */
+    renameLayer(p:{job:string,layer:string,new_name:string}):void;  
+
+    /**
+     * 更改step名
+     * @returns æ— 
+     * @example 
+     * $.gen.renameStep({job:'demo',name:'pcb_1',new_name:'pcb_a'});
+     */
+    renameStep(p:{job:string,name:string,new_name:string}):void;  
+
+    /**
+     * 设置层属性
+     * @returns æ— 
+     * @example 
+     * $.gen.setLayerAttr({job:'demo',step:'pcb',layer:'l2',attr:{name:2}});
+     */
+    setLayerAttr(p:{job:string,step:string,layer:string,attr:{name:number},units?:'inch'|'mm'}):void;  
+
+    /**
+     * 设置step属性
+     * @returns æ— 
+     * @example 
+     * $.gen.setStepAttr({job:'demo',step:'pcb',attr:{name:2}});
+     */
+    setStepAttr(p:{job:string,step:string,attr:{name:number},units?:'inch'|'mm'}):void;  
+
+    /**
+     * 设置钻孔Tool的User参数名称
+     * @returns 返回Tool User名称
+     * @example 
+     * var getToolUser = $.gen.getToolUser({job:'demo',step:'pcb',layer:'drill'});
+     */
+    getToolUser(p:{job:string,step:string,layer:string}):string;  
+
+    /**
+     * 设置钻孔Tool的Thick参数名称
+     * @returns 返回Tool Thick
+     * @example 
+     * var getToolThick = $.gen.getToolThick({job:'demo',step:'pcb',layer:'drill'});
+     */
+    getToolThick(p:{job:string,step:string,layer:string}):string;  
+
+    /**
+     * 设置钻孔Tool的slot参数名称
+     * @returns 返回Tool slots
+     * @example 
+     * var getToolSlots = $.gen.getToolSlots({job:'demo',step:'pcb',layer:'drill'});
+     */
+    getToolSlots(p:{job:string,step:string,layer:string}):string;  
+
+    /**
+     * 获取是否存在cad netlist
+     * @returns 代表存在返回1,不存在返回0
+     * @example 
+     * var cadNetlistExists = $.gen.cadNetlistExists({job:'demo',step:'pcb'});
+     */
+    cadNetlistExists(p:{job:string,step:string}):boolean;  
+
+    /**
+     * 获取是否存在 netlist是否存在
+     * @returns 代表存在返回1,不存在返回0
+     * @example 
+     * var netlistExists = $.gen.netlistExists({job:'demo',step:'net',type:'cadnet'});
+     */
+    netlistExists(p:{job:string,step:string,type:'cadnet'|'refnet'|'curnet'}):boolean;  
+
+    /**
+     * 层是否为空
+     * @returns 代表存在返回1,不存在返回0
+     * @example 
+     * var isLayerEmpty = $.gen.isLayerEmpty({job:'demo',step:'pcb',layer:'map'});
+     */
+    isLayerEmpty(p:{job:string,step:string,layer:string}):boolean;  
+
+    /**
+     * 返回genesis版本
+     * @returns type为`number`时返加 82|90,...
+                //type为`string`时返回 V8.2c (14Mar04)
+     * @example 
+     * var getGenVersion = $.gen.getGenVersion();
+     */
+    getGenVersion(p:{type?:'number'|'string'}):number|string;  
+
+    /**
+     * 获取层FeatHist
+     * @returns 返回{
+                        line:1,
+                        pad:10,
+                        surf:22,
+                        arc:4,
+                        text:1,
+                        total:38,
+                }
+     * @example 
+     * var getLayerFeatHist = $.gen.getLayerFeatHist({job:Job,step:Step,layer:'l2'});
+     */
+    getLayerFeatHist(p:{job:string,step:string,layer:string,options?:'undef'|'break_sr'|'select'}):object;  
+
+    /**
+     * 取得指定料号所有Symbol名字
+     * @returns 返回step列表
+     * @example 
+     * var getSymbolList = $.gen.getSymbolList({job:jobname});
+     */
+    getSymbolList(p:{job:string}):t[]; 
+
+    /**
+     * Copy Symbol
+     * @returns æ— 
+     * @example 
+     * $.gen.copySymbol({source_job:job1,source_name:'symbol1',dest_job:job1,source_name:'symbol2'});
+     */
+    copySymbol(p:{source_job:string,source_name:string,dest_job:string,source_name:string}):void;   
+
+    /**
+     * Clip Area
+     * @returns æ— 
+     * @example 
+     * $.gen.clipArea({area_rect:{x1:,y1:,x2:,y2:},inout:'in',contour_cut:'no'});
+     */
+    clipArea(p:{layers_mode:'layer_name'|'affected_layers',layer:string,margin:?,inout:'in'|'out',contour_cut:'no'|'yes',area_rect:{x1:number,y1:number,x2:number,y2:number},area_polygon:'mannual',ref_layer:'reference',area:'profile'|'reference'|'mannual'}):void;   
+
+    /**
+     * Compare Layers
+     * @returns 返回 0|1, 0:表示相同,1:表示不同
+     * @example 
+     * var compareLayers = $.gen.compareLayers();
+     */
+    compareLayers(p:{layer1?:string,job2?:string,step2?:string,layer2?:string,layer2_ext?:string,tol?:string,area?:'global'|'profile',ignore_attr?:string,map_layer?:string,map_layer_res?:string}):boolean;    
+
+    /**
+     * 暂停提示
+     * @returns 继续则返回:'OK',退出则返回:'underfined'
+     * @example 
+     * $.gen.PAUSE('暂停提示的内容');
+     */
+    PAUSE(p:string):string;   
+
+    /**
+     * 选择当前层所有Feature
+     * @returns æ— 
+     * @example 
+     * $.gen.selAllFeat();
+     */
+    selAllFeat():void;
+
+    /**
+     * 依照所选feature创建profile
+     * @returns æ— 
+     * @example 
+     * $.gen.selCreateProfile();
+     */
+    selCreateProfile():void;
+
+    /**
+     * 将选择的Feature加大
+     * @returns æ— 
+     * @example 
+     * $.gen.selResize({size: 3});
+     */
+    selResize(p:{size:number,corner_ctl:'no'}):void;
+
+}
+
+export = TopCamGenCom;
+
diff --git a/jtg js/node_modules/@types/topcam.ikm6/index.d.ts b/jtg js/node_modules/@types/topcam.ikm6/index.d.ts
new file mode 100644
index 0000000..ef79a34
--- /dev/null
+++ b/jtg js/node_modules/@types/topcam.ikm6/index.d.ts	
@@ -0,0 +1,141 @@
+import { type } from "os";
+
+declare class TopCamIkm6 {
+    constructor(p?:{cam_type?:'genesis'|'incam'='genesis', error_handle?:0|1=1});
+    /**
+     * 获取料号id
+     * @returns 返回料号名对应的id
+     * @example 
+     * var jobid = ikm.get_job_id("demo");
+     */
+    get_job_id(job_name:string):number;
+
+    
+    /**
+     * 获取列表数据
+     * @example 
+     * ikm.select_fieldarray({ 
+        table:'pdm_job',field:'jobname',order:'id DESC'
+    })
+     */
+    select_fieldarray(p:{table:string, field: any, order: any}):any;
+    
+    /**
+     * 获取数据,返回查找到的第一个
+     * @example 
+     * ikm.select_value({
+        table: 'pdm_job', field: 'jobname', 'where': { id: 1 }  
+    })
+     */
+    select_value(p:{table:string, field: any, where: any}):any;
+
+    /**
+     * 获取时间日期 
+     * @example 
+     * console.log('获取时间日期:' + ikm.get_now());
+     */
+    get_now():string;
+    
+    /**
+     * 获取时间日期 
+     * @example 
+     * console.log('获取时间日期:' + ikm.get_today());
+     */
+    get_today():string;
+
+     /**
+     * 获取配置 
+     * @example 
+     * ikm.get_config("measure-report-config","excel_template")
+     */
+    get_config( path:string, name:string ):any;
+    
+    /**
+     * 保存配置 
+     * @example 
+     * ikm.save_config({path:"test",name:"test",value:'test'})
+     */
+    save_config(p:{path: string , name:string, value: string }):void;
+
+    /**
+     * 插入数据 
+     * @example 
+     * ikm.insert({
+        table:"pdm_job", data:{jobname:"test"}
+    })
+     */
+    insert(p:{table: string , data:object }):void;
+
+    /**
+     * 删除数据 
+     * @example 
+     * ikm.dele({
+        table:"pdm_job", where: { jobname:"test2" }
+    })
+     */
+    dele(p:{table: string , where:Object }):void;
+
+    /**
+     * 更新数据 
+     * @example 
+     * ikm.update({
+        table:"pdm_job", data:{jobname:"test2"}, where: { jobname:"test" }
+    })
+     */
+    update(p:{table: string , data:Object, where:Object }):void;
+
+    /**
+     * 批量插入数据 
+     * @example 
+     * ikm.batch_insert({
+        table:"pdm_job", 
+        field: ["jobname"],
+        data: [{jobname:"test7""}, {jobname:"test8""}]
+    })
+     */
+    batch_insert(p:{table: string , field:array, data:array }):void;
+    
+    /**
+     * 更新料号工作流程日志
+     * @returns 
+     * @example 
+     * ikm.update_flow_report({job_id:1 , process_id: 1, report: '<html><head></head><body>test</body></html>'});
+     */
+    update_flow_report(p:{job_id: number, process_id:number, report:string }):void;
+    
+    /**
+     * get_info_style
+     * @returns 
+     * @example 
+     * var res = ikm.get_info_style({infoname:'pcb_type'});
+     */
+    get_info_style(p:{infoname: string }):[Object];
+
+    /**
+     * 获取流程状态
+     * @returns 返回流程的状态
+     * @example 
+     * var res = ikm.get_process_status({jobid:1, process_id:16});
+     */
+    get_process_status(p:{jobid: number, process_id:number}):Object;
+
+    /**
+     * round_number
+     * @returns number
+     * @example 
+     * var res = ikm.round_number(13.16221, 2);
+     */
+    round_number(number:number, precision:number):number;
+
+    /**
+     * 获取IKM的DB连接参数
+     * 
+     * @param 
+     * @returns 返回IKM的DB连接参数
+     */
+    getIkmConnectParameter():JSON
+}
+    
+export = TopCamIkm6;
+
+
diff --git a/jtg js/node_modules/@types/topcam.scriptfunc/index.d.ts b/jtg js/node_modules/@types/topcam.scriptfunc/index.d.ts
new file mode 100644
index 0000000..2d27651
--- /dev/null
+++ b/jtg js/node_modules/@types/topcam.scriptfunc/index.d.ts	
@@ -0,0 +1,77 @@
+
+import * as TopCamGenCom from "topcam.gencom";
+import * as TopSinDatabase from "topsin.database";
+import * as TopCamIkm6 from "topcam.ikm6";
+import * as Gui from "topsin.gengui";
+declare namespace TopCamScriptFunc {
+    export interface ScriptArgv {
+        /**
+         * genesis接口对象
+         */
+        gen:TopCamGenCom
+
+        /**
+         * ikm6 接口对象
+         */
+        ikm:TopCamIkm6
+
+        /**
+         * gui 接口对象
+         */
+        gui:Gui
+
+        /**
+         * 配置文件
+         */
+        conf:Object
+        
+        /**
+         * 料号名
+         */
+        job:string
+
+        /**
+         * 料号ID
+         */
+        id:number
+
+        /**
+         * 用户ID
+         */
+        user_id:number
+
+        /**
+         * 用户名
+         */
+        user_name:string
+
+        /**
+         *  脚本名
+         */
+        script_name: string
+
+        /**
+         * 用户完整名
+         */
+        user_full_name:string
+
+        /**
+         * gen类型
+         */
+        gen_type:string
+
+        /**
+         * 框架传入的参数
+         */
+        par:object
+    }    
+
+    /**
+     * 获取脚本函数参数
+     */
+    export function argv():ScriptArgv;
+}
+
+export = TopCamScriptFunc;
+
+
diff --git a/jtg js/node_modules/@types/topsin.crypto/index.d.ts b/jtg js/node_modules/@types/topsin.crypto/index.d.ts
new file mode 100644
index 0000000..dea414e
--- /dev/null
+++ b/jtg js/node_modules/@types/topsin.crypto/index.d.ts	
@@ -0,0 +1,105 @@
+declare class TopSinCrypto {
+    /**
+     * 获取数据的MD5码
+     * @param iData 
+     */
+    md5(iData:string):string
+
+    /**
+     * 获取文件的MD5码
+     * @param iFilePath 
+     */
+    fileMd5(iFilePath:string):string
+
+    /**
+     * 获取数据的SHA256码
+     * @param iData 
+     */
+    sha256(iData:string):string
+
+    /**
+     * 获取文件的SHA256码
+     * @param iFilePath 
+     */
+    fileSha256(iFilePath:string):string
+
+    /**
+     * 获取数据的SHA256_3码
+     * @param iData 
+     */
+    sha3_256(iData:string):string
+
+    /**
+     * 获取文件的SHA256_3码
+     * @param iFilePath 
+     */
+    fileSha3_256(iFilePath:string):string
+    
+    /**
+     * 转为base64
+     * @param iData
+     */
+    encodeBase64(iData:any):any
+
+    /**
+     * 反解base64
+     * @param iData
+     */
+    decodeBase64(iData:any):any
+
+    /**获取uuid
+    */
+    uuid():string
+
+    /**
+     * 加密1版
+     * 
+     * @param key 加密用的key
+     * @param data 要加密的数据
+     * @returns 返回加密后的数据
+     */
+    e(key:String, data:String):String
+
+    /**
+     * 解密1版
+     * 
+     * @param key 解密用的key
+     * @param data 要解密的数据
+     * @returns 返回解密后的数据
+     */
+    d(key:String, data:String):String
+
+    /**
+     * 加密2版
+     * 
+     * @param data 要加密的数据
+     * @returns 返回加密后的数据
+     */
+    e2(data:String):String
+
+    /**
+     * 解密2版
+     * 
+     * @param data 要解密的数据
+     * @returns 返回解密后的数据
+     */
+    d2(data:String):String
+
+    /**
+     * 加密3版
+     * 
+     * @param data 要加密的数据
+     * @reutrns 返回解密后的数据
+     */
+    e3(data:String):String
+
+    /**
+     * 解密3版
+     * 
+     * @param data 要解密的数据
+     * @returns 返回解密后的数据
+     */
+    d3(data:String):String
+}
+
+export = TopSinCrypto;
diff --git a/jtg js/node_modules/@types/topsin.database/index.d.ts b/jtg js/node_modules/@types/topsin.database/index.d.ts
new file mode 100644
index 0000000..c8d87f5
--- /dev/null
+++ b/jtg js/node_modules/@types/topsin.database/index.d.ts	
@@ -0,0 +1,619 @@
+import * as TopSinError from "topsin.error";
+declare namespace TopSinDatabase {
+    export var DbType: { pg: 'pg', mysql:'mysql', mssql:'mssql',oracle:'oracle',sqlite:'sqlite'};
+    export type DbType = "pg" | "mysql" | "mssql" | "oracle" | "sqlite";
+    export type DbEncrypt = "" | "EB642";
+    export type FieldFormat = '' | 'string' | 'json' | 'array' | 'yyyy-MM' |'yyyy-MM-dd' | 'yyyy-MM-dd hh:mm' | 'yyyy-MM-dd hh:mm:ss';
+    export type UpdatePolicy = '' | 'json_merge' | 'array_append';
+    export interface SqlConnectionParam {
+        database_host:string,
+        database_name:string,
+        database_type:DbType,
+        database_user:string,
+        database_pwd:string,
+        database_encrypt?:DbEncrypt,
+        database_options?:string,
+        auto_close_timeout?:number,
+    }
+
+    export interface SqlSelectorMap {
+        table:string,
+        field?:string | Array<string>,
+        where?:string | Array<any> | Map<string,any>,
+        group?:string | Array<string>,
+        order?:string | Array<string>,
+        offset?:number,
+        limit?:number,
+        unique_field?:string,
+        value_field?:string,
+        field_format?:Map<string,FieldFormat>,
+    }
+
+    export interface SqlInserterMap {
+        table:string,
+        field?:string | Array<string>,
+        data:Map<string,any>,
+        unique_field?:string | Array<string>,
+        return_field?:string,
+        update_policy?:Map<string, UpdatePolicy>
+    }
+
+    export interface SqlUpdaterMap {
+        table:string,
+        data:Map<string, any>,
+        field?:string | Array<string>,
+        where?:string | Array<string> | Map<string,any>,
+        update_policy?:Map<string, UpdatePolicy>
+    }
+
+    export interface SqlDeleterMap {
+        table:string,
+        where?:string | Array<any> | Map<string,any>,
+    }
+
+
+    export interface SelectArrayDataResult {
+        field:Array<string>,
+        data: Array<Array<any>>
+    }
+
+    export class SqlQuery {
+        /**
+         * 查询一行数据,返回为一个Array<any>数组;
+         * 
+         * @param iSelectorMap 查询参数
+         * @returns 返回Array<any>结构
+         * @example
+         * query.selectArray({
+         *   table:'sys_user',
+         *   field:['id','username','fullname','tags','attr_data'],
+         *   field_format:{tags:'array','attr_data':'json'},
+         *   where:{username:'admin'}
+         * });
+         */
+        selectArray(iSelectorMap:SqlSelectorMap):Array<any>;
+
+        /**
+         * 查询一行数据,返回为一个Array<any>数组;
+         * 
+         * @param iSql Sql语句
+         * @param iFieldFormat 字段数据类型定义
+         * @param iValues Sql语句变量替换
+         * @returns 返回Array<any>结构
+         * @example
+         * query.selectArray(
+         *   "SELECT id,username,fullname,tags,attr_data FROM sys_user where username=:username",
+         *   {tags:'array', attr_data:'json'},
+         *  {username:'admin'}
+         * );
+         */
+        selectArray(iSql:string, iFieldFormat?:Map<string, FieldFormat>, iValues?:Map<string,any>):Array<any>;
+
+
+        /**
+         * 查询一行数据,返回为一个Map<string,any>数组;
+         * 
+         * @param iSelectorMap 查询参数
+         * @returns 返回Map<string,any>结构
+         * @example
+         * query.selectMap({
+         *   table:'sys_user',
+         *   field:['id','username','fullname','tags','attr_data'],
+         *   field_format:{tags:'array','attr_data':'json'},
+         *   where:{username:'admin'}
+         * });
+         */
+        selectMap(iSelectorMap:SqlSelectorMap):Map<string,any>;
+
+        /**
+         * 查询一行数据,返回为一个Map<string,any>数组;
+         * 
+         * @param iSql Sql语句
+         * @param iFieldFormat 字段数据类型定义
+         * @param iValues Sql语句变量替换
+         * @returns 返回Map<string,any>结构
+         * @example
+         * query.selectMap(
+         *   "SELECT id,username,fullname,tags,attr_data FROM sys_user where username=:username",
+         *   {tags:'array', attr_data:'json'},
+         *  {username:'admin'}
+         * );
+         */
+        selectMap(iSql:string, iFieldFormat?:Map<string, FieldFormat>, iValues?:Map<string,any>):Map<string,any>;
+
+
+        /**
+         * 查询数据,返回第一行第一列;
+         * 
+         * @param iSelector 查询参数
+         * @returns 返回第一行第一列数据
+         * @example
+         * query.selectValue({ table:'sys_user', field:'id',where:{username:'admin'}});
+         */
+        selectValue(iSelector:SqlSelectorMap):any;
+
+        /**
+         * 查询数据,返回第一行第一列;
+         * 
+         * @param iSql Sql语句
+         * @param iFieldFormat 字段数据类型定义
+         * @param iValues Sql语句变量替换
+         * @returns 返回第一行第一列数据
+         * @example
+         * query.selecValue( "SELECT id FROM sys_user where username=:username", {}, {username:'admin'});
+         */
+        selectValue(iSql:string, iFieldFormat?:Map<string, FieldFormat>, iValues?:Map<string,any>):any;
+
+        /**
+         * 查询数据,返回Array<Array<any>>结构;
+         * 
+         * @param iSelectorMap 查询参数
+         * @returns 返回Array<Array<any>>结构
+         * @example
+         * query.selectArraryArray({
+         *   table:'sys_user',
+         *   field:['id','username','fullname','tags','attr_data'],
+         *   field_format:{tags:'array','attr_data':'json'},
+         *   order:'id ASC',
+         *   limit:10,
+         * });
+         */
+        selectArrayArray(iSelectorMap:SqlSelectorMap):Array<Array<any>>;
+
+        /**
+         * 查询数据,返回Array<Array<any>>结构;
+         * 
+         * @param iSql Sql语句
+         * @param iFieldFormat 字段数据类型定义
+         * @param iValues Sql语句变量替换
+         * @returns 返回Array<Array<any>>结构
+         * @example
+         * query.selectArraryArray(
+         *   "SELECT id,username,fullname,tags,attr_data FROM sys_user where id < :maxid",
+         *   {tags:'array', attr_data:'json'},
+         *   {maxid:1000}
+         * );
+         */
+        selectArrayArray(iSql:string, iFieldFormat?:Map<string, FieldFormat>, iValues?:Map<string,any>):Array<Array<any>>;
+
+        /**
+         * 查询数据,返回Array<Map<string,any>>结构;
+         * 
+         * @param iSelectorMap 查询参数
+         * @returns 返回Array<Map<string,any>>结构
+         * @example
+         * query.selectArraryMap({
+         *   table:'sys_user',
+         *   field:['id','username','fullname','tags','attr_data'],
+         *   field_format:{tags:'array','attr_data':'json'},
+         *   order:'id ASC',
+         *   limit:10,
+         * });
+         */
+        selectArrayMap(iSelectorMap:SqlSelectorMap):Array<Map<string,any>>;
+
+        /**
+         * 查询数据,返回Array<Map<string,any>结构;
+         * 
+         * @param iSql Sql语句
+         * @param iFieldFormat 字段数据类型定义
+         * @param iValues Sql语句变量替换
+         * @returns 返回Array<Map<string,any>结构
+         * @example
+         * query.selectArrayMap(
+         *   "SELECT id,username,fullname,tags,attr_data FROM sys_user where id < :maxid",
+         *   {tags:'array', attr_data:'json'},
+         *   {maxid:1000}
+         * );
+         */
+        selectArrayMap(iSql:string, iFieldFormat?:Map<string, FieldFormat>, iValues?:Map<string,any>):Array<Map<string,any>>;
+
+        /**
+         * 查询数据,返回{field:Array<string>, data:Array<Array<any>>}结构;
+         * 
+         * @param iSelectorMap 查询参数
+         * @returns 返回{field:Array<string>, data:Array<Array<any>>}结构
+         * @example
+         * query.selectArraryData({
+         *   table:'sys_user',
+         *   field:['id','username','fullname','tags','attr_data'],
+         *   field_format:{tags:'array','attr_data':'json'},
+         *   order:'id ASC',
+         *   limit:10,
+         * });
+         */
+        selectArrayData(iSelectorMap:SqlSelectorMap):SelectArrayDataResult;
+
+        /**
+         * 查询数据,返回{field:Array<string>, data:Array<Array<any>>}结构;
+         * 
+         * @param iSql Sql语句
+         * @param iFieldFormat 字段数据类型定义
+         * @param iValues Sql语句变量替换
+         * @returns 返回{field:Array<string>, data:Array<Array<any>>}}结构
+         * @example
+         * query.selectArrayData(
+         *   "SELECT id,username,fullname,tags,attr_data FROM sys_user where id < :maxid",
+         *   {tags:'array', attr_data:'json'},
+         *   {maxid:1000}
+         * );
+         */
+        selectArrayData(iSql:string, iFieldFormat?:Map<string, FieldFormat>, iValues?:Map<string,any>):SelectArrayDataResult;
+
+       /**
+         * 查询数据,返回Map<string,Map<string,any>>结构;
+         * 
+         * @param iSelectorMap 查询参数
+         * @returns 返回Map<string,Map<string,any>>结构
+         * @example
+         * query.selectMapMap({
+         *   table:'sys_user',
+         *   field:['id','username','fullname','tags','attr_data'],
+         *   field_format:{tags:'array','attr_data':'json'},
+         *   unique_field:'id'
+         * });
+         */
+        selectMapMap(iSelectorMap:SqlSelectorMap):Map<string,Map<string,any>>;
+
+        /**
+         * 查询数据,返回Map<string,Map<string,any>>结构;
+         * 
+         * @param iSql Sql语句
+         * @param iUniqueField 唯一字段名 
+         * @param iFieldFormat 字段数据类型定义
+         * @param iValues Sql语句变量替换
+         * @returns 返回Map<string,Map<string,any>>结构
+         * @example
+         * query.selectMapMap(
+         *   "SELECT id,username,fullname,tags,attr_data FROM sys_user where id < :maxid",
+         *   "id",
+         *   {tags:'array', attr_data:'json'},
+         *   {maxid:1000}
+         * );
+         */
+        selectMapMap(iSql:string, iUniqueField:string, iFieldFormat?:Map<string, FieldFormat>, iValues?:Map<string,any>):Map<string,Map<string,any>>;
+
+         /**
+         * 查询数据,返回Map<string,any>结构;
+         * 
+         * @param iSelectorMap 查询参数
+         * @returns 返回Map<string,any>结构
+         * @example
+         * query.selectMapValue({
+         *   table:'sys_user',
+         *   field:['id','username','fullname','tags','attr_data'],
+         *   field_format:{tags:'array','attr_data':'json'},
+         *   unique_field:'id',
+         *   value_field:'username',
+         * });
+         */
+        selectMapValue(iSelectorMap:SqlSelectorMap):Map<string,any>;
+
+        /**
+         * 查询数据,返回Map<string,any>结构;
+         * 
+         * @param iSql Sql语句
+         * @param iUniqueField 唯一字段名 
+         * @param iValueField 值字段名
+         * @param iFieldFormat 字段数据类型定义
+         * @param iValues Sql语句变量替换
+         * @returns 返回Map<string,any>结构
+         * @example
+         * query.selectMapValue(
+         *   "SELECT id,username,fullname,tags,attr_data FROM sys_user where id < :maxid",
+         *   "id", "username",
+         *   {tags:'array', attr_data:'json'},
+         *   {maxid:1000}
+         * );
+         */
+        selectMapValue(iSql:string, iUniqueField:string, iValueField:string, iFieldFormat?:Map<string, FieldFormat>, iValues?:Map<string,any>):Map<string,any>;
+
+        /**
+         * 查询数据,返回Array<any>结构;
+         * 
+         * @param iSelectorMap 查询参数
+         * @returns 返回Array<any>结构
+         * @example
+         * query.selectArrayValue({
+         *   table:'sys_user',
+         *   field:['id','username','fullname','tags','attr_data'],
+         *   field_format:{tags:'array','attr_data':'json'},
+         *   value_field:'username',
+         * });
+         */
+        selectArrayValue(iSelectorMap:SqlSelectorMap):Array<any>;
+
+        /**
+         * 查询数据,返回Array<any>结构;
+         * @param iSql Sql语句
+         * @param iValueField 值字段名
+         * @param iFieldFormat 字段数据类型定义
+         * @param iValues Sql语句变量替换
+         * @returns 返回Array<any>结构
+         * @example
+         * query.selectArrayValue(
+         *   "SELECT id,username,fullname,tags,attr_data FROM sys_user where id < :maxid",
+         *   "username",
+         *   {tags:'array', attr_data:'json'},
+         *   {maxid:1000}
+         * );
+         */
+        selectArrayValue(iSql:string, iValueField:string, iFieldFormat?:Map<string, FieldFormat>, iValues?:Map<string,any>):Array<any>;
+
+
+        /**
+         * 查询数据的行数;
+         * @param iSelectorMap 查询参数
+         * @returns 返回行数
+         * @example
+         * query.selectCount({
+         *   table:'sys_user',
+         *   where:'id < 100',
+         * });
+         */
+        selectCount(iSelectorMap:SqlSelectorMap):number;
+
+        /**
+         * 插入一行
+         * 
+         * @param iInserterMap 插入参数
+         * @returns 返回定义的return_field列数据;
+         * @example
+         * var id = query.insertRow({
+         *   table:'sys_user',
+         *   data:{username:'tony', fullname:'Tony Guo', status:'active'},
+         *   return_field:'id',
+         * }); 
+         */
+        insertRow(iInserterMap:SqlInserterMap):any;
+
+        /**
+         * 批量插入数据
+         * 
+         * @param iTable 表名 
+         * @param iField 字段
+         * @param iData 数据
+         * @example
+         * query.batchInsert('sys_user',['username','fullname'], [{username:'user1',fullname:'User 1'},{username:'user2',fullname:'User2'}])
+         */
+        batchInsert(iTable:string, iField:Array<string>, iData:Array<Map<string, any>>);
+
+        /**
+         * 更新数据;
+         * @param iUpdaterMap 更新参数
+         * @returns 影响行数
+         * @example
+         * query.updateRow({
+         *   table:'sys_user',
+         *   field:['tags'],
+         *   data:{tags:'{a,b}']},
+         *   where:{username:'admin'},
+         * })
+         */
+        updateRow(iUpdaterMap:SqlUpdaterMap):number;
+
+
+        /**
+         * 更新数据;
+         * 
+         * @param iTable 表名
+         * @param iData 更新数据
+         * @param iWhere Where条件
+         * @param iUpdatePolicy æ›´æ–°ç­–ç•¥
+         * @param iField 更新字段
+         * @returns 返回影响行数
+         */
+        updateRow(iTable:string, iData:Map<string,any>,
+            iWhere:string|Array<string>|Map<string,any>,
+            iUpdatePolicy?:Map<string,any>,
+            iField?:Array<string>
+        ):number;
+
+        /**
+         * 替换行(存在则更新,不存在则插入)
+         * @param iReplacerMap 更新参数
+         * @returns 返回指定的字段数据
+         * @example
+         * query.replaceRow({
+         *   talbe:'sys_user',
+         *   data:{username:'tony',fullname:'Tony GUO'},
+         *   unique_field:['username'],
+         *   return_field:'id'
+         * });
+         */
+        replaceRow(iReplacerMap:SqlInserterMap):any;
+
+         /**
+         * 替换行(存在则更新,不存在则插入)
+         * @param iTable 表名
+         * @param iData 替换数据
+         * @param iUniqueField 只一字段
+         * @param iUpdatePolicy æ›´æ–°ç­–ç•¥
+         * @param iReturnField 返回字段
+         * @returns 返回指定的字段数据
+         * @example
+         * query.replaceRow({
+         *   talbe:'sys_user',
+         *   data:{username:'tony',fullname:'Tony GUO'},
+         *   unique_field:['username'],
+         *   return_field:'id'
+         * });
+         */
+        replaceRow(iTable:string, iData:Map<string,any>, 
+            iUniqueField:Array<string>, iUpdatePolicy?:Map<string,UpdatePolicy>,
+            iReturnField?:string
+        ):any;
+
+
+        /**
+         * 删除行;
+         * 
+         * @param iDeleterMap 删除参数
+         * @returns 返回影响行数
+         * @example
+         * query.deleteRow({table:'sys_user', where: {username:'tony'}});
+         */
+        deleteRow(iDeleterMap:SqlDeleterMap):number;
+
+         /**
+         * 删除行;
+         * 
+         * @param iTable 表名
+         * @param iWhere Where条件
+         * @returns 返回影响行数
+         * @example
+         * query.deleteRow('sys_user'{username:'tony'});
+         */
+        deleteRow(iTable:string, iWhere:string|Array<any>|Map<string,any>):number;
+
+        /**
+         * 执行SQL语句;
+         * 
+         * @param iSql sql语句
+         * @returns 返回执行是否成功
+         */
+        execSql(iSql:string):boolean;
+
+        /**
+         * 判断表是否存在;
+         * 
+         * @param iTable 表名
+         * @returns 返回表是否存在
+         */
+        isTableExists(iTable:string):boolean
+
+        /**
+         * 获取表列表;
+         * 
+         * @returns 返回表列表
+         */
+        getTableList():Array<string>
+
+        /**
+         * 判断字段是否存在;
+         * 
+         * @param iTable 表名 
+         * @param iField 字段名
+         * @returns 返回字段是否存在
+         */
+        isFieldExists(iTable:string, iField:string):boolean;
+        
+        /**
+         * 获取字段列表;
+         * 
+         * @param iTable 表名
+         * @returns 返回字段列表
+         */
+        getFieldList(iTable:string):Array<string>;
+
+        /**
+         * 设置在新增数据时,是否可以设置自增长字段;(仅对Sql Server有效);
+         * 
+         * @param iTable 表名
+         * @param iStatus 状态
+         * 
+         */
+        setAutoIncrementStatus(iTable:string, iStatus:string):boolean;
+
+        /**
+         * 获取数据库当前时间,格式为yyyy-MM-dd hh:mm:ss
+         */
+        getNow():string;
+
+        /**
+         * 获取数据库当前日期,格式为yyyy-MM-dd
+         */
+        getToday():string;
+
+
+        /**
+         * 获取错误文本信息;
+         */
+        errorString():string;
+
+        /**
+         * 获取最后一次错误消息;
+         */
+        lastError():TopSinError;
+
+        /**
+         * 清除错误;
+         */
+        clearError():void;
+
+        /**
+         * 事务开始;
+         * @param iCheckConnection 是否检查连接是否正常;
+         */
+        begin(iCheckConnection?:boolean):boolean;
+
+        /**
+         * 提交事务;返回当前事务嵌套层级;
+         */
+        commit():number;
+
+        /**
+         * 回滚事务;返回当前事务的嵌套层级;
+         */
+        rollback():number;
+
+        /**
+         * 打开数据库连接;
+         * @param iCheckConnection 是否检查连接是否正常;
+         */
+        open(iCheckConnection?:boolean):boolean;
+
+        /**
+         * 关闭数据库连接;
+         */
+        close():boolean
+
+        /**
+         * 判断数据库是否连接上;
+         */
+        isConnected():boolean;
+
+        /**
+         * 返回数据库类型;
+         */
+        databaseType():string;
+    }
+    /**
+     * 添加数据库连接;
+     *
+     * @param iCntParam 连接参数
+     * @param iCntName 连接名称,默认为空;为空时代表默认连接
+     * @example 
+     *db.addConnection({databse_type:db.DbType.pg,
+     *  database_host:'127.0.0.1:5433',
+     *  database_name:'TOPMES_SNAPSHOT_V6',
+     *  database_user:'toplinker',
+     *  database_pwd:'Password'
+     *});
+     */
+    export function addConnection(iCntParam:SqlConnectionParam, iCntName?:string):void;
+
+   /**
+    * 移除已添加的连接;
+    * @param iCntName 连接名称
+    */
+    export function removeConnection(iCntName:string):void
+    
+    /**
+     * 获取一个数据库操作对象;
+     * @param iCntName 连接名称
+     */
+    export function query(iCntName?:string):SqlQuery
+
+    /**
+     * 获取一个数据库操作对象并执行回调函数;
+     * @param iCntName 连接名称
+     * @param iCallback 回调函数
+     */
+    export function query(iCntName:string, iCallback:(query:SqlQuery) => any):any
+
+}
+
+export = TopSinDatabase;
+
+
diff --git a/jtg js/node_modules/@types/topsin.gengui/index.d.ts b/jtg js/node_modules/@types/topsin.gengui/index.d.ts
new file mode 100644
index 0000000..2624d37
--- /dev/null
+++ b/jtg js/node_modules/@types/topsin.gengui/index.d.ts	
@@ -0,0 +1,343 @@
+declare namespace TopSinSocket {
+    export class TcpSocketImpl {
+        /**
+         * 中止连接
+         */
+        abort():void
+
+        /**
+         * 绑定地址和端口,返回是否成功
+         */
+        bind(ip:String, port:Number):boolean
+
+        /**
+         * 连接到主机
+         */
+        connectToHost(ip:String, port:Number):void
+
+        /**
+         * 断开与主机的连接,如果还有数据在写,那么会在结束后断开
+         */
+        disconnectFromHost();
+
+        /**
+         * 返回最近的一次错误
+         */
+        error():String
+
+        /**
+         * 冲刷缓存
+         */
+        flush():boolean
+
+        /**
+         * socket是否可用
+         */
+        isValid():boolean
+
+        /**
+         * 本地ip
+         */
+        localAddress():String
+
+        /**
+         * 本地port
+         */
+        localPort():Number
+
+        /**
+         * 对端ip
+         */
+        peerAddress():String
+
+        /**
+         * 对端port
+         */
+        peerPort():Number
+
+        /**
+         * 读缓存大小
+         */
+        readBufferSize():Number
+        
+        /**
+         * 设置读缓存大小
+         */
+        setReadBufferSize(size:Number):void
+
+        /**
+         * 等待直到连接成功或超时
+         * 
+         * @param msec 超时时间(毫秒)
+         * @return true 表示连接成功,false表示超时
+         */
+        waitForConnected(msec:Number):boolean
+
+        /**
+         * 等待直到断开连接
+         * 
+         * @param msec 超时时间(毫秒)
+         * @return true 表示断开成功,false表示超时
+         */
+        waitForDisconnected(msec:Number):boolean
+
+        /**
+         * 等待直到发送完至少1字节或超时
+         * 
+         * @param msec 超时时间(毫秒)
+         * @return true 表示已发送至少1字节, false表示超时
+         */
+        waitForReadyRead(msec:Number):boolean
+
+        /**
+         * 是否已读完
+         */
+        atEnd():boolean
+
+        /**
+         * 可读字节数
+         */
+        bytesAvailable():Number
+
+        /**
+         * 待写字节数
+         */
+        bytesToWrite():Number
+
+        /**
+         * 是否可读一行数据
+         * 注意:二进制数据不一定存在换行
+         */
+        canReadLine():boolean
+
+        /**
+         * 关闭连接
+         */
+        close():void
+
+        /**
+         * 错误消息
+         */
+        errorString():String
+
+        /**
+         * 连接是否打开
+         */
+        isOpen():boolean
+
+        /**
+         * 是否可读
+         */
+        isReadable():boolean
+
+        /**
+         * 是否可写
+         */
+        isWritable():boolean
+
+        /**
+         * 读取数据
+         * 如果数据不够会发生阻塞
+         * 
+         * @param size 数据大小
+         * @return 返回size大小的数据
+         */
+        read(size:Number):String
+
+        /**
+         * 读取全部数据直到不可读
+         * 
+         * @return 读到的数据
+         */
+        readAll():String
+
+        /**
+         * 读取一行数据
+         * 注意:二进制数据不一定存在换行
+         */
+        readLine():String
+
+        /**
+         * 发送数据
+         * 
+         * @param data 字符串(准确的说是 node 中的Buffer)
+         * @return 发送完成的字节数
+         */
+        write(data:String):Number
+
+        /**
+         *  注册事件
+         * 
+         * connected
+         * 连接成功,对应的callback: function(conn: TcpSocket) {}
+         * 
+         * disconnected
+         * 连接断开,对应的callback: function(conn: TcpSocket) {}
+         * 
+         * error
+         * 发生错误, 对应的callback: function(conn: TcpSocket, error:String) {}
+         * 
+         * byteswritten
+         * 发送完数据, 对应的callback: function(conn: TcpSocket, nbytes: Number) {}
+         * 
+         * readready
+         * 连接可读, 对应的callback: function(conn: TcpSocket) {}
+         */
+        on(event:TcpSocketEvent, callback:Function)
+    }
+    
+
+    export class TcpServerImpl {
+        constructor(parent:mainLoop):void
+
+        /**
+         * 关闭连接
+         */
+        close():void
+    
+        /**
+         * 最后一个错误原因
+         */
+        errorString():String
+    
+        /**
+         * 是否有排队连接
+         */
+        hasPendingConnections():boolean
+    
+        /**
+         * 监听地址、端口
+         */
+        listten(addr:String, port:Number):boolean
+    
+        /*** accepterror
+     * accept出错,对应的callback: function(err: string) {}
+         * 是否在监听
+         */
+        isListening():boolean
+    
+        /**
+         * 最大排队连接数
+         */
+        maxPendingConnections():Number
+    
+        /**
+         * 下一个排队连接
+         */
+        nextPendingConnection():TcpSocket
+    
+        /**
+         * 暂停接受新的连接
+         */
+        pauseAccepting():void
+    
+        /**
+         * 恢复接受新的连接
+         */
+        resumeAcception():void
+    
+        /**
+         * 服务端监听地址
+         */
+        serverAddress():String
+    
+        /**
+         * 服务端监听端口
+         */
+        serverPort():Number
+    
+        /**
+         * 服务端错误
+         */
+        serverError():String
+    
+        /**
+         * 设置最大排队连接
+         */
+        setMaxPendingConnections(n:Number):void
+    
+        /**
+         * 等待下一个连接
+         * 
+         * @param msec 等待的毫秒数
+         * @return 是否成功
+         */
+        waitForNewConnection(msec:Number):boolean
+    
+        /**
+         * 注册事件
+         * 
+         * accepterror
+         * accept出错,对应的callback: function(server: TcpServer, err: string) {}
+         * 
+         * newconnection
+         * 新的客户端连接成功,对应的callback: function(conn: TcpSocket) {}
+         */
+        on(event:TcpServerEvent, callback:Function):void
+    }
+
+    /**
+    * 创建一个新的TcpServer对象
+    * 
+    * @param parent 全局的事件循环
+    * @example
+    * 
+    * var socket = require('topsin.socket');
+    * var server = socket.TcpServer(mainLoop);
+    * 
+    * server.on('newconnection', function(conn) {
+    *      console.log("client: " + conn.peerPort() + ", connected");
+    *      conn.on('readready', function(conn) {
+    *          var data = conn.readAll();
+    *          console.log(data);
+    *          conn.write(data);
+    *      });
+    *      conn.on("disconnected", function(c) {
+    *          console.log("client: " + c.peerPort() + ", closed");
+    *      });
+    * );
+    * 
+    * server.on('accepterror', function(server) {
+    *      server.close();
+    *      console.log("exit");
+    *      mainLoop.quit();
+    * });
+    * 
+    * server.listen("127.0.0.1", 8888);
+    * mainLoop.exec();
+    */
+    export function TcpServer(parent:mainLoop):TcpServerImpl;
+
+    /**
+     * 创建一个新的TcpSocket对象
+     * 
+     * @param parent 全局的事件循环
+     * 
+     * @example
+     *  
+     * var socket = require('topsin.socket');
+     * 
+     * var client = socket.TcpSocket(mainLoop);
+     * client.on('connected', function(conn) {
+     *       console.log("connected");
+     * });
+     *  
+     * conn.on('readready', function(conn) {
+     *       var data = conn.readAll();
+     *       console.log(data);
+     *       conn.write(data);
+     *  });
+     *  
+     *  conn.on('disconnected', function(conn) {
+     *       console.log(conn.errorString());
+     *       mainLoop.quit();     
+     *  });
+     *  
+     *  client.connectToHost("127.0.0.1", 8888);
+     *  mainLoop.exec();
+     */
+    export function TcpSocket(parent:mainLoop):TcpSocketImpl;
+}
+
+export class mainLoop {};
+export = TopSinSocket;
\ No newline at end of file
diff --git a/jtg js/node_modules/@types/topsin.genmath/index.d.ts b/jtg js/node_modules/@types/topsin.genmath/index.d.ts
new file mode 100644
index 0000000..3c89c13
--- /dev/null
+++ b/jtg js/node_modules/@types/topsin.genmath/index.d.ts	
@@ -0,0 +1,451 @@
+declare class GenMath {
+    /**
+     * 调整box大小
+     * 
+     * @param box map结构如: {xmin: 0, xmax: 1, ymin: 0, ymax: 1}
+     * @param size 要调整的大小如: 1
+     * @returns 调整大小后的box
+     */
+    resizeBox(box:JSON, size: Number):JSON
+
+    /**
+     * 偏移点坐标
+     * 
+     * @param point 点的坐标如: {x: 1, y:1}
+     * @param shiftx x偏移,如 1
+     * @param shifty y偏移,如 2
+     * @param attr 其他属性,JSON类型,如 {mirror: false}
+     * @returns 偏移后的点
+     */
+    gpShift(point:JSON, shiftx:Number, shifty:Number, attr:JSON):JSON
+
+    /**
+     * 变换点列表
+     * 
+     * @param base 基准点坐标
+     * @param angle 选择角度,可选角度为 0, 90, 180, 270
+     * @param mirror 是否镜像 true/false
+     * @param shiftx x偏移 1
+     * @param shifty y偏移 0
+     * @param point 进行平移操作的点列表 [{x: .0, y: .0}, {x: 1.0, y: 2.0}]
+     * @returns 变换后的点列表
+     */
+    pTrans(base:JSON, angle:Number, mirror:Boolean, shiftx:Number, shifty:Number, points:[JSON]):[JSON]
+
+    /**
+     * 旋转box
+     * 
+     * @param box 如 {xmin: 0, ymin: 0, xmax: 1, ymax: 1}
+     * @angle 选择角度 0, 90, 180, 270
+     * @returns 旋转后的box
+     */
+    rotateBox(box:JSON, angle:Number):JSON
+
+    /**
+     * 点到点的最小距离
+     * @param p1 第一个点如 {x: .0, y: .0}
+     * @param p2 第二个点如 {x: 1, y: .0}
+     * @returns 距离
+     */
+    point2PointDis(p1:JSON, p2:JSON):Number
+
+    /**
+     * 线段长度,等同于点到点的最小距离
+     * 
+     * @param line 输入线段如: {xs: .0, ys: .0, xe: 1.0, ye: .0}
+     * @returns 距离
+     */
+    lineLength(line:JSON):Number
+
+    /**
+     * 点到线段的最短距离
+     * 
+     * @param p 输入点
+     * @param line 输入线段
+     * @returns 距离
+     */
+    point2LineDis(p:JSON, line:JSON):Number
+
+    /**
+     * 线段是否相交
+     * 
+     * @param line1 第一条线段如 {xs: -1, ys: 0, xe: 2, ye: 0}
+     * @param line2 第二条线段如 {xs: 0, ys: -1, xe: 0, ye: 1}
+     * @param extend true/false,可选,是否判断延长线相交
+     * @returns 相交返回true否则false
+     */
+    lineIntersect(line1:JSON, line2:JSON, extend:Boolean):Boolean
+
+    /**
+     * 线段到线段的距离
+     * 
+     * @param line1 第一条线段如 {xs: -1, ys: 0, xe: 2, ye: 0}
+     * @param line2 第二条线段如 {xs: 0, ys: -1, xe: 0, ye: 1}
+     * @returns 距离
+     */
+    line2LineDis(line1:JSON, line2:JSON):Number
+
+    /**
+     * 多边形到多边形的距离
+     * 多边形即点的列表
+     * 
+     * @param p1 第一个多边形,如: [{x: .0, y: .0}, {x: 1, y: 1}, {x: 2, y:2}]
+     * @param p2 第二个多边形,如: [{x: .0, y: -1}, {x: 1, y: 1}, {x: 2, y:2}]
+     * @returns 距离
+     */
+    polygon2PolygonDis(p1:[JSON], p2:[JSON]):Number
+
+    /**
+     * 点到多边形的距离
+     * 
+     * @param p 点如 {x: 0, y: 0}
+     * @param poly 多边形如 [{x: .0, y: -1}, {x: 1, y: 1}, {x: 2, y:2}]
+     * @returns 距离
+     */
+    point2PolygonDis(p:JSON, poly:[JSON]):Number
+
+    /**
+     * 线段到多边形的距离
+     * 
+     * @param line 线段如 {xs: -1, ys: 0, xe: 2, ye: 0}
+     * @param poly 多边形如 [{x: .0, y: -1}, {x: 1, y: 1}, {x: 2, y:2}]
+     * @returns 距离
+     */
+    line2PolygonDis(line:JSON, poly:[JSON]):Number
+
+    /**
+     * 将sym转为多边形
+     * sym是代表一个形状;
+     * 主要有三种:如下:
+     * 1. r10.4表示直径为0.0104的圆形
+     * 2. s12.4表示开宽为0.0124的正方形
+     * 3. rect10.2x12.4表示长为0.0102,宽为0.0124的长方形
+     * 
+     * 
+     * { "type":"line", "symbol":"r10.2", "xs": 0, "ys": 0,"xe": 1,"ye":1 }
+     * { "type":"pad", "symbol":"rect10.2x20.2", "x":0, "y":1, "angle":90, "mirror":true}
+     * { "type":"surface", "symbol":[{"x":0,"y":0},{"x":0,"y":1},{"x":1,"y":1},{"x":1,"y":0},{"x":0,"y":0}]}
+     * 
+     * @param sym 形状
+     * @return 多边形(即点的列表)
+     */
+    sym2Polygon(sym:JSON):[JSON]
+
+    /**
+     * 点到形状的距离
+     * 
+     * @param p 点
+     * @param sym 形状
+     * @returns 距离
+     */
+    point2SymDis(p:JSON, sym:JSON):Number
+
+    /**
+     * 线段到形状距离
+     * 
+     * @param line 线段
+     * @param sym 形状
+     * @returns 距离
+     */
+    line2SymDis(line:JSON, sym:JSON):Number
+
+    /**
+     * 形状到形状距离
+     * @param sym1 第一个形状
+     * @param sym2 第二个形状
+     * @returns 距离
+     */
+    sym2SymDis(sym1:JSON, sym2:JSON):Number
+
+    /**
+     * 形状到多个形状的最短距离
+     * 
+     * @param sym 形状
+     * @param featlist 形状列表(即[sym]) 见 sym2Polygon
+     * @returns 距离
+     */
+    sym2FeatlistDis(sym:JSON, featlist:[JSON]):Number
+
+    /**
+     * 判断形状到多个形状的最短距离是否小于给定值
+     * 
+     * @param sym 形状
+     * @param featlist 形状列表(即[sym]) 见 sym2Polygon
+     * @param dist 给的的距离 如 1.0
+     * @returns true距离表示小于dist否则false
+     */
+    checkSymTouchFeatlist(sym:JSON, featlist:[JSON], dist:Number):Boolean
+
+    /**
+     * 线段到多个形状的最短距离
+     * 
+     * @param line 线段
+     * @param feat 形状列表
+     * @returns 距离
+     */
+    line2FeatlistDis(line:JSON, feat:[JSON]):Number
+
+    /**
+     * 获取固定y值的点列表
+     * 
+     * @param from 起始位置
+     * @param to 终止位置
+     * @param step 跳步
+     * @param startFrom 起点 可取 min, max, center 表示起始为from, to, (from+to)/2
+     * @param y 固定的 y值
+     * @returns 点列表
+     * 
+     * @example
+     * require("topsin.genmath");
+     * 
+     * var g = new GenMath();
+     * var r = g.gpListLineX(0, 10, 4, "min", 1);
+     * console.log(r);
+     * 
+     * => [{"x":0,"y":1},{"x":4,"y":1},{"x":8,"y":1}]
+     */
+    gpListLineX(from:Number, to:Number, step:Number, startFrom:String, y:Number):[JSON]
+
+    /**
+     * 获取固定x值的点列表
+     * 参考 gpListLineX
+     */
+    gpListLineY(from:Number, to:Number, step:Number, startFrom:String, x:Number):[JSON]
+
+    /**
+     * 获取固定范围的点列表
+     * 
+     * @param box 范围
+     * @param step 跳步
+     * @param startAnchor 起始位置,可以是点如 {x: 1, y:2},可以是方向 west, south 表示 min; north, east表示max,默认为center
+     * @param direct 方向,可选 "x" 和 "y", 或者为空
+     * @param type 类型,可选 "ring" 和 "snake"
+     * @returns 点列表
+     */
+    gpListArea(area:JSON, step:Number, startAnchor:Object, direct:String, type:String):[JSON]
+
+    /**
+     * 返回pi值
+     */
+    pi():Number
+
+    /**
+     * 弧度转角度
+     */
+    rad2Deg(rad:Number):Number
+
+    /**
+     * 角度转弧度
+     */
+    deg2Rad(deg:Number):Number
+
+    /**
+     * 线段角度
+     * 
+     * @return 角度
+     */
+    lineAngle(line:JSON):Number
+
+    /**
+     * 绕基点旋转点
+     * 
+     * @param base 几点
+     * @param point 要旋转的点
+     * @returns 旋转后的点
+     */
+    rotatePoint(base:JSON, point:JSON):JSON
+
+    /**
+     * 返回给定角(∠ABC)的角度
+     * 
+     * @param B 顶点
+     * @param A 点
+     * @param C 点
+     * @returns 角度
+     */
+    calcAngleThreePoints(B:JSON, A:JSON, C:JSON):Number
+
+    /**
+     * 获取线段上偏移起点给定长度的点
+     * 
+     * @param line 线段
+     * @param len 长度
+     * @return 点
+     */
+    calPointOnLine(line:JSON, len:Number):Number
+
+    /**
+     * 延长线段
+     * 
+     * @param line 线段
+     * @param len 长度
+     * @return 延长后的线段
+     */
+    extendLine(line:JSON, len:Number):JSON
+
+    /**
+     * 获取线段中点
+     */
+    getLineCenter(line:JSON):JSON
+
+    /**
+     * 判断点是否在线段上
+     * @returns true在否则false
+     */
+    isPointOnLine(point:JSON, line:JSON):Boolean
+
+    /**
+     * 判断点和圆的位置关系
+     * 
+     * @param point 点
+     * @param circle 圆,由圆心坐标和半径表示如: {x: .0, y: .0, r: 10}
+     * @returns 位置关系,in, out, on 分别表示在圆外,在圆内,在圆上
+     */
+    isPointOnCircle(point:JSON, circle:JSON):String
+
+    /**
+     * 点到圆的两个切点
+     * 
+     * @returns 两个切点如 [p1, p2]
+     */
+    point2CircleTanget(point:JSON, circle:JSON):[JSON, JSON]
+
+    /**
+     * 弧分割为线段
+     * 
+     * 弧表示为 起点(xs, ys)+终点(xe, ye)+弧心(xc,yc)+方向(direction),如
+     *  {xs: .0, ys: .0, xe: 1, ye: 1, xc: .0, yc: .0, direction: "cw"}
+     * 其中方向可取值为 "cw"或"ccw"
+     * 
+     * @param arc å¼§
+     * @param den 分母(denominator)即分割的份数
+     * @returns 线段的列表
+     * @example
+     * 
+     * require("topsin.genmath");
+     * 
+     * console.log(g.arc2Lines({xs: 0, ys:1, xe: 1, ye: 0, xc: 0, yc: 0, direction: "cw"}, 2));
+     * 
+     * => [{"xe":0.7071067811865476,"xs":1,"ye":0.7071067811865475,"ys":0},{"xe":0,"xs":0.7071067811865476,"ye":1,"ys":0.7071067811865475}]
+     */
+    arc2Lines(arc:JSON, den:Number):[JSON]
+
+    /**
+     * 将profile转为多边形
+     * 
+     * @return 点的列表
+     */
+    profile2Polygon(profile:String, den:Number):[JSON]
+
+    /**
+     * å¼§é•¿
+     */
+    arcLength(arc:JSON):Number
+
+    /**
+     * 获取自动排版结构
+     * 
+     * @param sub : [{datum=>{x=>?,y=>?},symbol=>?,points=>[{x=>?,y=>?},{x=>?,y=>?},...]},...]
+     * @param panel : [{datum=>{x=>?,y=>?},symbol=>?,points=>[{x=>?,y=>?},{x=>?,y=>?},...]},...],
+     * @param type : ['rotate','empty_set']
+     * @returns 
+     *   {
+     *      rotate: 0|1,
+     *      empty_set: 0|1,
+     *      all_match: 0|1,
+     *      ox: ?,
+     *      oy: ?,
+     *      points: [{x:?,y:?,angle:?},...],
+     *   }
+     */
+    SubPanelSr(sub:[JSON], panel:[JSON]):JSON
+
+    /**
+     * 计算线段的k和b (y = kx + b)
+     * 
+     * @return {k:?, b:?} 垂直时k为Inf
+     */
+    getLineKb(line:JSON):JSON
+
+    /**
+     * 根据一对k,b值计算交点
+     * 
+     * @param kb1 : {k: 1, b: 2}
+     * @param kb2 : {k: 0, b: 3}
+     * @returns 交点{x:?, y:?}, 不存在则为undefined
+     */
+    getKblineIntersect(kb1:JSON, kb2:JSON):Object
+
+    /**
+     * 获取线段交点
+     * 
+     * @param line1 线段1
+     * @param line2 线段2
+     * @param extend 可选true或false表示是否判断延长线
+     * @returns 交点{x:?, y:?},不存在则为undefined
+     */
+    getLineIntersect(line1:JSON, line2:JSON, extend:Boolean):Object
+
+    /**
+     * 获取点列表中点的最小间隔
+     * 
+     * @param l 点列表
+     * @returns 距离
+     */
+    getPlistMinDis(l:[JSON]):Number
+
+    /**
+     * 获取一个点列表里的中心距离小于dis的点列表
+     * @param dis : 最小距离
+     * @param l : [{x=>?,y=>?,r=>?},{x=>?,y=>?},...], #r代表圆形直径
+     * @return : { points: [{x:?,y:?},...], lines: [{xs:?,ys:?,xe:?,ye:?},..] }
+     */
+    getPlistLtDistance(dis:Number, l:[JSON]):[JSON, JSON]
+
+    /**
+     * 获kb线经过某一点的垂线
+     * 
+     * @param kb : {k:?, b:?}
+     * @param point: {x: ?, y:? }
+     * @returns 垂线的kb {k:?, b:?}
+     */
+    getKbLinePrependicular(kb:JSON, point:JSON):JSON
+
+    /**
+     * 获kb线距离一定值的平行线,距离正负依X值
+     * 
+     * @param kb : {k:?, b:?}
+     * @param dis 距离
+     * @returns 平行线的kb : {k:?, b:?}
+     */
+    getKblineParallel(kb:JSON, dis:Number):JSON
+
+    /**
+     * 获取线段距离一定值的平行线段
+     * 
+     * @param line 线段
+     * @param dis 距离
+     * @returns 平行的线段
+     */
+    getLineParallel(line:JSON, dis:Number):JSON
+
+    /**
+     * 获取偏移一定距离的折线
+     * 
+     * @param polyline 折线
+     * @param dis 距离
+     * @returns 新的折线
+     */
+    polylineOffset(polylin:JSON, dis:Number):JSON
+
+    /**
+     * box是否相交
+     * box见 resizeBox
+     */
+    isRangeIntersect(box1:JSON, box2:JSON, tolerance:Number):Boolean
+
+    /**
+     * 解析叠构
+     */
+    analyzeStackup(par:JSON):JSON
+}
\ No newline at end of file
diff --git a/jtg js/node_modules/@types/topsin.socket/index.d.ts b/jtg js/node_modules/@types/topsin.socket/index.d.ts
new file mode 100644
index 0000000..2624d37
--- /dev/null
+++ b/jtg js/node_modules/@types/topsin.socket/index.d.ts	
@@ -0,0 +1,343 @@
+declare namespace TopSinSocket {
+    export class TcpSocketImpl {
+        /**
+         * 中止连接
+         */
+        abort():void
+
+        /**
+         * 绑定地址和端口,返回是否成功
+         */
+        bind(ip:String, port:Number):boolean
+
+        /**
+         * 连接到主机
+         */
+        connectToHost(ip:String, port:Number):void
+
+        /**
+         * 断开与主机的连接,如果还有数据在写,那么会在结束后断开
+         */
+        disconnectFromHost();
+
+        /**
+         * 返回最近的一次错误
+         */
+        error():String
+
+        /**
+         * 冲刷缓存
+         */
+        flush():boolean
+
+        /**
+         * socket是否可用
+         */
+        isValid():boolean
+
+        /**
+         * 本地ip
+         */
+        localAddress():String
+
+        /**
+         * 本地port
+         */
+        localPort():Number
+
+        /**
+         * 对端ip
+         */
+        peerAddress():String
+
+        /**
+         * 对端port
+         */
+        peerPort():Number
+
+        /**
+         * 读缓存大小
+         */
+        readBufferSize():Number
+        
+        /**
+         * 设置读缓存大小
+         */
+        setReadBufferSize(size:Number):void
+
+        /**
+         * 等待直到连接成功或超时
+         * 
+         * @param msec 超时时间(毫秒)
+         * @return true 表示连接成功,false表示超时
+         */
+        waitForConnected(msec:Number):boolean
+
+        /**
+         * 等待直到断开连接
+         * 
+         * @param msec 超时时间(毫秒)
+         * @return true 表示断开成功,false表示超时
+         */
+        waitForDisconnected(msec:Number):boolean
+
+        /**
+         * 等待直到发送完至少1字节或超时
+         * 
+         * @param msec 超时时间(毫秒)
+         * @return true 表示已发送至少1字节, false表示超时
+         */
+        waitForReadyRead(msec:Number):boolean
+
+        /**
+         * 是否已读完
+         */
+        atEnd():boolean
+
+        /**
+         * 可读字节数
+         */
+        bytesAvailable():Number
+
+        /**
+         * 待写字节数
+         */
+        bytesToWrite():Number
+
+        /**
+         * 是否可读一行数据
+         * 注意:二进制数据不一定存在换行
+         */
+        canReadLine():boolean
+
+        /**
+         * 关闭连接
+         */
+        close():void
+
+        /**
+         * 错误消息
+         */
+        errorString():String
+
+        /**
+         * 连接是否打开
+         */
+        isOpen():boolean
+
+        /**
+         * 是否可读
+         */
+        isReadable():boolean
+
+        /**
+         * 是否可写
+         */
+        isWritable():boolean
+
+        /**
+         * 读取数据
+         * 如果数据不够会发生阻塞
+         * 
+         * @param size 数据大小
+         * @return 返回size大小的数据
+         */
+        read(size:Number):String
+
+        /**
+         * 读取全部数据直到不可读
+         * 
+         * @return 读到的数据
+         */
+        readAll():String
+
+        /**
+         * 读取一行数据
+         * 注意:二进制数据不一定存在换行
+         */
+        readLine():String
+
+        /**
+         * 发送数据
+         * 
+         * @param data 字符串(准确的说是 node 中的Buffer)
+         * @return 发送完成的字节数
+         */
+        write(data:String):Number
+
+        /**
+         *  注册事件
+         * 
+         * connected
+         * 连接成功,对应的callback: function(conn: TcpSocket) {}
+         * 
+         * disconnected
+         * 连接断开,对应的callback: function(conn: TcpSocket) {}
+         * 
+         * error
+         * 发生错误, 对应的callback: function(conn: TcpSocket, error:String) {}
+         * 
+         * byteswritten
+         * 发送完数据, 对应的callback: function(conn: TcpSocket, nbytes: Number) {}
+         * 
+         * readready
+         * 连接可读, 对应的callback: function(conn: TcpSocket) {}
+         */
+        on(event:TcpSocketEvent, callback:Function)
+    }
+    
+
+    export class TcpServerImpl {
+        constructor(parent:mainLoop):void
+
+        /**
+         * 关闭连接
+         */
+        close():void
+    
+        /**
+         * 最后一个错误原因
+         */
+        errorString():String
+    
+        /**
+         * 是否有排队连接
+         */
+        hasPendingConnections():boolean
+    
+        /**
+         * 监听地址、端口
+         */
+        listten(addr:String, port:Number):boolean
+    
+        /*** accepterror
+     * accept出错,对应的callback: function(err: string) {}
+         * 是否在监听
+         */
+        isListening():boolean
+    
+        /**
+         * 最大排队连接数
+         */
+        maxPendingConnections():Number
+    
+        /**
+         * 下一个排队连接
+         */
+        nextPendingConnection():TcpSocket
+    
+        /**
+         * 暂停接受新的连接
+         */
+        pauseAccepting():void
+    
+        /**
+         * 恢复接受新的连接
+         */
+        resumeAcception():void
+    
+        /**
+         * 服务端监听地址
+         */
+        serverAddress():String
+    
+        /**
+         * 服务端监听端口
+         */
+        serverPort():Number
+    
+        /**
+         * 服务端错误
+         */
+        serverError():String
+    
+        /**
+         * 设置最大排队连接
+         */
+        setMaxPendingConnections(n:Number):void
+    
+        /**
+         * 等待下一个连接
+         * 
+         * @param msec 等待的毫秒数
+         * @return 是否成功
+         */
+        waitForNewConnection(msec:Number):boolean
+    
+        /**
+         * 注册事件
+         * 
+         * accepterror
+         * accept出错,对应的callback: function(server: TcpServer, err: string) {}
+         * 
+         * newconnection
+         * 新的客户端连接成功,对应的callback: function(conn: TcpSocket) {}
+         */
+        on(event:TcpServerEvent, callback:Function):void
+    }
+
+    /**
+    * 创建一个新的TcpServer对象
+    * 
+    * @param parent 全局的事件循环
+    * @example
+    * 
+    * var socket = require('topsin.socket');
+    * var server = socket.TcpServer(mainLoop);
+    * 
+    * server.on('newconnection', function(conn) {
+    *      console.log("client: " + conn.peerPort() + ", connected");
+    *      conn.on('readready', function(conn) {
+    *          var data = conn.readAll();
+    *          console.log(data);
+    *          conn.write(data);
+    *      });
+    *      conn.on("disconnected", function(c) {
+    *          console.log("client: " + c.peerPort() + ", closed");
+    *      });
+    * );
+    * 
+    * server.on('accepterror', function(server) {
+    *      server.close();
+    *      console.log("exit");
+    *      mainLoop.quit();
+    * });
+    * 
+    * server.listen("127.0.0.1", 8888);
+    * mainLoop.exec();
+    */
+    export function TcpServer(parent:mainLoop):TcpServerImpl;
+
+    /**
+     * 创建一个新的TcpSocket对象
+     * 
+     * @param parent 全局的事件循环
+     * 
+     * @example
+     *  
+     * var socket = require('topsin.socket');
+     * 
+     * var client = socket.TcpSocket(mainLoop);
+     * client.on('connected', function(conn) {
+     *       console.log("connected");
+     * });
+     *  
+     * conn.on('readready', function(conn) {
+     *       var data = conn.readAll();
+     *       console.log(data);
+     *       conn.write(data);
+     *  });
+     *  
+     *  conn.on('disconnected', function(conn) {
+     *       console.log(conn.errorString());
+     *       mainLoop.quit();     
+     *  });
+     *  
+     *  client.connectToHost("127.0.0.1", 8888);
+     *  mainLoop.exec();
+     */
+    export function TcpSocket(parent:mainLoop):TcpSocketImpl;
+}
+
+export class mainLoop {};
+export = TopSinSocket;
\ No newline at end of file
diff --git a/test/ATS_AIM_customer_data_analysis.js b/test/ATS_AIM_customer_data_analysis.js
index 9eee4d7..fb43b42 100644
--- a/test/ATS_AIM_customer_data_analysis.js
+++ b/test/ATS_AIM_customer_data_analysis.js
@@ -58,38 +58,20 @@ var JobId = $.job_id;
 var mode = "develop"   // 运行模式  develop 开发模式 方便调试
 
 try {
-    // 获取脚本参数
-    var par = $.par;
-    var parParams = ["step_filter", "erf", "auto_save"]; // par应该有的属性
-    var isParExist = parParams.reduce(function (a, b) {
-        if (!par.hasOwnProperty(b)) {
-            a = false;
-        }
-        else if (par[b] == "") {
-            switch (b) {
-                case "step_filter":
-                    par.pcs_step = "pcs";
-                    break;
-                case "auto_save":
-                    par.auto_save = "yes";
-                    break;
-            }
-        }
-        return a;
-    }, true);
-    if(!isParExist){return "Error"} // 如果par没有parParams里的属性 就退出
-    var job = Job,pcs_step="cad",array_step="stp"       // todo
-    par.job_info = {          // todo tmp
-        vc_src_01005_pad_result: ".smd",
-        depth_drill: "depth_drill",
-        depth_routing: "depth_routing",
-        cavity: "cavity"
-    }
+	var par = {
+		job:"i3",
+		job_info : {          // todo tmp
+			vc_src_01005_pad_result: ".smd",
+			depth_drill: "depth_drill",
+			depth_routing: "depth_routing",
+			cavity: "cavity"
+		}
+	}
+    var job = par.job.toLowerCase(),pcs_step="cad",array_step="stp"       // todo
     // 料号验证
-    job = "1"
-    err = beforeStart({job:job});if(err){ throw err };
+	err = beforeStart({job:job});if(err){ throw err };
     // matrix分析
-    var matrixInfo = getMatrixInfo({job:job})
+	var matrixInfo = getMatrixInfo({job:job})
     var matrix_analysis = UPLOAD_LAYER_MATRIX({job:job,matrixInfo:matrixInfo})  // 分析matrix
     var matrix = matrixInfo.matrix
 
@@ -98,7 +80,7 @@ try {
     // IKM.msg(jobInfo)
 
     // 分析钻孔属性  // todo 镭射切割长度
-    analysis_drill({job:job,pcs_step:pcs_step,array_step:array_step,matrixInfo:matrixInfo,matrix_analysis:matrix_analysis},par)
+    // analysis_drill({job:job,pcs_step:pcs_step,array_step:array_step,matrixInfo:matrixInfo,matrix_analysis:matrix_analysis},par)
 
 
 
@@ -154,7 +136,7 @@ function beforeStart(props){  // 脚本开始前的料号判断
     GEN.checkInout({job:job,mode:"out"})
 }
 function getMatrixInfo(props){  // 获取matrix各种信息
-    var job = props.job || Job
+    var job = props.job
     var matrix = GEN.getMatrix({job:job})
     var res = {
         matrix: matrix,   // matrix
@@ -195,12 +177,13 @@ function getMatrixInfo(props){  // 获取matrix各种信息
     // 找出外层  以及外层对应的防焊层 [{signalL:"top", solderL:"smt"}]
     res.mOuters = res.mSignals.reduce(function(a,b){
         if(b.tl_type == "outer"){
-           a.push({
+			var solderLayers = res.mSolderMasks.filter(function(v){
+				return v.side == b.side
+			})
+           	a.push({
                 signalL: b.name,
-                solderL: res.mSolderMasks.filter(function(v){
-                    return v.side == b.side
-                })[0]["name"]
-           })
+                solderL: solderLayers.length >0 ? solderLayers[0]["name"] : null
+           	})
         }
         return a
     },[])
diff --git a/test/ATS_AIM_input_data copy.js b/test/ATS_AIM_input_data copy.js
new file mode 100644
index 0000000..e071d9f
--- /dev/null
+++ b/test/ATS_AIM_input_data copy.js	
@@ -0,0 +1,331 @@
+/*
+    NAME: 
+    DESCRIPTION: 导入gerber数据
+    PARAMETER:
+	[
+		{
+			name : 'customer',
+			title : 'CUSTOMER 名',
+			type : 'LineEdit',
+			property : {tool_tip : '客户名称'}
+        },
+        {
+            name : 'job_name',
+			title : '料号名',
+			type : 'LineEdit',
+			property : {tool_tip : '料号名'}
+        },
+        {
+            name : 'path',
+			title : '资料路径',
+			type : 'LineEdit',
+			property : {tool_tip : '客户资料所在路径'}
+        }
+    ]
+
+    VERSION_HISTORY:
+	V1.00 2020 3-30 Scott
+	
+    HELP:
+	<html><body bgcolor="#DDECFE">
+		<font size="3" color="#003DB2"><p>功能简介</p></font>
+		  <p> 导入gerber数据</p>
+		  <br>
+		<font size="3" color="#003DB2"><p>参数配置</p></font>
+		 <p> 导入gerber数据的规则 </p>
+		<font size="3" color="#003DB2"><p>注意事项</p></font>
+		  <p> ● 无 </p>
+		  <br>
+	</body></html>	
+*/
+
+// 引入模块 包
+var $ = require('topcam.scriptfunc').argv();
+var fs = require('fs');
+var _ = require('lodash');
+var IKM = $.ikm;
+var GEN = $.gen;
+var GUI = $.gui;
+var Job = $.job;
+    
+try {
+    // 获取脚本参数
+	var par = $.par;
+
+	// !!! tmp
+	par = {
+		customer: "ats",
+		job_name: "1",
+		path: "C:/Users/Alan/Desktop/Customer_1"
+	}
+
+    var parParams = ["customer", "job_name", "path"]; // par应该有的属性
+    var isParExist = parParams.reduce(function (a, b) {
+        if (!par.hasOwnProperty(b)) {
+            a = false;
+        }
+        else if (par[b] == "") {
+            switch (b) {
+                case "job_name":
+                    par.job_name = Job;
+                    break;
+            }
+        }
+        return a;
+    }, true);
+    if(!isParExist){throw "par error"} // 如果par没有parParams里的属性 就退出
+
+	var cfg = JSON.parse(IKM.select_value({table:'pub_conf',field:'json_data',where:{path : 'cam/input_data'}}));  // 读取配置文件
+	var customer = par.customer.split("_")[0].toLowerCase()
+	var useCfg = cfg[customer];
+	addDefaultCfg(cfg.def, useCfg) // 添加默认配置
+	if(customer != par.customer.toLowerCase()){
+		var cfgType =  cfg[par.customer.toLowerCase()]
+		if(cfgType){ changeCfg(useCfg, cfgType) }
+	}
+    var job = par.job_name, path = par.path || useCfg.path, step = useCfg.step, err
+    err = delSameJob({job:job, delSame:useCfg.delSameJob});  if(err){throw err}
+	// 判断导入方式 处理path
+	var jobPath = path + "/" + job
+	if(!fs.exists(jobPath)){throw "path error"}
+	var pathInfo = getPathInfo({path:jobPath, cfg: useCfg})  // 分析path下的文件
+	if(!pathInfo.type){throw "file error"}   // pathInfo.type    "ODB"  or  "Gerber"
+	var input_ok = false   // 判断是不是导入成功
+	// 分支  导入ODB
+	if(pathInfo.type == "ODB"){
+		var odb = useCfg.ODB
+		var fileInfo = getFileInfo({inputConfig:odb, path:jobPath, files:pathInfo.files}) // 获取导入文件信息
+		if(/^yes$/ig.test(odb.isMerge) && fileInfo.length > 1){
+            var err = mergeJob({odb:odb,job:job,fileInfo:fileInfo,delSameJob:useCfg.delSameJob})
+            if(err){throw err}
+        } else {
+            var jobInfo = fileInfo.filter(function(v){return v.baseName == job})[0]
+            if(jobInfo.length==0){throw "file error"}
+            var err = importJob({name:job,db:odb.db,path:jobInfo.path},useCfg.delSameJob)
+            if(err){throw err}
+		}
+		input_ok = true
+	}
+	// 分支  导入Gerber
+	if(pathInfo.type == "Gerber"){
+		var gerber = useCfg.Gerber
+		// 如果要修改文件
+		if(gerber.editFile && gerber.editFile.length){
+			// 将文件拷贝一份到_tmp
+			var tmpDir = path + "/" + job + "_tmp"
+			if(!fs.exists(tmpDir)){fs.mkdir(tmpDir)}
+			var srcFiles = []
+			pathInfo.files.forEach(function(v){
+				srcFiles.push(v)
+				fs.copyFile(v.path,tmpDir + "/" + v.name,true)
+			})
+			jobPath = tmpDir
+			pathInfo.files = fs.listDir(tmpDir,1)
+			// 配置操作
+			gerber.editFile.forEach(function(item){
+				var filter = item.filter
+				var fn = eval(item.callback)
+				pathInfo.files.forEach(function(file){
+					var reg = new RegExp(file.suffix, "ig")
+					if(reg.test(filter)){
+						fn.call({},{fs: fs, nowFile: file, srcFiles: srcFiles})
+					}
+				})
+			})
+		}
+		var fileInfo = getFileInfo({inputConfig:gerber, path:jobPath, files:pathInfo.files}) // 获取导入文件信息
+		// 导入gerber数据
+		importGerber({job:job,step:step,gerber:gerber,fileInfo:fileInfo})
+		input_ok = true
+	}
+
+	if(!input_ok){throw "input failed"}
+	// end
+	if(/^yes$/ig.test(useCfg.isDelComp)){  // 删除comp层
+		var matrix = GEN.getMatrix({job:job}); 
+		comp = Object.keys(matrix).filter(function(v){
+			return /^comp_\+_/ig.test(v)
+		})
+		if (comp.length > 0){
+			var tmp = GEN.getStepList({job:job})
+			GEN.openStep({job:job,name:tmp[0]})
+			GEN.COM("delete_comp")
+			GEN.closeStep()
+		}
+	}
+	if(/^yes$/ig.test(useCfg.autoSave)){  // 自动保存
+		GEN.checkInout({job:job,mode:"out"})
+		GEN.saveJob({ job: job });
+	}
+	GEN.checkInout({job:job,mode:"in"})
+	GEN.closeJob({job:job})
+	
+    return 'Done';
+}
+catch (error) {
+	IKM.msg(error)
+    return 'Error';
+}
+
+function addDefaultCfg(def, use) {
+    for (var key in def) {
+        var val = def[key]
+        if (typeof val == "string" && !use.hasOwnProperty(key)) {
+            use[key] = val
+        } else if (typeof val == "object" && use.hasOwnProperty(key)) {
+            if (!use[key].hasOwnProperty("db")) {
+                use[key].db = val.db
+            }
+            if (!use[key].hasOwnProperty("files")) {
+                use[key].files = val.files
+            }
+        }
+        if (key == "Gerber" && use.hasOwnProperty(key)) {
+            for (var gkey in val.format) {
+                if (!use[key].hasOwnProperty("format")) {
+                    use[key].format = val.format
+                } else if (!use[key].format.hasOwnProperty(gkey)) {
+                    use[key].format[gkey] = val.format[gkey]
+                }
+            }
+		}
+		if (key == "ODB" && !use.hasOwnProperty(key)){ use.ODB = val }
+    }
+}
+function changeCfg(useCfg,cfgType){
+	for(var key in cfgType){
+		var value = cfgType[key]
+		if(key == "Gerber"){
+			changeCfg(useCfg.Gerber, cfgType.Gerber)
+		} else {
+			useCfg[key] = value
+		}
+	}
+}
+function delSameJob(props){
+    var job = props.job
+    var delSame = props.delSame
+    if(GEN.isJobExists({job:job})){   
+        if(/^yes$/ig.test(delSame)){
+            if(GEN.isJobOpen({job:job})){ GEN.closeJob({job:job}) }
+            GEN.deleteJob({job:job})
+        } else {
+            return "job "+ job+ " exist"
+        }
+    }
+}
+function getPathInfo(props){
+	var path = props.path
+	var cfg = props.cfg
+	var res = {}
+	res.files = fs.listDir(path)
+	res.fileSuffix = res.files.reduce(function(a,b){
+		if(b.isFile && a.indexOf(b.suffix)<0){
+			a.push(b.suffix)
+		}
+		return a
+	},[])
+	if(cfg.Gerber){
+		res.type = cfg.Gerber.files.reduce(function(a,b){
+			if(res.fileSuffix.indexOf(b) >= 0){
+				a = true
+			}
+			return a 
+		}, false)? "Gerber" : undefined
+	}
+	if(cfg.ODB){
+		res.type = cfg.ODB.files.reduce(function(a,b){
+			if(res.fileSuffix.indexOf(b) < 0){
+				a = false
+			}
+			return a 
+		}, true)? "ODB" : res.type
+	}
+	return res
+}
+function getFileInfo(props){
+	var inputConfig = props.inputConfig, path = props.path, files = props.files
+	var fileInfo = files.reduce(function(a,b){
+		if(inputConfig.files.indexOf(b.suffix)>=0){
+			a.push({
+				name:b.name,
+				baseName: b.baseName,
+				completeBaseName: b.completeBaseName,
+				completeSuffix: b.completeSuffix,
+				path: b.path,
+				suffix: b.suffix
+			})
+		}
+		return a
+	},[])
+	return fileInfo
+}
+
+function importJob(props,delSameJob){
+    var name = props.name
+    if (GEN.isJobExists({ job: name })) {
+        if (/^yes$/ig.test(delSameJob)) {
+            if(GEN.isJobOpen({ job: name })){ GEN.closeJob({ job: name }); }
+            GEN.deleteJob({ job: name });
+        }
+        else {
+            return "job "+name+" exist";
+        }
+    }
+    GEN.importJob(props);
+}
+
+function mergeJob(props){
+    var odb = props.odb
+    var job = props.job
+    var fileInfo = props.fileInfo
+    var arrJobName = odb.jobNameRule.replace("(job)", job)
+    var jobInfo = fileInfo.filter(function(v){return v.baseName == job})[0]
+    var arrJobInfo = fileInfo.filter(function(v){return v.baseName == arrJobName})[0]
+    if(!jobInfo){ return "file error" }
+    if(!arrJobInfo){ return "file error" }
+    var jobInfos = [jobInfo, arrJobInfo]
+    for(var i = 0;i<jobInfos.length;i++){
+        var err = importJob({name:jobInfos[i].baseName,db:odb.db,path:jobInfos[i].path},props.delSameJob)
+        if(err){return err}
+    }
+    // 合并操作
+    jobInfos.forEach(function(v){GEN.openJob({job:v.baseName})})
+    GEN.copyStep({
+        source_job:arrJobInfo.baseName,
+        source_name:odb.arrStep,
+        dest_job:jobInfo.baseName,
+        dest_name:odb.arrStep,
+    });
+    GEN.closeJob({ job: arrJobInfo.baseName });
+    GEN.deleteJob({ job: arrJobInfo.baseName });
+}
+function importGerber(props){
+	var fileInfo = props.fileInfo
+	var gerber = props.gerber
+	var job = props.job
+	var step = props.step
+	var gerberFiles = fileInfo.filter(function(file){return gerber.gerberConfig.hasOwnProperty(file.suffix)})
+	var gerberInfo = gerberFiles.map(function(item){
+		var gerberConfig = gerber.gerberConfig[item.suffix] || {}
+		var gerberItem = {
+			layer: item.name.toLowerCase(), path: item.path,
+			format: gerber.format[item.suffix] || "Excellon2",
+			job:job,step:step
+		}
+		for (var key in gerberConfig) {
+			gerberItem[key] = gerberConfig[key]
+		}
+		return gerberItem
+	})
+	// 创建料号和step
+	GEN.createJob({name:job,db:gerber.db})
+	GEN.createStep({job:job,name:step})
+	// 分析geber配置
+	GEN.COM("input_manual_reset")
+	gerberInfo.forEach(function(v){
+	    GEN.COM("input_manual_set",v)
+	})
+	GEN.COM("input_manual")
+}
+
diff --git a/test/ATS_AIM_input_data.js b/test/ATS_AIM_input_data.js
index e071d9f..8eb778c 100644
--- a/test/ATS_AIM_input_data.js
+++ b/test/ATS_AIM_input_data.js
@@ -1,44 +1,3 @@
-/*
-    NAME: 
-    DESCRIPTION: 导入gerber数据
-    PARAMETER:
-	[
-		{
-			name : 'customer',
-			title : 'CUSTOMER 名',
-			type : 'LineEdit',
-			property : {tool_tip : '客户名称'}
-        },
-        {
-            name : 'job_name',
-			title : '料号名',
-			type : 'LineEdit',
-			property : {tool_tip : '料号名'}
-        },
-        {
-            name : 'path',
-			title : '资料路径',
-			type : 'LineEdit',
-			property : {tool_tip : '客户资料所在路径'}
-        }
-    ]
-
-    VERSION_HISTORY:
-	V1.00 2020 3-30 Scott
-	
-    HELP:
-	<html><body bgcolor="#DDECFE">
-		<font size="3" color="#003DB2"><p>功能简介</p></font>
-		  <p> 导入gerber数据</p>
-		  <br>
-		<font size="3" color="#003DB2"><p>参数配置</p></font>
-		 <p> 导入gerber数据的规则 </p>
-		<font size="3" color="#003DB2"><p>注意事项</p></font>
-		  <p> ● 无 </p>
-		  <br>
-	</body></html>	
-*/
-
 // 引入模块 包
 var $ = require('topcam.scriptfunc').argv();
 var fs = require('fs');
@@ -47,161 +6,114 @@ var IKM = $.ikm;
 var GEN = $.gen;
 var GUI = $.gui;
 var Job = $.job;
+var JobId = $.job_id;
     
 try {
-    // 获取脚本参数
-	var par = $.par;
-
-	// !!! tmp
-	par = {
-		customer: "ats",
-		job_name: "1",
-		path: "C:/Users/Alan/Desktop/Customer_1"
+	var config = require("../config1.js")   // 读取配置文件
+	var cfg = IKM.select_value({table:'pub_conf',field:'text_data',where:{path : 'cam/input_data'}})    
+	var par = {    // todo 通过某种方式拿到料号和客户名
+		job:"11",
+		customer: "New_data"
 	}
-
-    var parParams = ["customer", "job_name", "path"]; // par应该有的属性
-    var isParExist = parParams.reduce(function (a, b) {
-        if (!par.hasOwnProperty(b)) {
-            a = false;
-        }
-        else if (par[b] == "") {
-            switch (b) {
-                case "job_name":
-                    par.job_name = Job;
-                    break;
-            }
-        }
-        return a;
-    }, true);
-    if(!isParExist){throw "par error"} // 如果par没有parParams里的属性 就退出
-
-	var cfg = JSON.parse(IKM.select_value({table:'pub_conf',field:'json_data',where:{path : 'cam/input_data'}}));  // 读取配置文件
-	var customer = par.customer.split("_")[0].toLowerCase()
-	var useCfg = cfg[customer];
-	addDefaultCfg(cfg.def, useCfg) // 添加默认配置
-	if(customer != par.customer.toLowerCase()){
-		var cfgType =  cfg[par.customer.toLowerCase()]
-		if(cfgType){ changeCfg(useCfg, cfgType) }
-	}
-    var job = par.job_name, path = par.path || useCfg.path, step = useCfg.step, err
-    err = delSameJob({job:job, delSame:useCfg.delSameJob});  if(err){throw err}
-	// 判断导入方式 处理path
-	var jobPath = path + "/" + job
-	if(!fs.exists(jobPath)){throw "path error"}
-	var pathInfo = getPathInfo({path:jobPath, cfg: useCfg})  // 分析path下的文件
-	if(!pathInfo.type){throw "file error"}   // pathInfo.type    "ODB"  or  "Gerber"
-	var input_ok = false   // 判断是不是导入成功
-	// 分支  导入ODB
-	if(pathInfo.type == "ODB"){
-		var odb = useCfg.ODB
-		var fileInfo = getFileInfo({inputConfig:odb, path:jobPath, files:pathInfo.files}) // 获取导入文件信息
-		if(/^yes$/ig.test(odb.isMerge) && fileInfo.length > 1){
-            var err = mergeJob({odb:odb,job:job,fileInfo:fileInfo,delSameJob:useCfg.delSameJob})
-            if(err){throw err}
-        } else {
-            var jobInfo = fileInfo.filter(function(v){return v.baseName == job})[0]
-            if(jobInfo.length==0){throw "file error"}
-            var err = importJob({name:job,db:odb.db,path:jobInfo.path},useCfg.delSameJob)
-            if(err){throw err}
-		}
-		input_ok = true
+	IKM.msg($.par)
+	throw "end"
+	// var config = eval(cfg)
+	var job = par.job.toLowerCase();
+	// 如果genesis已经存在这个料号
+	err = delSameJob({job:job,delSame:config.delSameJob}); if(err){throw err};
+	var custCfg = config.customer[par.customer]
+	if(!custCfg){throw "config error"}
+	var step = custCfg.step.toLowerCase()
+	// 获取路径下文件信息
+	var pathInfo = fs.listDir(custCfg.path, 1)
+	// 判断存不存在料号文件
+	var jobFile = pathInfo.filter(function(v){return v.baseName.toLowerCase() == job})
+	if(jobFile.length == 0){throw "job file is not exist"}
+	var jobFiles = []  // 记录要分析的文件
+	if (!jobFile[0].isDir) {
+		jobFiles.push(jobFile[0])
+	} else {
+		jobFiles = fs.listDir(jobFile[0].path)
 	}
-	// 分支  导入Gerber
-	if(pathInfo.type == "Gerber"){
-		var gerber = useCfg.Gerber
-		// 如果要修改文件
-		if(gerber.editFile && gerber.editFile.length){
-			// 将文件拷贝一份到_tmp
-			var tmpDir = path + "/" + job + "_tmp"
-			if(!fs.exists(tmpDir)){fs.mkdir(tmpDir)}
-			var srcFiles = []
-			pathInfo.files.forEach(function(v){
-				srcFiles.push(v)
-				fs.copyFile(v.path,tmpDir + "/" + v.name,true)
-			})
-			jobPath = tmpDir
-			pathInfo.files = fs.listDir(tmpDir,1)
-			// 配置操作
-			gerber.editFile.forEach(function(item){
-				var filter = item.filter
-				var fn = eval(item.callback)
-				pathInfo.files.forEach(function(file){
-					var reg = new RegExp(file.suffix, "ig")
-					if(reg.test(filter)){
-						fn.call({},{fs: fs, nowFile: file, srcFiles: srcFiles})
-					}
-				})
+	// 分析料号文件 得到料号导入信息 导入类型
+	var jobInfo = analyJobFiles({jobFiles:jobFiles.filter(function(v){return v.isFile}),custCfg:custCfg,config:config,job:job })
+	if(jobInfo.data.length == 0){throw "file error"}
+	var importOk = false;  // 是否成功导入
+	if(/odb/ig.test(jobInfo.type)){  // odb导入
+		if(jobInfo.data.length == 1){  // 只分析到一个tgz文件 直接导入
+			var err = importJob({name:job,db:custCfg.db,path:jobInfo.data[0].file.path},config.delSameJob)
+			if(err){throw err}
+		} else {  // 多个tgz文件 说明需要合并
+			var mergeFiles = jobInfo.data.filter(function(item){
+				var err = importJob({name:item.file.baseName,db:custCfg.db,path:item.file.path},config.delSameJob)
+				if(err){throw err}
+				return /yes/ig.test(item.format.isMerge)
 			})
+			var arr_job = mergeFiles[0]
+			var arr_step;
+			var steplist = GEN.getStepList({job:arr_job})
+			if(steplist.indexOf(arr_job.format.arrStep) < 0){
+				arr_step = steplist[0]
+			}else{arr_step = arr_job.format.arrStep}
+			GEN.openJob({job:job});
+			GEN.openJob({job:arr_job.file.baseName});
+			GEN.copyStep({  // 合并
+				source_job:arr_job.file.baseName,
+				source_name:arr_step,
+				dest_job:job,
+				dest_name:arr_step,
+			});
+			GEN.closeJob({ job: arr_job.file.baseName });
+			GEN.deleteJob({ job: arr_job.file.baseName });  // 合并后 删除array的料号
 		}
-		var fileInfo = getFileInfo({inputConfig:gerber, path:jobPath, files:pathInfo.files}) // 获取导入文件信息
-		// 导入gerber数据
-		importGerber({job:job,step:step,gerber:gerber,fileInfo:fileInfo})
-		input_ok = true
+		importOk = true
 	}
 
-	if(!input_ok){throw "input failed"}
-	// end
-	if(/^yes$/ig.test(useCfg.isDelComp)){  // 删除comp层
-		var matrix = GEN.getMatrix({job:job}); 
-		comp = Object.keys(matrix).filter(function(v){
-			return /^comp_\+_/ig.test(v)
+	if(/gerber/ig.test(jobInfo.type)){  // gerber导入
+		GEN.createJob({name:job,db:custCfg.db})
+		GEN.createStep({job:job,name:step})
+		var gerberInfo = jobInfo.data.map(function(item){
+			var gerberCfg = JSON.parse(JSON.stringify(item.format));
+			var file = item.file
+			gerberCfg.layer = file.name.toLowerCase()
+			gerberCfg.path = file.path
+			gerberCfg.format = item.type
+			gerberCfg.job = job
+			gerberCfg.step = step
+			return gerberCfg
 		})
-		if (comp.length > 0){
-			var tmp = GEN.getStepList({job:job})
-			GEN.openStep({job:job,name:tmp[0]})
-			GEN.COM("delete_comp")
-			GEN.closeStep()
-		}
+		GEN.COM("input_manual_reset")
+		gerberInfo.forEach(function(v){
+			GEN.COM("input_manual_set",v)
+		})
+		GEN.COM("input_manual")
+		importOk = true
 	}
-	if(/^yes$/ig.test(useCfg.autoSave)){  // 自动保存
-		GEN.checkInout({job:job,mode:"out"})
-		GEN.saveJob({ job: job });
+
+	if(!importOk){throw "import error"}
+	// 导入结束
+	var matrix = GEN.getMatrix({job:job}); 
+	comp = Object.keys(matrix).filter(function(v){  // 如果有comp层 删除
+		return /^comp_\+_/ig.test(v)
+	})
+	if (comp.length > 0){
+		var tmp = GEN.getStepList({job:job})
+		GEN.openStep({job:job,name:tmp[0]})
+		GEN.COM("delete_comp")
+		GEN.closeStep()
 	}
+
+	GEN.checkInout({job:job,mode:"out"})  // 结束保存料号 关闭料号
+	GEN.saveJob({ job: job });
 	GEN.checkInout({job:job,mode:"in"})
 	GEN.closeJob({job:job})
-	
+
     return 'Done';
 }
 catch (error) {
-	IKM.msg(error)
+	GUI.msg(error)
     return 'Error';
 }
-
-function addDefaultCfg(def, use) {
-    for (var key in def) {
-        var val = def[key]
-        if (typeof val == "string" && !use.hasOwnProperty(key)) {
-            use[key] = val
-        } else if (typeof val == "object" && use.hasOwnProperty(key)) {
-            if (!use[key].hasOwnProperty("db")) {
-                use[key].db = val.db
-            }
-            if (!use[key].hasOwnProperty("files")) {
-                use[key].files = val.files
-            }
-        }
-        if (key == "Gerber" && use.hasOwnProperty(key)) {
-            for (var gkey in val.format) {
-                if (!use[key].hasOwnProperty("format")) {
-                    use[key].format = val.format
-                } else if (!use[key].format.hasOwnProperty(gkey)) {
-                    use[key].format[gkey] = val.format[gkey]
-                }
-            }
-		}
-		if (key == "ODB" && !use.hasOwnProperty(key)){ use.ODB = val }
-    }
-}
-function changeCfg(useCfg,cfgType){
-	for(var key in cfgType){
-		var value = cfgType[key]
-		if(key == "Gerber"){
-			changeCfg(useCfg.Gerber, cfgType.Gerber)
-		} else {
-			useCfg[key] = value
-		}
-	}
-}
 function delSameJob(props){
     var job = props.job
     var delSame = props.delSame
@@ -214,53 +126,60 @@ function delSameJob(props){
         }
     }
 }
-function getPathInfo(props){
-	var path = props.path
-	var cfg = props.cfg
-	var res = {}
-	res.files = fs.listDir(path)
-	res.fileSuffix = res.files.reduce(function(a,b){
-		if(b.isFile && a.indexOf(b.suffix)<0){
-			a.push(b.suffix)
-		}
-		return a
-	},[])
-	if(cfg.Gerber){
-		res.type = cfg.Gerber.files.reduce(function(a,b){
-			if(res.fileSuffix.indexOf(b) >= 0){
-				a = true
-			}
-			return a 
-		}, false)? "Gerber" : undefined
-	}
-	if(cfg.ODB){
-		res.type = cfg.ODB.files.reduce(function(a,b){
-			if(res.fileSuffix.indexOf(b) < 0){
-				a = false
-			}
-			return a 
-		}, true)? "ODB" : res.type
-	}
-	return res
-}
-function getFileInfo(props){
-	var inputConfig = props.inputConfig, path = props.path, files = props.files
-	var fileInfo = files.reduce(function(a,b){
-		if(inputConfig.files.indexOf(b.suffix)>=0){
-			a.push({
-				name:b.name,
-				baseName: b.baseName,
-				completeBaseName: b.completeBaseName,
-				completeSuffix: b.completeSuffix,
-				path: b.path,
-				suffix: b.suffix
+function analyJobFiles(props){
+	var files = props.jobFiles;
+	var config = props.config;
+	var job = props.job;
+	var custCfg = props.custCfg;
+	var rules = custCfg.rules;
+	var paramsFile = files.filter(function(file){return /param/ig.test(file.baseName)})
+	var tmp_hash = {}
+	paramsFile.forEach(function(file){
+		tmp_hash[file.baseName] = (function(){
+			var tmparr = fs.readFile(file.path).split("\n")
+			var tmp = {}
+			tmparr.map(function(v){
+				var arr = v.split(/\b\s+\b/)
+				tmp[arr[0].replace(/-/ig,"_")] = arr[1]
+			})
+			return tmp
+		})() 
+	})
+	
+	var fileInfo = files.reduce(function(a,file){
+		try {
+			rules.forEach(function(item){
+				if(item.valid({file:file, job:job})){
+					var format = config.formats[item.format]
+					var format1;
+					if(item.format_params){
+						format1 = item.format_params({params:tmp_hash})
+					}
+					if(format1){
+						throw {file:file,type:item.type,format:format1}
+					}else{
+						throw {file:file,type:item.type,format:format}
+					}
+				}
 			})
+		} catch (info) { 
+			a.push(info)
 		}
 		return a
 	},[])
-	return fileInfo
+	var odbfiles = fileInfo.filter(function(item){return /odb/ig.test(item.type)})
+	if(odbfiles.length == 0){
+		return {
+			type: "Gerber",
+			data: fileInfo
+		}
+	} else {
+		return {
+			type: "ODB",
+			data: odbfiles
+		}
+	}
 }
-
 function importJob(props,delSameJob){
     var name = props.name
     if (GEN.isJobExists({ job: name })) {
@@ -275,57 +194,4 @@ function importJob(props,delSameJob){
     GEN.importJob(props);
 }
 
-function mergeJob(props){
-    var odb = props.odb
-    var job = props.job
-    var fileInfo = props.fileInfo
-    var arrJobName = odb.jobNameRule.replace("(job)", job)
-    var jobInfo = fileInfo.filter(function(v){return v.baseName == job})[0]
-    var arrJobInfo = fileInfo.filter(function(v){return v.baseName == arrJobName})[0]
-    if(!jobInfo){ return "file error" }
-    if(!arrJobInfo){ return "file error" }
-    var jobInfos = [jobInfo, arrJobInfo]
-    for(var i = 0;i<jobInfos.length;i++){
-        var err = importJob({name:jobInfos[i].baseName,db:odb.db,path:jobInfos[i].path},props.delSameJob)
-        if(err){return err}
-    }
-    // 合并操作
-    jobInfos.forEach(function(v){GEN.openJob({job:v.baseName})})
-    GEN.copyStep({
-        source_job:arrJobInfo.baseName,
-        source_name:odb.arrStep,
-        dest_job:jobInfo.baseName,
-        dest_name:odb.arrStep,
-    });
-    GEN.closeJob({ job: arrJobInfo.baseName });
-    GEN.deleteJob({ job: arrJobInfo.baseName });
-}
-function importGerber(props){
-	var fileInfo = props.fileInfo
-	var gerber = props.gerber
-	var job = props.job
-	var step = props.step
-	var gerberFiles = fileInfo.filter(function(file){return gerber.gerberConfig.hasOwnProperty(file.suffix)})
-	var gerberInfo = gerberFiles.map(function(item){
-		var gerberConfig = gerber.gerberConfig[item.suffix] || {}
-		var gerberItem = {
-			layer: item.name.toLowerCase(), path: item.path,
-			format: gerber.format[item.suffix] || "Excellon2",
-			job:job,step:step
-		}
-		for (var key in gerberConfig) {
-			gerberItem[key] = gerberConfig[key]
-		}
-		return gerberItem
-	})
-	// 创建料号和step
-	GEN.createJob({name:job,db:gerber.db})
-	GEN.createStep({job:job,name:step})
-	// 分析geber配置
-	GEN.COM("input_manual_reset")
-	gerberInfo.forEach(function(v){
-	    GEN.COM("input_manual_set",v)
-	})
-	GEN.COM("input_manual")
-}
 
diff --git a/test/ATS_AIM_input_data_v3_0.js b/test/ATS_AIM_input_data_v3_0.js
index 53666db..6760d8f 100644
--- a/test/ATS_AIM_input_data_v3_0.js
+++ b/test/ATS_AIM_input_data_v3_0.js
@@ -1,3 +1,4 @@
+
 // 引入模块 包
 var $ = require('topcam.scriptfunc').argv();
 var fs = require('fs');
@@ -7,22 +8,28 @@ var GEN = $.gen;
 var GUI = $.gui;
 var Job = $.job;
 var JobId = $.job_id;
-    
+var Status = 'ok';
+var resultData = [];
 try {
-	var config = require("../config.js")   // 读取配置文件
-	var cfg = IKM.select_value({table:'pub_conf',field:'text_data',where:{path : 'cam/input_data'}})    
-	var par = {    // todo
-		job:"I6",
-		customer: "Customer_2"
+	// var config = require("../config.js")   // 读取配置文件 config
+	var cfg = IKM.select_value({table:'pub_conf',field:'text_data',where:{path : 'cam/input_data'}})  // 拿到框架中的系统配置
+	if (!cfg || cfg == ""){throw "cfg can not find"}  
+	var par = {    // ??? 通过某种方式拿到料号和客户名
+		job:"i4",
+		customer: "Customer_2"   // Customer_1 || Customer_2 || New_data
 	}
-	// var config = eval(cfg)
-	var job = par.job.toLowerCase();
+	var config = eval(cfg)
+	var job = par.job || Job;
+    if(_.isEmpty(job)) throw "没有传入料号名!";
+	job = job.toLowerCase()
 	// 如果genesis已经存在这个料号
 	err = delSameJob({job:job,delSame:config.delSameJob}); if(err){throw err};
 	var custCfg = config.customer[par.customer]
+	if(!custCfg){throw "config error"}
 	var step = custCfg.step.toLowerCase()
 	// 获取路径下文件信息
-	var pathInfo = fs.listDir(custCfg.path, 1)
+	var path = par.path || custCfg.path
+	var pathInfo = fs.listDir(path, 1)
 	// 判断存不存在料号文件
 	var jobFile = pathInfo.filter(function(v){return v.baseName.toLowerCase() == job})
 	if(jobFile.length == 0){throw "job file is not exist"}
@@ -32,30 +39,37 @@ try {
 	} else {
 		jobFiles = fs.listDir(jobFile[0].path)
 	}
+	// 分析料号文件 得到料号导入信息 导入类型
 	var jobInfo = analyJobFiles({jobFiles:jobFiles.filter(function(v){return v.isFile}),custCfg:custCfg,config:config,job:job })
-	var importOk = false;
+	// IKM.msg(jobInfo.data.map(function(v){return v.format}))
+	if(jobInfo.data.length == 0){throw "file error"}
+	var importOk = false;  // 是否成功导入
 	if(/odb/ig.test(jobInfo.type)){  // odb导入
-		if(jobInfo.data.length == 0){throw "file error"}
-		if(jobInfo.data.length == 1){
+		if(jobInfo.data.length == 1){  // 只分析到一个tgz文件 直接导入
 			var err = importJob({name:job,db:custCfg.db,path:jobInfo.data[0].file.path},config.delSameJob)
-				if(err){throw err}
-		} else {
+			if(err){throw err}
+		} else {  // 多个tgz文件 说明需要合并
 			var mergeFiles = jobInfo.data.filter(function(item){
 				var err = importJob({name:item.file.baseName,db:custCfg.db,path:item.file.path},config.delSameJob)
 				if(err){throw err}
 				return /yes/ig.test(item.format.isMerge)
 			})
 			var arr_job = mergeFiles[0]
+			var arr_step;
+			var steplist = GEN.getStepList({job:arr_job.file.baseName})
+			if(steplist.indexOf(arr_job.format.arrStep) < 0){
+				arr_step = steplist[0]
+			}else{arr_step = arr_job.format.arrStep}
 			GEN.openJob({job:job});
 			GEN.openJob({job:arr_job.file.baseName});
-			GEN.copyStep({
+			GEN.copyStep({  // 合并
 				source_job:arr_job.file.baseName,
-				source_name:arr_job.format.arrStep,
+				source_name:arr_step,
 				dest_job:job,
-				dest_name:arr_job.format.arrStep,
+				dest_name:arr_step,
 			});
 			GEN.closeJob({ job: arr_job.file.baseName });
-			GEN.deleteJob({ job: arr_job.file.baseName });
+			GEN.deleteJob({ job: arr_job.file.baseName });  // 合并后 删除array的料号
 		}
 		importOk = true
 	}
@@ -80,10 +94,12 @@ try {
 		GEN.COM("input_manual")
 		importOk = true
 	}
+
 	if(!importOk){throw "import error"}
 
+	// 导入结束
 	var matrix = GEN.getMatrix({job:job}); 
-	comp = Object.keys(matrix).filter(function(v){
+	comp = Object.keys(matrix).filter(function(v){  // 如果有comp层 删除
 		return /^comp_\+_/ig.test(v)
 	})
 	if (comp.length > 0){
@@ -92,10 +108,12 @@ try {
 		GEN.COM("delete_comp")
 		GEN.closeStep()
 	}
-	GEN.checkInout({job:job,mode:"out"})  // 自动保存
-	GEN.saveJob({ job: job });
-	GEN.checkInout({job:job,mode:"in"})
-	GEN.closeJob({job:job})
+
+	// !!!! tmp
+	// GEN.checkInout({job:job,mode:"out"})  // 结束保存料号 关闭料号
+	// GEN.saveJob({ job: job });
+	// GEN.checkInout({job:job,mode:"in"})
+	// GEN.closeJob({job:job})
 
     return 'Done';
 }
@@ -169,7 +187,6 @@ function analyJobFiles(props){
 		}
 	}
 }
-
 function importJob(props,delSameJob){
     var name = props.name
     if (GEN.isJobExists({ job: name })) {
diff --git a/test/ATS_AIM_layer_rename_v_2_0.js b/test/ATS_AIM_layer_rename_v_2_0.js
index 8a70842..71c1d7a 100644
--- a/test/ATS_AIM_layer_rename_v_2_0.js
+++ b/test/ATS_AIM_layer_rename_v_2_0.js
@@ -46,26 +46,33 @@ try {
     var mode = "develop" // develop
 	var config = require("../config.js")   // 读取配置文件
 	var par = {    // todo
-		job:"I3",
+		job:"i4",
 		customer: "Customer_2"
 	}
-	var job = par.job.toLowerCase();   // 获取料号
+	var job = par.job || Job;
+    if(_.isEmpty(job)) throw "没有传入料号名!";
+	job = job.toLowerCase()
 	var custCfg = config.customer[par.customer]	// 获取客户配置
 	var step = custCfg.step.toLowerCase()	// 获取pcs_step
-
 	// 料号验证
     if(!GEN.isJobExists({job:job})){ throw "job "+ job+ " is not exist" }
     if(!GEN.isJobOpen({job:job})){GEN.openJob({job:job})}
     if(GEN.checkInout({job:job,mode:"test"}) != 0 && mode != "develop"){ throw "the job check" }
-    GEN.checkInout({job:job,mode:"out"});
-		
+	GEN.checkInout({job:job,mode:"out"});
+
+	// if(config.hasOwnProperty("merge_drill")){ // todo
+	// 	mergeDrill({job:job})
+	// }
 	// start    martix_tl_name
 	var matrix = GEN.getMatrix({job:job})
 	var tl_name_matrix = tlNameMatrix({matrix:matrix,tl_name:custCfg.tl_name})   // 给matrix信息添加tl_name
-	// tl_name_matrix.forEach(function(item){
-	// 	IKM.add({name:item.name, tl_name:item.tl_name})
-	// })
-	// IKM.add("",1)
+
+
+
+	tl_name_matrix.forEach(function(item){  // * 调试
+		IKM.add({name:item.name, tl_name:item.tl_name})
+	})
+	IKM.add("",1)
 
 	var format_cfg = config.data_format   // 拿到数据标准化配置
 
@@ -81,7 +88,6 @@ try {
 	err = reName({job:job, matrix:after_sort_matrix, cfg:format_cfg})
 	if(err){throw err}
 
-
     return 'Done';
 }
 catch (error) {
@@ -104,9 +110,9 @@ function tlNameMatrix(props){  // 设置标准名
 			})
 		}
 	})
-	IKM.msg(tlname_rules)
-	var res = Object.keys(matrix).map(function(key){
+	var res = Object.keys(matrix).map(function(key){  // 将matrix信息添加tl_name 如果没有tl_name 就返回原信息
 		var val = matrix[key]
+		if(val.hasOwnProperty("tl_name")){delete val.tl_name}
 		var tlRule = tlname_rules.filter(function(rule){
 			if(rule.orig_name === key){return true}
 			var reg = new RegExp(rule.orig_name,"ig")
@@ -211,24 +217,24 @@ function sortLayer(props){  // 排序方法  {job:要排序的料号, rule: {要
 function setDrill(props){   // 设置钻孔
     var job = props.job
 	var matrix = props.matrix
+	
     // 获取所有的钻孔层
     var drillLayer =matrix.filter(function(v){
-        return v.attr.type == "drill" && v.attr.context == "board"
+        return (v.attr.type == "drill" || v.attr.type == "rout") && v.attr.context == "board"
     })
     // 获取所有single层
     var signalLayer =matrix.filter(function(v){
         return v.attr.type == "signal" && v.attr.context == "board"
 	})
-
 	var layerCount = GEN.getLayerCount({job:job})
     // findSignal 根据传入的数字找到对应的signal层 如 1 => top ; 2 => layer_2 
     function findSignal(num){
         return signalLayer[Number(num-1)].name
-    }
+	}
     function doDrill(drills){  // 分析钻孔层
         return drills.map(function(v){
-            if(v == "drill" || v=="rout"){
-                return {start:findSignal[1], end:findSignal[layerCount], layer:v.name}
+            if(v.name == "drill" || v.name=="rout"){
+                return {start:findSignal(1), end:findSignal(layerCount), layer:v.name}
             } else {
                 var tmp = /(\d+)-(\d+)/ig.exec(v.tl_name);
                 if(tmp){
@@ -241,7 +247,7 @@ function setDrill(props){   // 设置钻孔
             }
         })
     }
-    var drillSetList = doDrill(drillLayer);   // 分析得到钻孔设置结果
+	var drillSetList = doDrill(drillLayer);   // 分析得到钻孔设置结果
 	drillSetList = drillSetList.filter(function(v){return v!==0})
     drillSetList.forEach(function(v){
         GEN.matrixLayerDrill({job:job,layer:v.layer,start:v.start ,end:v.end})
@@ -309,7 +315,7 @@ function mergeDrill(props){ // 合并钻孔
     var step = GEN.getStepList({job:job})[0];
     var maxDrill = {name:"",value:0};
     function getDrl(str){
-        var num = /(\d+)-(\d+)/ig.exec(str);  // 匹配出 num-num
+        var num = /(\d+)-(\d+)\.drl/ig.exec(str);  // 匹配出 num-num
         var tmp = [];
         for(var i = Number(num[1]);i<num[2];i++){
             if(i == 1){
@@ -323,7 +329,7 @@ function mergeDrill(props){ // 合并钻孔
     GEN.openStep({job : job,name:step});
     for(var key in matrix){
         var val = matrix[key];
-        if(val.layer_type == "drill"){
+        if(val.layer_type == "drill" && /(\d+)-(\d+)\.drl/ig.test(val.name)){
             var mergeTo = getDrl(val.name) // 要合并到的地方
             mergeTo.forEach(function(layerName){
                 if(GEN.isLayerExists({job : job ,layer:layerName.toLowerCase()}) && newdrills.indexOf(layerName.toLowerCase()) < 0){
@@ -338,11 +344,10 @@ function mergeDrill(props){ // 合并钻孔
             })
         }
     }
-    // 合并到maxDrill独立合并
     GEN.createLayer({job:job,layer:"b1-"+maxDrill.value,conext:'board',type:'drill'});
     GEN.workLayer({name:"b1-"+maxDrill.value,display_number:1,clear_before:'yes'});
     GEN.copyLayer({source_job:job ,mode:'append',source_step:step,source_layer:maxDrill.name,dest_layer:"b1-"+maxDrill.value});
-    GEN.affectedLayer({affected:"no",mode:"all"});
+	GEN.affectedLayer({affected:"no",mode:"all"});
+	GEN.clearLayers();
     GEN.closeStep();
-    return this;
 }
diff --git a/test/CAM_Analysis_job.js b/test/CAM_Analysis_job.js
new file mode 100644
index 0000000..2a17569
--- /dev/null
+++ b/test/CAM_Analysis_job.js
@@ -0,0 +1,3 @@
+module.exports = function(){
+    
+}
\ No newline at end of file
diff --git a/test/mytest.js b/test/mytest.js
index 8a70842..6760d8f 100644
--- a/test/mytest.js
+++ b/test/mytest.js
@@ -1,37 +1,3 @@
-/*
-    NAME: 
-    DESCRIPTION: matrix改名和排序
-    PARAMETER:
-	[
-		{
-			name : 'customer',
-			title : 'CUSTOMER 名',
-			type : 'LineEdit',
-			property : {tool_tip : '客户名称'}
-        },
-        {
-            name : 'job_name',
-			title : '料号名',
-			type : 'LineEdit',
-			property : {tool_tip : '料号名'}
-        }
-    ]
-
-    VERSION_HISTORY:
-	V1.00 2020 3-30 Scott
-	
-    HELP:
-	<html><body bgcolor="#DDECFE">
-		<font size="3" color="#003DB2"><p>功能简介</p></font>
-		  <p> matrix改名和排序</p>
-		  <br>
-		<font size="3" color="#003DB2"><p>参数配置</p></font>
-		 <p> matrix改名和排序规则 </p>
-		<font size="3" color="#003DB2"><p>注意事项</p></font>
-		  <p> ● 无 </p>
-		  <br>
-	</body></html>	
-*/
 
 // 引入模块 包
 var $ = require('topcam.scriptfunc').argv();
@@ -41,308 +7,198 @@ var IKM = $.ikm;
 var GEN = $.gen;
 var GUI = $.gui;
 var Job = $.job;
-
+var JobId = $.job_id;
+var Status = 'ok';
+var resultData = [];
 try {
-    var mode = "develop" // develop
-	var config = require("../config.js")   // 读取配置文件
-	var par = {    // todo
-		job:"I3",
-		customer: "Customer_2"
+	// var config = require("../config.js")   // 读取配置文件 config
+	var cfg = IKM.select_value({table:'pub_conf',field:'text_data',where:{path : 'cam/input_data'}})  // 拿到框架中的系统配置
+	if (!cfg || cfg == ""){throw "cfg can not find"}  
+	var par = {    // ??? 通过某种方式拿到料号和客户名
+		job:"i4",
+		customer: "Customer_2"   // Customer_1 || Customer_2 || New_data
+	}
+	var config = eval(cfg)
+	var job = par.job || Job;
+    if(_.isEmpty(job)) throw "没有传入料号名!";
+	job = job.toLowerCase()
+	// 如果genesis已经存在这个料号
+	err = delSameJob({job:job,delSame:config.delSameJob}); if(err){throw err};
+	var custCfg = config.customer[par.customer]
+	if(!custCfg){throw "config error"}
+	var step = custCfg.step.toLowerCase()
+	// 获取路径下文件信息
+	var path = par.path || custCfg.path
+	var pathInfo = fs.listDir(path, 1)
+	// 判断存不存在料号文件
+	var jobFile = pathInfo.filter(function(v){return v.baseName.toLowerCase() == job})
+	if(jobFile.length == 0){throw "job file is not exist"}
+	var jobFiles = []  // 记录要分析的文件
+	if (!jobFile[0].isDir) {
+		jobFiles.push(jobFile[0])
+	} else {
+		jobFiles = fs.listDir(jobFile[0].path)
+	}
+	// 分析料号文件 得到料号导入信息 导入类型
+	var jobInfo = analyJobFiles({jobFiles:jobFiles.filter(function(v){return v.isFile}),custCfg:custCfg,config:config,job:job })
+	// IKM.msg(jobInfo.data.map(function(v){return v.format}))
+	if(jobInfo.data.length == 0){throw "file error"}
+	var importOk = false;  // 是否成功导入
+	if(/odb/ig.test(jobInfo.type)){  // odb导入
+		if(jobInfo.data.length == 1){  // 只分析到一个tgz文件 直接导入
+			var err = importJob({name:job,db:custCfg.db,path:jobInfo.data[0].file.path},config.delSameJob)
+			if(err){throw err}
+		} else {  // 多个tgz文件 说明需要合并
+			var mergeFiles = jobInfo.data.filter(function(item){
+				var err = importJob({name:item.file.baseName,db:custCfg.db,path:item.file.path},config.delSameJob)
+				if(err){throw err}
+				return /yes/ig.test(item.format.isMerge)
+			})
+			var arr_job = mergeFiles[0]
+			var arr_step;
+			var steplist = GEN.getStepList({job:arr_job.file.baseName})
+			if(steplist.indexOf(arr_job.format.arrStep) < 0){
+				arr_step = steplist[0]
+			}else{arr_step = arr_job.format.arrStep}
+			GEN.openJob({job:job});
+			GEN.openJob({job:arr_job.file.baseName});
+			GEN.copyStep({  // 合并
+				source_job:arr_job.file.baseName,
+				source_name:arr_step,
+				dest_job:job,
+				dest_name:arr_step,
+			});
+			GEN.closeJob({ job: arr_job.file.baseName });
+			GEN.deleteJob({ job: arr_job.file.baseName });  // 合并后 删除array的料号
+		}
+		importOk = true
 	}
-	var job = par.job.toLowerCase();   // 获取料号
-	var custCfg = config.customer[par.customer]	// 获取客户配置
-	var step = custCfg.step.toLowerCase()	// 获取pcs_step
 
-	// 料号验证
-    if(!GEN.isJobExists({job:job})){ throw "job "+ job+ " is not exist" }
-    if(!GEN.isJobOpen({job:job})){GEN.openJob({job:job})}
-    if(GEN.checkInout({job:job,mode:"test"}) != 0 && mode != "develop"){ throw "the job check" }
-    GEN.checkInout({job:job,mode:"out"});
-		
-	// start    martix_tl_name
-	var matrix = GEN.getMatrix({job:job})
-	var tl_name_matrix = tlNameMatrix({matrix:matrix,tl_name:custCfg.tl_name})   // 给matrix信息添加tl_name
-	// tl_name_matrix.forEach(function(item){
-	// 	IKM.add({name:item.name, tl_name:item.tl_name})
-	// })
-	// IKM.add("",1)
+	if(/gerber/ig.test(jobInfo.type)){  // gerber导入
+		GEN.createJob({name:job,db:custCfg.db})
+		GEN.createStep({job:job,name:step})
+		var gerberInfo = jobInfo.data.map(function(item){
+			var gerberCfg = JSON.parse(JSON.stringify(item.format));
+			var file = item.file
+			gerberCfg.layer = file.name.toLowerCase()
+			gerberCfg.path = file.path
+			gerberCfg.format = item.type
+			gerberCfg.job = job
+			gerberCfg.step = step
+			return gerberCfg
+		})
+		GEN.COM("input_manual_reset")
+		gerberInfo.forEach(function(v){
+			GEN.COM("input_manual_set",v)
+		})
+		GEN.COM("input_manual")
+		importOk = true
+	}
 
-	var format_cfg = config.data_format   // 拿到数据标准化配置
+	if(!importOk){throw "import error"}
 
-	// 排序和设属性
-	var ret = sortLayer({job:job, rule:format_cfg, matrix:tl_name_matrix})
-	if(ret.err){throw err}
-	var after_sort_matrix = ret.sortNames
-	// 设置钻孔
-	err = setDrill({job:job, matrix:after_sort_matrix})
-	if(err){throw err}
-	
-	// 改名
-	err = reName({job:job, matrix:after_sort_matrix, cfg:format_cfg})
-	if(err){throw err}
+	// 导入结束
+	var matrix = GEN.getMatrix({job:job}); 
+	comp = Object.keys(matrix).filter(function(v){  // 如果有comp层 删除
+		return /^comp_\+_/ig.test(v)
+	})
+	if (comp.length > 0){
+		var tmp = GEN.getStepList({job:job})
+		GEN.openStep({job:job,name:tmp[0]})
+		GEN.COM("delete_comp")
+		GEN.closeStep()
+	}
 
+	// !!!! tmp
+	// GEN.checkInout({job:job,mode:"out"})  // 结束保存料号 关闭料号
+	// GEN.saveJob({ job: job });
+	// GEN.checkInout({job:job,mode:"in"})
+	// GEN.closeJob({job:job})
 
     return 'Done';
 }
 catch (error) {
-    GUI.msg(error);
+	GUI.msg(error)
     return 'Error';
 }
-
-function tlNameMatrix(props){  // 设置标准名
-	var matrix = props.matrix
-	var tlname_rules = []
-	props.tl_name.forEach(function(item){
-		if(typeof item.orig_name == "string"){
-			tlname_rules.push(item)
-		} else {
-			item.orig_name.forEach(function(name2){
-				tlname_rules.push({
-					orig_name: name2,
-					tl_name: item.tl_name
-				})
-			})
-		}
-	})
-	IKM.msg(tlname_rules)
-	var res = Object.keys(matrix).map(function(key){
-		var val = matrix[key]
-		var tlRule = tlname_rules.filter(function(rule){
-			if(rule.orig_name === key){return true}
-			var reg = new RegExp(rule.orig_name,"ig")
-			return reg.test(key)
-		})
-		if(tlRule.length == 0){return val}
-		for(var i=0;i<tlRule.length;i++){
-			if(tlRule[i].orig_name === key){return _.assign(val,{tl_name:tlRule[0].tl_name})}
-		}
-		var reg = new RegExp(tlRule[0].orig_name,"ig")
-		var tmp = reg.exec(key)
-		if(tmp && tmp.length){
-			var replaceArr = tmp.slice(1)
-			var tl_name = tlRule[0].tl_name
-			var params = {}
-			for(var i = 0; i<replaceArr.length;i++){
-				params["$"+(i+1)] = replaceArr[i]
-			}
-			replaceArr.forEach(function(v,i){
-				tl_name = tl_name.replace("($"+(i+1)+")",v)
-			})
-			tl_name = replaceTlName(tl_name)
-			function replaceTlName(name){
-				var tmp = /(\([^)]*\))/ig.exec(name)
-				if(!tmp){ return name }
-				var param_arr = tmp[1].match(/\$\d+/ig)
-				var newname = tmp[1]
-				param_arr.forEach(function(v){
-					newname = newname.replace(new RegExp("\\"+v,"ig"), params[v])
-				})
-				newname = name.replace(tmp[1],eval(newname))
-				return replaceTlName(newname)
-			}
-			return _.assign(val,{tl_name:tl_name})
-		}else {
-			return _.assign(val,{tl_name:tlRule[0].tl_name})
-		}
-	})
-	return res
-}
-
-function sortLayer(props){  // 排序方法  {job:要排序的料号, rule: {要改名的规则}
+function delSameJob(props){
     var job = props.job
-	var matrix =  GEN.getMatrix({job:job})
-	var tl_matrix = props.matrix
-	var matrixName = Object.keys(matrix).sort(function(a,b){return matrix[a].row - matrix[b].row})
-    var matrixFirst = matrixName[0];  // 记录matrix中第一位
-	var sortNames = [];
-    var miscName = tl_matrix.filter(function(value){  // 找出需要排序的名称列表
-		var flag = true;
-		if (!value.tl_name || value.tl_name == ""){return true}
-		var tl_name = value.tl_name
-        props.rule.forEach(function(item,i){
-            var evalReg = "/"+item.tl_name+"/ig.test(tl_name)";
-            if(tl_name == item.tl_name || eval(evalReg)){
-                flag = false;
-                if(tl_name === item.tl_name){
-                    var _item = JSON.parse(JSON.stringify(item));
-					_item.value = i;
-					_item.name = value.name
-					_item.rule = item.tl_name
-                    sortNames.push(_item);
-                } else {
-                    var _item = JSON.parse(JSON.stringify(item));
-                    _item.value = i;
-					var str = "/"+ item.tl_name +"/ig.exec(tl_name)"
-					_item.value2 = eval(str).pop() - 0;
-					_item.name = value.name
-					_item.rule = item.tl_name
-                    _item.tl_name = tl_name;
-                    sortNames.push(_item);
-                }
-            }
-        });
-        return flag;
-	}).map(function(v){return v.name})
-    miscName.forEach(function(n){ 
-        if(matrix[n].context == 'board'){
-            GEN.matrixLayerAttr({job:job,layer:n,context:'misc'}) 
+    var delSame = props.delSame
+    if(GEN.isJobExists({job:job})){   
+        if(/^yes$/ig.test(delSame)){
+            if(GEN.isJobOpen({job:job})){ GEN.closeJob({job:job}) }
+            GEN.deleteJob({job:job})
+        } else {
+            return "job "+ job+ " exist"
         }
-    })
-    sortNames = sortNames.sort(function(a,b){
-        return a.value - b.value || a.value2 - b.value2
-	})
-	// 排序
-    if(sortNames.length){
-        if(sortNames[0].name !== matrixFirst) {  // 如果第一位和matrix中第一位不同,先把第一位插入到最前面
-            GEN.matrixMoveRow({ job:job,layer:sortNames[0].name,before:matrixFirst })
-        }
-        sortNames.forEach(function(v,i,arr){
-            if(i !== 0){
-                GEN.matrixMoveRow({ job:job,layer:v.name,after:arr[i-1].name })             
-            }
-            GEN.matrixLayerAttr(_.assign({job:job,layer:v.name},v.attr));
-        })
-	}
-	return {
-		sortNames:sortNames
-	}
-}
-
-function setDrill(props){   // 设置钻孔
-    var job = props.job
-	var matrix = props.matrix
-    // 获取所有的钻孔层
-    var drillLayer =matrix.filter(function(v){
-        return v.attr.type == "drill" && v.attr.context == "board"
-    })
-    // 获取所有single层
-    var signalLayer =matrix.filter(function(v){
-        return v.attr.type == "signal" && v.attr.context == "board"
-	})
-
-	var layerCount = GEN.getLayerCount({job:job})
-    // findSignal 根据传入的数字找到对应的signal层 如 1 => top ; 2 => layer_2 
-    function findSignal(num){
-        return signalLayer[Number(num-1)].name
     }
-    function doDrill(drills){  // 分析钻孔层
-        return drills.map(function(v){
-            if(v == "drill" || v=="rout"){
-                return {start:findSignal[1], end:findSignal[layerCount], layer:v.name}
-            } else {
-                var tmp = /(\d+)-(\d+)/ig.exec(v.tl_name);
-                if(tmp){
-                    var start = findSignal(tmp[1]); 
-                    var end = findSignal(tmp[2]); 
-                    return {start:start, end:end, layer:v.name}
-                } else {
-                    return 0;
-                }
-            }
-        })
-    }
-    var drillSetList = doDrill(drillLayer);   // 分析得到钻孔设置结果
-	drillSetList = drillSetList.filter(function(v){return v!==0})
-    drillSetList.forEach(function(v){
-        GEN.matrixLayerDrill({job:job,layer:v.layer,start:v.start ,end:v.end})
-    })
 }
-
-function reName(props) { // 改名 par{job:要改名的料号, rule: {要改名的规则}
-    var job = props.job
-	var matrix = props.matrix
-	var cfg = props.cfg
-	matrix = matrix.filter(function(v){return v.name != v.new_name})
-	var rename_list = matrix.map(function(item){
-		var new_name;
-		var tl_name = item.tl_name
-		var rule = item.rule
-		if(rule === tl_name){
-			new_name = item.new_name
-		} else {
-			var reg = new RegExp(rule,"ig")
-			var tmp = reg.exec(tl_name)
-			if(!tmp){return undefined}
-			var replaceArr = tmp.slice(1)
-			new_name = item.new_name
-			var params = {}
-			for(var i = 0; i<replaceArr.length;i++){
-				params["$"+(i+1)] = replaceArr[i]
-			}
-			replaceArr.forEach(function(v,i){
-				tl_name = tl_name.replace("($"+(i+1)+")",v)
+function analyJobFiles(props){
+	var files = props.jobFiles;
+	var config = props.config;
+	var job = props.job;
+	var custCfg = props.custCfg;
+	var rules = custCfg.rules;
+	var paramsFile = files.filter(function(file){return /param/ig.test(file.baseName)})
+	var tmp_hash = {}
+	paramsFile.forEach(function(file){
+		tmp_hash[file.baseName] = (function(){
+			var tmparr = fs.readFile(file.path).split("\n")
+			var tmp = {}
+			tmparr.map(function(v){
+				var arr = v.split(/\b\s+\b/)
+				tmp[arr[0].replace(/-/ig,"_")] = arr[1]
 			})
-			new_name = replaceTlName(new_name)
-			function replaceTlName(name){
-				var tmp = /(\([^)]*\))/ig.exec(name)
-				if(!tmp){ return name }
-				var param_arr = tmp[1].match(/\$\d+/ig)
-				var newname = tmp[1]
-				param_arr.forEach(function(v){
-					newname = newname.replace(new RegExp("\\"+v,"ig"), params[v])
-				})
-				newname = name.replace(tmp[1],eval(newname))
-				return replaceTlName(newname)
-			}
+			return tmp
+		})() 
+	})
+	
+	var fileInfo = files.reduce(function(a,file){
+		try {
+			rules.forEach(function(item){
+				if(item.valid({file:file, job:job})){
+					var format = config.formats[item.format]
+					var format1;
+					if(item.format_params){
+						format1 = item.format_params({params:tmp_hash})
+					}
+					if(format1){
+						throw {file:file,type:item.type,format:format1}
+					}else{
+						throw {file:file,type:item.type,format:format}
+					}
+				}
+			})
+		} catch (info) { 
+			a.push(info)
 		}
+		return a
+	},[])
+	var odbfiles = fileInfo.filter(function(item){return /odb/ig.test(item.type)})
+	if(odbfiles.length == 0){
 		return {
-			orig_name: item.name,
-			new_name: new_name
+			type: "Gerber",
+			data: fileInfo
 		}
-	})
-	rename_list = rename_list.filter(function(v){
-		var flag = true
-		if(!v){flag = false}
-		if(!v.orig_name || !v.new_name ){flag = false}
-		return flag
-	})
-	rename_list.forEach(function(v){
-        if(v.orig_name !== v.new_name){
-            GEN.renameLayer({job:job,layer:v.orig_name,new_name:v.new_name})
-        }
-    });
+	} else {
+		return {
+			type: "ODB",
+			data: odbfiles
+		}
+	}
 }
-
-function mergeDrill(props){ // 合并钻孔
-    var newdrills = []
-    var job = props.job;
-    var step = GEN.getStepList({job:job})[0];
-    var maxDrill = {name:"",value:0};
-    function getDrl(str){
-        var num = /(\d+)-(\d+)/ig.exec(str);  // 匹配出 num-num
-        var tmp = [];
-        for(var i = Number(num[1]);i<num[2];i++){
-            if(i == 1){
-                maxDrill = Number(num[2]) >  maxDrill.value? {name:str,value:Number(num[2])} : maxDrill;
-            }
-            tmp.push("L"+i+"-"+(i+1));
+function importJob(props,delSameJob){
+    var name = props.name
+    if (GEN.isJobExists({ job: name })) {
+        if (/^yes$/ig.test(delSameJob)) {
+            if(GEN.isJobOpen({ job: name })){ GEN.closeJob({ job: name }); }
+            GEN.deleteJob({ job: name });
         }
-        return tmp;
-    } 
-    var matrix = GEN.getMatrix({job:job});
-    GEN.openStep({job : job,name:step});
-    for(var key in matrix){
-        var val = matrix[key];
-        if(val.layer_type == "drill"){
-            var mergeTo = getDrl(val.name) // 要合并到的地方
-            mergeTo.forEach(function(layerName){
-                if(GEN.isLayerExists({job : job ,layer:layerName.toLowerCase()}) && newdrills.indexOf(layerName.toLowerCase()) < 0){
-                    GEN.deleteLayer({job:job, layer:layerName.toLowerCase()})
-                }
-                if(!GEN.isLayerExists({job : job ,layer:layerName.toLowerCase()})){
-                    GEN.createLayer({job:job,layer:layerName.toLowerCase(),conext:'board',type:val.layer_type});
-                    newdrills.push(layerName.toLowerCase())
-                }
-                GEN.workLayer({name:layerName.toLowerCase(),display_number:1,clear_before:'yes'});
-                GEN.copyLayer({source_job:job ,mode:'append',source_step:step,source_layer:val.name,dest_layer:layerName.toLowerCase()});
-            })
+        else {
+            return "job "+name+" exist";
         }
     }
-    // 合并到maxDrill独立合并
-    GEN.createLayer({job:job,layer:"b1-"+maxDrill.value,conext:'board',type:'drill'});
-    GEN.workLayer({name:"b1-"+maxDrill.value,display_number:1,clear_before:'yes'});
-    GEN.copyLayer({source_job:job ,mode:'append',source_step:step,source_layer:maxDrill.name,dest_layer:"b1-"+maxDrill.value});
-    GEN.affectedLayer({affected:"no",mode:"all"});
-    GEN.closeStep();
-    return this;
+    GEN.importJob(props);
 }
+
+
-- 
2.21.0